Git chuyển tiếp nhanh VS không hợp nhất chuyển tiếp nhanh


247

Hợp nhất Git cho phép chúng tôi thực hiện chuyển tiếp nhanh và không sáp nhập nhánh nhanh nhanh. Bất kỳ ý tưởng nào khi sử dụng hợp nhất chuyển tiếp nhanh và khi nào không sử dụng hợp nhất chuyển tiếp nhanh?



2
Tôi nghĩ rằng một viễn cảnh thực sự tốt khác có thể được tìm thấy ở đây endoflineblog.com/gitflow-considered-harmful
Dmitry Minkovsky

Câu trả lời:


290

Các --no-fftùy chọn rất hữu ích khi bạn muốn có một khái niệm rõ ràng về chi nhánh tính năng của bạn. Vì vậy, ngay cả khi trong thời gian đó không có cam kết nào được thực hiện, FF vẫn có thể - đôi khi bạn vẫn muốn có mỗi cam kết trong dòng chính tương ứng với một tính năng. Vì vậy, bạn coi một nhánh tính năng với một loạt các xác nhận là một đơn vị và hợp nhất chúng thành một đơn vị. Rõ ràng từ lịch sử của bạn khi bạn thực hiện tính năng hợp nhất chi nhánh --no-ff.

Nếu bạn không quan tâm đến điều đó - bạn có thể thoát khỏi FF bất cứ khi nào có thể. Do đó, bạn sẽ có cảm giác giống như svn của quy trình làm việc.

Ví dụ, tác giả của bài viết này nghĩ rằng--no-ff tùy chọn phải được mặc định và lý luận của anh ta gần với lý do tôi đã nêu ở trên:

Hãy xem xét tình huống trong đó một loạt các cam kết nhỏ trên nhánh "tính năng" tạo thành một tính năng mới: Nếu bạn chỉ thực hiện "git merge Feature_branch" mà không có --no-ff", không thể thấy trong lịch sử Git mà các đối tượng cam kết cùng có đã triển khai một tính năng mà bạn sẽ phải đọc thủ công tất cả các thông điệp tường trình. Hoàn nguyên toàn bộ tính năng (nghĩa là một nhóm cam kết), là một vấn đề đau đầu thực sự [nếu --no-ffkhông được sử dụng], trong khi nó được thực hiện dễ dàng nếu --no-ffcờ được sử dụng [vì nó chỉ là một cam kết]. "

Đồ họa hiển thị cách --no-ff nhóm cùng nhau tất cả các cam kết từ nhánh tính năng thành một cam kết trên nhánh chính


3
Và chuyển tiếp nhanh là tuyệt vời khi bạn có một bộ sưu tập các chi nhánh liên quan chặt chẽ mà bây giờ và sau đó bạn muốn di chuyển cùng nhau. Không phải tất cả các sự hợp nhất là sự kiện lịch sử có thật.
Cascabel

3
Tại sao phải duy trì vài chi nhánh? Nếu chúng liên quan chặt chẽ - tại sao không làm mọi thứ trên một nhánh?
Ivan Danilov

11
Liên quan chặt chẽ không có nghĩa là giống hệt nhau. Bên cạnh đó, quy trình làm việc không phải lúc nào cũng gọn gàng. Bạn không phải lúc nào cũng thực hiện các cam kết mà bạn nghĩ rằng bạn sẽ đến, bạn không luôn luôn phân nhánh từ nơi tốt nhất. Có thể bạn bắt đầu một vài tính năng từ một nơi, bắt đầu làm việc với một trong số chúng, nhận ra đó là tính năng chung và chuyển nhanh tính năng khác sang tính năng đó trước khi chuyển hướng.
Cascabel

2
Đối với câu trả lời đầu tiên, sự hiểu biết của tôi là OP muốn biết các thực tiễn tốt nhất để làm theo. Mọi thứ xảy ra và không phải mọi thứ đều lý tưởng nhưng điều này có vẻ giống như một số thỏa hiệp bắt buộc.
Ivan Danilov

1
Điều đáng chú ý là những lợi ích của --no-fflịch sử cam kết của bạn có thể không rõ ràng ngay lập tức khi sử dụng các công cụ cơ bản như git log, sẽ tiếp tục hiển thị tất cả các cam kết từ tất cả các chi nhánh đã được sáp nhập vào chi nhánh hiện tại của bạn. Điều đó nói rằng, các lợi ích trở nên rõ ràng hơn khi sử dụng, ví dụ như git log --first-parenttrên một nhánh tích hợp như develophoặc master. Nếu bạn sử dụng một cách tôn giáo --no-ffthì điều đó sẽ hiển thị độc quyền các yêu cầu hợp nhất, trong khi git logvẫn sẽ cung cấp một lịch sử toàn diện (hơn). Đó là lý do Vincent khuyên dùng nó với GitFlow .
Jeremy Caney

12

Tôi có thể đưa ra một ví dụ thường thấy trong dự án.

Ở đây, tùy chọn --no-ff(nghĩa là hợp nhất thực sự ) tạo ra một cam kết mới với nhiều phụ huynh và cung cấp theo dõi lịch sử tốt hơn. Mặt khác, --ff(tức là hợp nhất chuyển tiếp nhanh ) theo mặc định.

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) Lưu ý rằng ở đây nếu newFeaturenhánh được sử dụng lại, thay vì tạo một nhánh mới, git sẽ phải thực hiện --no-ffhợp nhất bằng mọi cách. Điều này có nghĩa là hợp nhất chuyển tiếp nhanh không phải lúc nào cũng đủ điều kiện.


6

Khi chúng tôi làm việc trên môi trường phát triển và hợp nhất mã của chúng tôi với nhánh dàn / sản xuất thì Git không chuyển tiếp nhanh có thể là một lựa chọn tốt hơn. Thông thường khi chúng ta làm việc trong nhánh phát triển cho một tính năng, chúng ta có xu hướng có nhiều cam kết. Theo dõi thay đổi với nhiều lần xác nhận có thể gây bất tiện về sau. Nếu chúng ta hợp nhất với nhánh dàn / sản xuất bằng Git không chuyển tiếp nhanh thì nó sẽ chỉ có 1 cam kết. Bây giờ bất cứ lúc nào chúng tôi muốn hoàn nguyên tính năng, chỉ cần hoàn nguyên cam kết đó. Cuộc sống thật dễ dàng.


0

Cũng có thể là người ta có thể muốn có các nhánh tính năng được cá nhân hóa nơi mã được đặt vào cuối ngày. Điều đó cho phép theo dõi sự phát triển chi tiết hơn.

Tôi sẽ không muốn làm ô nhiễm sự phát triển tổng thể với mã không hoạt động, do đó, làm - không-có thể chỉ là những gì người ta đang tìm kiếm.

Là một lưu ý phụ, có thể không cần thiết phải cam kết mã làm việc trên một nhánh được cá nhân hóa, vì lịch sử có thể được viết lại git rebase -ivà bắt buộc trên máy chủ miễn là không có ai làm việc trên cùng nhánh đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.