2011-07-14 27 views
161

Hợp nhất Git cho phép chúng tôi tiến nhanh về phía trước và không có quá trình hợp nhất chi nhánh nhanh về phía trước. Bất kỳ ý tưởng nào khi sử dụng tính năng hợp nhất chuyển tiếp nhanh và khi nào thì không sử dụng tính năng hợp nhất chuyển tiếp nhanh?Chuyển tiếp nhanh Git VS không hợp nhất nhanh về phía trước

+9

http://stackoverflow.com/questions/2850369/why-uses-git-fast-forward-merging-per-default/2850413#2850413 trợ giúp? – VonC

+0

Tôi nghĩ rằng một quan điểm thực sự tốt khác có thể được tìm thấy ở đây http://endoflineblog.com/gitflow-considered-harmful –

+0

Cùng một câu hỏi? http://stackoverflow.com/questions/9069061/ –

Trả lời

177

Tùy chọn --no-ff hữu ích khi bạn muốn có khái niệm rõ ràng về chi nhánh tính năng của mình. Vì vậy, ngay cả khi trong khi chờ đợi không có cam kết, FF là có thể - bạn vẫn muốn đôi khi 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 xử lý một chi nhánh tính năng với một loạt các cam kết như một đơn vị duy nhất và hợp nhất chúng thành một đơn vị duy nhất. Đó là rõ ràng từ lịch sử của bạn khi bạn làm tính năng sáp nhập chi nhánh với --no-ff.

Nếu bạn không quan tâm về điều đó - bạn có thể có thể lấy đi với FF bất cứ khi nào có thể. Vì vậy, bạn sẽ có cảm giác giống như svn hơn về công việc.

Ví dụ, tác giả của article này cho rằng --no-ff lựa chọn nên là mặc định và lập luận của ông gần mà tôi nêu ở trên:

Hãy xem xét tình hình nơi một loạt các cam kết nhỏ trên "tính năng" chi nhánh chung tạo một tính năng mới: Nếu bạn chỉ cần "git merge feature_branch" không có --no-ff, "không thể nhìn thấy từ lịch sử Git mà các đối tượng commit cùng nhau đã thực hiện một tính năng - bạn sẽ phải đọc tất cả các thông điệp tường trình. Hoàn nguyên toàn bộ tính năng (tức là một nhóm cam kết), là một nhức đầu thực sự [nếu --no-ff không được sử dụng], trong khi nó được thực hiện dễ dàng nếu cờ --no-ff được sử dụng [vì nó là j chúng tôi một cam kết]. "

Graphic showing how --no-ff groups together all commits from feature branch into one commit on master branch

+1

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

+1

Tại sao duy trì một số chi nhánh sau đó? 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 đơn lẻ? –

+6

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ẽ làm, bạn không phải lúc nào cũng chi nhánh từ nơi tốt nhất. Có lẽ 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 trên một trong số họ, nhận ra nó là chung chung, và nhanh chóng chuyển tiếp một trong những khác với nó trước khi phân kỳ. – Cascabel

0

Có thể cũng là người ta có thể muốn có các ngành chức năng cá nhân nơi mã chỉ đượ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 gây ô nhiễm phát triển chính với mã không hoạt động, do đó làm --no-ff có thể chỉ là những gì người ta đang tìm kiếm.

Như một lưu ý phụ, có thể không cần phải thực thi 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 -i và buộc trên máy chủ miễn là không có ai khác đang làm việc trên cùng một chi nhánh đó.

0

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

Ở đây, --no-ff (ví dụ: true merge) tạo một cam kết mới với nhiều bậc cha mẹ và cung cấp theo dõi lịch sử tốt hơn. Nếu không, --ff (ví dụ: fast-forward merge) 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 'finish the feature'  // => commit created at merge with proper message 
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 chi nhánh newFeature được tái sử dụng, thay vì tạo ra một chi nhánh mới, git sẽ phải làm việc kết hợp với --no-ff anyway. Điều này có nghĩa là hợp nhất chuyển tiếp nhanh không đủ điều kiện.

Các vấn đề liên quan