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?
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?
Câu trả lời:
Các --no-ff
tù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-ff
không được sử dụng], trong khi nó được thực hiện dễ dàng nếu --no-ff
cờ được sử dụng [vì nó chỉ là một cam kết]. "
--no-ff
lị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-parent
trên một nhánh tích hợp như develop
hoặc master
. Nếu bạn sử dụng một cách tôn giáo --no-ff
thì điều đó sẽ hiển thị độc quyền các yêu cầu hợp nhất, trong khi git log
vẫ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 .
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 newFeature
nhá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-ff
hợ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.
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.
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 -i
và 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 đó.