2011-08-24 19 views
37

Tôi đang sử dụng mô hình phân nhánh "Git Flow", với nhánh chính và nhánh phát triển. Tôi đang làm việc trên một bản phát hành mới lớn, do đó nhánh phát triển của tôi cực kỳ khác với nhánh chính của tôi. Điều này tạo ra một vấn đề bất cứ lúc nào tôi cần phải thực hiện một hotfix trên nhánh chính và hợp nhất nó trở lại vào phát triển. Hầu như luôn luôn có mâu thuẫn, và nó trở thành một nỗi đau thực sự.Quản lý hotfix khi phát triển nhánh là rất khác với bản gốc?

Cách tốt nhất để quản lý điều này là gì? Nó sẽ được dễ dàng hơn cho tôi để làm cho các hotfix nhỏ thay đổi về phát triển bằng tay và sau đó hợp nhất tất cả mọi thứ thành thạo khi tôi đã sẵn sàng mà không sáp nhập master trở lại vào phát triển. Điều này có thể không?

+1

Bạn đã cân nhắc [chọn dâu] ​​(http://technosophos.com/content/git-cherry-picking-move-small-code-patches-across-branches) thay vì hợp nhất 'master' thành' phát triển' ? –

+0

Theo mặc định, với một hợp nhất FF không, nếu bạn kéo phát triển thành master, mẹo phát triển sẽ không có thay đổi chính, nhưng master sẽ có những thay đổi phát triển. Đó là điều bạn muốn? – Andy

+0

@Andy - về cơ bản tôi chỉ muốn thay thế chủ nhân bằng phát triển. Tôi không muốn nó phàn nàn về những thay đổi chính không được sáp nhập vào phát triển, v.v. – TaylorOtwell

Trả lời

5

Quy trình chung của tôi cho tình huống này là tạo chi nhánh bug-fix của master để khắc phục sự cố. Khi đã sẵn sàng, hãy hợp nhất lại thành master rồi hợp nhất master vào develop.

Điều này giả định rằng sửa lỗi của bạn gần như là một một đối một giữa mã nó cần phải thay đổi trong cả hai nhánh. Nếu đúng như vậy, bạn luôn có thể thử một số git merge -s ours master (xem man-page) thành develop để chi nhánh develop được ưu tiên.

Tôi sử dụng quy trình tương tự để quản lý các bản sửa lỗi trong dự án nguồn mở mà tôi đang làm việc. master luôn đi trước nơi sửa lỗi cần được áp dụng, vì vậy tôi tạo một chi nhánh từ thẻ cần sửa chữa, áp dụng sửa chữa và giải phóng, sau đó gắn thẻ lại và hợp nhất thẻ mới vào master. Điều này gây ra xung đột vì số phiên bản, nhưng có thể tránh được bằng lệnh trên.

Hy vọng điều đó sẽ hữu ích.

+0

tại sao không phải 'git merge -s của chúng tôi hotfix-2.2' trong đó 2.2 là thứ tôi tạo ra – basarat

37

Cách đơn giản nhất để nhận một số cam kết từ chi nhánh này sang chi nhánh khác là cherry-picking.

Giả sử rằng sửa chữa của bạn trong master có băm HASH cam kết và bạn muốn lấy hotfix đó vào chi nhánh devel của bạn, làm một git checkout devel theo sau là một git cherry-pick HASH. Đó là nó.

Nếu bạn muốn đi tất cả thay đổi từ master vào devel, bạn có thể đạt được điều đó với

git checkout devel 
git rebase master 

Nếu bạn có kịch bản ngược lại (bạn thực hiện một hotfix quá trình phát triển trong một chi nhánh devel và muốn sửa lỗi đó thành master trước khi devel được hợp nhất hoàn toàn thành master), quy trình làm việc khá giống nhau. Giả sử rằng các hotfix có băm HOTFIX_HASH, làm điều này:

git checkout master 
git cherry-pick HOTFIX_HASH 

Bây giờ, các cam kết hiện diện trong masterdevel. Để giải quyết vấn đề này, hãy nhập

git checkout devel 
git rebase master 

và cam kết sẽ biến mất khỏi devel vì nó đã có mặt trong master.

+5

Xin lưu ý rằng' git cherry-pick' tạo ra một cam kết khác. Việc hợp nhất sau đó của nhánh 'devel' vào' master' sẽ bị mâu thuẫn vì điều đó. Giải pháp này chỉ thích hợp cho 'quy trình làm việc rebase'. –

+2

Như ngụ ý của @IvanBorisenko, nếu bạn đang làm việc trên devel với bất cứ ai khác bạn sẽ muốn 'git merge master' thay vì rebase để tránh viết lại lịch sử. Trong kịch bản thứ hai, sau đó sẽ có xung đột hợp nhất để giải quyết. – gsf

+0

Tôi có cần nhấn để làm chủ trước khi đưa ra lệnh 'checkout' và' cherry-pick' không? –

3

Tôi thường theo dõi số này guide phù hợp với hầu hết các trường hợp và tránh thị trưởng các vấn đề có xung đột và thay đổi lớn.

Nếu bạn có thể làm việc trên feature chi nhánh và hợp nhất chúng trong development chỉ trước một tạo vật chi nhánh release (có nghĩa là bạn đang thực sự chuẩn bị phát hành) ... phương pháp này nên tránh hầu hết các hợp xung đột cho bạn kinh nghiệm.

Kể từ khi thay đổi đột ngột xảy ra tại chi nhánh feature-breaking, bạn chỉ có thể có xung đột một lần tại thời điểm chi nhánh feature-breaking này được hợp nhất vào phát triển. Và bạn cũng có thể hợp nhất development vào chi nhánh release bất kỳ lúc nào để luôn cập nhật.

Bạn cũng sẽ được làm mát bằng cách hợp nhất thành development tất cả các hotfix-branch es bạn có tối thiểu hoặc không xung đột chút nào.

Hướng dẫn tôi đã chia sẻ trên liên kết trước khi chú trọng lớn vào việc không bao giờ hợp nhất từ ​​development đến master hoặc ngược. Luôn xử lý bản phát hành của bạn thông qua chi nhánh release.

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