2013-06-24 25 views
5

Câu hỏi đặt ra là về một số trường hợp mép git-flow phương phápgit-dòng chảy: Làm thế nào để ngăn chặn một số thay đổi thực hiện tại chi nhánh phát hành từ việc sáp nhập trở lại để phát triển

Tôi có một số loại lịch sử git-dòng chảy điển hình như thế này:

 o---o---o---o [release-3.5.0] 
    /
----o---o---o---o---o [development] 

Git dòng nói với chúng tôi để hợp nhất release-3.5.0 chi nhánh thành phát triển sau đó phát hành đã sẵn sàng. Vì vậy, cuối cùng, chúng tôi sẽ nhận được TẤT CẢ các thay đổi, được thực hiện tại chi nhánh phát hành vào chi nhánh phát triển.

 o---o---o---o 
    /   \ 
----o---o---o---o---o [development] 

Bây giờ tưởng tượng, chúng ta có một cam kết 'X' trên chi nhánh phát hành những gì chúng ta KHÔNG muốn tại chi nhánh phát triển, ví dụ như nó là một số loại hack/hotfix hoặc khác mà đã được cố định trong sự phát triển trong cách lành mạnh hơn (tức là bởi cam kết Y)

 o---X---o---o [release-3.5.0] 
    /
----o---o---o---Y---o [development] 

Vì vậy, câu hỏi chính là làm thế nào để đối phó với các tình huống như vậy? Làm thế nào để ngăn chặn cam kết này (hoặc cam kết) từ việc trở lại phát triển?

+0

có thể trùng lặp của [git - bỏ qua các cam kết cụ thể khi sáp nhập] (http : // stackoverflow.com/questions/727994/git-skipping-specific-commits-khi-merging) – Lu55

Trả lời

7

Trong khi câu trả lời kiến ​​nghị rebase và/hoặc sáp nhập/phục hồi/bóng squash sẽ làm việc, cá nhân tôi nghĩ câu trả lời tốt hơn sẽ là:

git checkout development 
git merge --no-commit release-3.5.0 
# make whatever changes you need to fixup the "hack" and/or clean up any conflicts 
git commit 
+0

'--no-commit' không tạo 'thông tin hợp nhất'. Phát hành chi nhánh sẽ không được hiển thị trong lịch sử như sáp nhập, không phải nó sẽ được xử lý như sáp nhập bằng lệnh như 'git branch --merged'. Vì vậy, người ta có thể vô tình hợp nhất nó một lần nữa do nhầm lẫn. – Olegas

+2

@Olegas Trong khi nhận xét của bạn về mặt kỹ thuật chính xác, hãy làm theo quy trình hoàn thành ở trên * sẽ * tạo "thông tin hợp nhất" (giả sử rằng bạn có nghĩa là một số kết hợp của thông báo cam kết được hợp nhất và/hoặc con trỏ mẹ tạo hợp nhất trong DAG), nhưng nó là 'git commit' cuối cùng tạo ra chúng. 'Git merge --no-commit' chỉ thiết lập mọi thứ để dữ liệu meta thích hợp sẽ được tạo. Nếu bạn thử 'git branch --merged' trước' git commit' cuối cùng, nó sẽ hiển thị chính xác nhánh chưa được hợp nhất, bởi vì sự hợp nhất chưa được cam kết ... – twalberg

+1

vâng, bạn nói đúng. Sau khi cam kết tất cả là tốt, bao gồm cả thông tin hợp nhất, tôi đã sai. – Olegas

1

Bạn có một vài lựa chọn:

1) sử dụng git rebase -i

Trong chế độ này bạn có thể rebase chi nhánh phát hành của bạn trên chi nhánh phát triển của bạn và không bao gồm các khóa X, kỳ cam kết.

Cảnh báo Bạn sẽ gây rối cho kho lưu trữ nhân bản hiện có trong trường hợp này.

2) sử dụng git cherry-pick

Trong chế độ này, bạn sẽ có khả năng để chọn cam kết từng cái một.

3) sử dụng git rebase -i trên một nhánh riêng biệt và hợp nhất nó sau đó, theo quy định tại câu trả lời này: Is it possible to exclude specific commits when doing a git merge?

+0

'rebase' không phù hợp với nguyên nhân 'cảnh báo bạn đã lưu ý,' cherry-pick' là chấp nhận được nhưng quá phức tạp khiến 'nhánh phát hành tôi cũng có nhiều cam kết (nhưng nó có thể được tự động bằng cách nào đó). – Olegas

+1

cherry-pick thực sự cho phép chọn một loạt các cam kết (http://stackoverflow.com/a/1994491/696792), nhưng điều này bao gồm một số vấn đề quá (được xác định trong câu trả lời liên kết) – StKiller

+0

Cập nhật câu trả lời theo cách thứ ba. – StKiller

2

Trong tình huống như vậy, bạn luôn muốn kết hợp đầy đủ các -like) chi nhánh (phát hành. Vì vậy, hãy chắc chắn không có gì là mất tích.

Nhưng trong quá trình hợp nhất, bạn có thể tự do sửa đổi nội dung - bao gồm thả hoặc làm lại một số thay đổi. Đối với trường hợp ví dụ của bạn, hãy hợp nhất nhánh, hoàn nguyên cam kết bạn không thích và bíp quay trở lại cam kết hợp nhất. Rõ ràng là thực hiện một lưu ý trong thông điệp cam kết hợp nhất của hành động đó.

Nếu sửa chữa đã được phát triển, hợp nhất sẽ chỉ bỏ qua nó, hoặc bạn giải quyết xung đột bằng cách chọn phiên bản devel.

Vấn đề là bạn muốn hiển thị lịch sử làm hình thứ hai của mình và trạng thái như ý nghĩa nhất.

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