Tôi chỉ vừa mới blogged về chủ đề này:
Làm thế nào để chúng tôi tiếp tục chi nhánh tính năng này đến nay? Việc hợp nhất các cam kết ngược dòng mới là dễ dàng, nhưng bạn muốn tránh tạo một cam kết hợp nhất, vì điều đó sẽ không được đánh giá cao khi được đẩy lên thượng nguồn: sau đó bạn sẽ thực hiện lại các thay đổi ngược dòng và các cam kết ngược dòng sẽ nhận được một băm mới (khi họ có cha mẹ mới). Điều này đặc biệt quan trọng, vì những cam kết hợp nhất này sẽ được phản ánh trong yêu cầu kéo Github của bạn khi bạn đẩy các cập nhật đó vào nhánh tính năng github cá nhân của bạn (ngay cả khi bạn thực hiện điều đó sau khi bạn đưa ra yêu cầu kéo.)
Đó là lý do tại sao chúng ta cần để rebase thay vì hợp nhất:
git co devel #devel is ansible's HEAD aka "master" branch
git pull --rebase upstream devel
git co user-non-unique
git rebase devel
Cả tùy chọn rebase và lệnh rebase vào git sẽ giữ cho cây của bạn sạch sẽ và tránh hợp nhất commit. Nhưng hãy nhớ rằng đó là những cam kết đầu tiên của bạn (mà bạn đã đưa ra yêu cầu kéo đầu tiên) đang được rebased, và bây giờ có một hash mới, khác với các hash ban đầu vẫn nằm trong nhánh repo github từ xa của bạn .
Bây giờ, việc đẩy các bản cập nhật đó vào nhánh Github cá nhân của bạn sẽ không thành công ở đây, vì cả hai nhánh đều khác nhau: cây nhánh cục bộ và cây nhánh từ xa không đồng bộ. Git sẽ cho bạn biết lần đầu tiên git pull --rebase, sau đó nhấn lại, nhưng điều này sẽ không phải là một cú đẩy tiến nhanh đơn giản vì lịch sử của bạn đã được viết lại. Đừng làm thế!
Vấn đề ở đây là bạn sẽ tìm nạp lại các cam kết đã thay đổi đầu tiên của mình như ban đầu, và chúng sẽ được hợp nhất ở đầu nhánh địa phương của bạn. Do trạng thái không đồng bộ, thao tác kéo này không áp dụng một cách rõ ràng. Bạn sẽ nhận được lịch sử b0rken trong đó các lần commit của bạn xuất hiện hai lần. Khi bạn đẩy tất cả điều này vào nhánh tính năng github của bạn, những thay đổi đó sẽ được phản ánh trên yêu cầu kéo ban đầu, điều này sẽ rất, rất xấu.
AFAIK, thực sự không có giải pháp hoàn toàn sạch nào cho việc này.Giải pháp tốt nhất mà tôi tìm thấy là để buộc đẩy chi nhánh địa phương của bạn để chi nhánh github của bạn (thực sự buộc một bản cập nhật phi nhanh orward):
Theo git-push (1):
Update the origin repository’s remote branch with local branch, allowing non-fast-forward updates. This can leave unreferenced commits dangling in the origin repository.
Vì vậy, don 't kéo, chỉ cần buộc đẩy như thế này:
git push svg +user-non-unique
hay:
git push svg user-non-unique --force
Điều này sẽ thực sự rõ ràng overwrit e chi nhánh từ xa của bạn, với tất cả mọi thứ trong chi nhánh địa phương của bạn. Các cam kết trong luồng từ xa (và gây ra lỗi) sẽ vẫn ở đó, nhưng sẽ là cam kết lơ lửng, mà cuối cùng sẽ bị xóa bởi git-gc (1). Không phải vấn đề lớn.
Như tôi đã nói, đây là giải pháp sạch nhất của AFAICS. Nhược điểm của điều này, là PR của bạn sẽ được cập nhật với những cam kết mới nhất, mà sẽ nhận được một ngày sau đó, và có thể xuất hiện không đồng bộ trong lịch sử bình luận của PR. Không có vấn đề lớn, nhưng có khả năng có thể gây nhầm lẫn.
Một số người đến đây có thể thấy điều này phù hợp với kịch bản của họ tốt hơn: http://stackoverflow.com/questions/9790448/how-to-update-a-pull-request – AaronLS
Tôi cũng tìm thấy phiên bản này của câu hỏi/câu trả lời rõ ràng hơn: http://stackoverflow.com/questions/7947322/preferred-github-workflow-for-updating-a-pull-request-after-code-review?rq=1 –