github: Thêm cam kết vào yêu cầu kéo hiện tại


89

Tôi đã mở một yêu cầu kéo để rails repo trên github bằng cách sử dụng nút Fork & Edit tệp tệp này .

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

$ git clone git@github.com: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 hoạt động tốt nhưng có vẻ như một quy trình làm việc 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 làm điều này có đúng cách không? nếu không, thì cách thích hợp để làm điều này là gì?


4
Một số đến đây có thể tìm thấy điều này phù hợp với kịch bản của họ tốt hơn: stackoverflow.com/questions/9790448/...
AaronLS

4
Tôi cũng thấy phiên bản này của câu hỏi / câu trả lời rõ ràng hơn: stackoverflow.com/questions/7947322/…
Ben Wheeler

Câu trả lời:


63

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


10

Tôi vừa mới viết blog về chủ đề này:

Làm cách nào để chúng tôi giữ cho nhánh tính năng này được cập nhật? Việc hợp nhất các cam kết ngược dòng mới nhất rất 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 ngược dòng: sau đó bạn đang thực hiện lại hiệu quả các thay đổi ngược dòng và những cam kết ngược dòng đó sẽ nhận được một hàm 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 đó sẽ được phản ánh trong yêu cầu kéo GitHub của bạn khi bạn đẩy những cập nhật đó lên nhánh tính năng GitHub cá nhân của mình (ngay cả khi bạn làm điều đó sau khi đư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 thành git sẽ giữ cho cây của bạn sạch sẽ và tránh có các cam kết hợp nhất. 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 của mình) đang được khôi phục và hiện có một băm cam kết mới, khác với những băm 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 đó ra nhánh tính năng 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ộ”, do các băm cam kết khác nhau. Git sẽ yêu cầu bạn thực hiện trước git pull --rebase, sau đó đẩy lại, nhưng đây không phải là một động tác tua nhanh đơn giản, vì lịch sử của bạn đã được viết lại. Đừng làm vậy!

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à các cam kết đó sẽ được hợp nhất trên đầu chi nhánh địa phương của bạn. Do trạng thái không đồng bộ, kéo này không áp dụng một cách rõ ràng. Bạn sẽ nhận được một lịch sử hỏng trong đó cam kết của bạn xuất hiện hai lần. Khi bạn đẩy tất cả những thứ này sang nhánh tính năng GitHub của mình, những thay đổi đó sẽ được phản ánh trên yêu cầu kéo ban đầu, điều này sẽ trở nên rất rất xấu.

AFAIK, thực sự không có giải pháp nào hoàn toàn sạch 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 cục bộ của bạn đến chi nhánh GitHub của bạn (thực sự buộc cập nhật không tua đi nhanh):

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, không kéo, chỉ cần đẩy như thế này:

git push svg +user-non-unique

hoặc là:

git push svg user-non-unique --force

Điều này thực sự sẽ ghi đè rõ ràng chi nhánh từ xa của bạn, với mọi thứ trong chi nhánh cục bộ của bạn. Các cam kết nằm trong luồng từ xa (và đã gây ra lỗi) sẽ vẫn ở đó, nhưng sẽ là các cam kết lơ lửng, 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, AFAICS là giải pháp sạch nhất. 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 đó, sẽ 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 nó có thể gây nhầm lẫn.


5

Bạn cũng có thể tạo một yêu cầu kéo mới được liên kết với masterthay vì một abc1234bản sửa đổi cụ thể .

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


3

Vâng - bạn đang làm nhiều việc hơn bạn cần. Chỉ cần thực hiện một cam kết bổ sung và sau đó ép buộc. Bạn sẽ thấy cam kết ban đầu cũng như sau đó mới được đẩy khi bạn làm mới github trong trình duyệt của mình.

$ git commit -m "These changes are in response to PR comments"
$ git push -f origin HEAD

đây là cách dễ nhất và thẳng thắn nhất, không chắc chắn tại sao nó không phải là câu trả lời hàng đầu
Banjo Obayomi
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.