2012-04-13 44 views
67

Tôi đã mở yêu cầu kéo đến rails repo trên github bằng cách sử dụng Ngã ba & Chỉnh sửa tệp này nút tệp.github: Thêm cam kết vào yêu cầu kéo hiện tại

Bây giờ, Sau khi nhận được phản hồi về PR của tôi, tôi muốn thêm một số cam kết khác. vì vậy, đây là những gì tôi đã kết thúc bằng cách thực hiện

$ git clone [email protected]:gaurish/rails.git #my forked repo 
$ git rebase -i 785a2e5 #commit hash of my commit using which PR was opened 
$ git checkout patch-3 #branch name I had to send my commits under to be shown in that PR 
$ git commit -am "Changes done as per feedback" 
$ git push origin patch-3 

Điều này làm việc tốt nhưng có vẻ khá phức tạp. Có lẽ tôi sai một cái gì đó sai ở đây?

câu hỏi của tôi là: Tôi có làm đúng cách này không? nếu không, thì cách thích hợp để làm điều này là gì?

+3

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

+3

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 –

Trả lời

45

Vì bạn đang sử dụng các công cụ GitHub và chỉ cần thay đổi một tập tin, bạn cũng browse to the file trên GitHub có thể, chọn ngành phù hợp từ góc trên bên trái theo "cây:" thả xuống (patch-3 trong trường hợp của bạn), và bây giờ chọn "Chỉnh sửa tệp này". Bây giờ thay đổi của bạn sẽ được cam kết chi nhánh này và sẽ hiển thị trong yêu cầu kéo của bạn

+0

tuyệt vời, cảm ơn. – Magne

4

Bạn cũng có thể tạo yêu cầu kéo mới liên kết với master thay vì sửa đổi abc1234 cụ thể.

Bằng cách đó, mọi cam kết/đẩy mới vào kho lưu trữ của bạn sẽ được thêm vào yêu cầu kéo.

7

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.

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