2013-06-26 34 views
5

Giả sử tôi là cục bộ trên chi nhánh master của kho lưu trữ may mắn của chúng tôi. Ai đó đã gửi yêu cầu kéo.Rebase một yêu cầu kéo GitHub trên đầu trang của các cam kết địa phương mới hơn của tôi

Làm cách nào để áp dụng các cam kết của yêu cầu kéo đó lên trên nhánh địa phương của tôi - như thể những cam kết đó đã được rebased trên nhánh của tôi - trong một lệnh duy nhất?

Lưu ý: yêu cầu kéo kéo dài vài ngày và chi nhánh địa phương của tôi có các cam kết mới kể từ khi yêu cầu kéo được tạo.

+0

Tôi cũng hỏi một [câu hỏi tương tự ở đây] (http://stackoverflow.com/questions/17182624/góp phần vào dự án-on-github-how-to-rebase-my-pull-request-on-top-of-mast) có thể giúp đỡ ai đó với cùng một vấn đề – fontno

Trả lời

6

Có một great blog post về đề tài này, từ Igor Zevaka

Trước tiên, bạn phải lấy ref yêu cầu kéo ẩn, và đặt nó dưới sự chi nhánh pr/NNN từ xa:

git fetch origin refs/pull/1234/head:refs/remotes/pr/1234 

(thay thế 1234 bằng kéo số yêu cầu)

Sau này, nó chỉ là một rebase cổ điển: kiểm tra yêu cầu kéo và rebase nó trên chi nhánh master của bạn:

git checkout pr/1234 
git rebase master 

hoặc cách khác

git rebase master pr/1234 

Bạn có thể dĩ nhiên nhìn thấy xung đột.

Hiện tại, yêu cầu kéo được rebased trên master và là nhánh hiện tại. Nếu bạn muốn cập nhật tổng thể chỉ kết hợp các yêu cầu kéo (chúng ta nói --ff-only bởi vì chúng tôi biết điều đó sẽ là một kết hợp nhanh về phía trước):

git checkout master 
git merge --ff-only pr/1234 

Để có một lớp lót một số răng cưa vỏ là cần thiết, nó chỉ là một vấn đề của kịch bản :)

+0

1. khi 'pr_1234' được chọn , làm 'git rebase master' sẽ rebase' pr_1234' trên 'master' (xem http://git-scm.com/docs/git-rebase) – CharlesB

+0

2.bởi vì tôi không chắc liệu một nhánh từ xa có dấu gạch chéo có thể được kiểm tra như hiện tại hay không, và bài đăng trên blog ban đầu theo cách này – CharlesB

+0

Tôi đã tránh xa git trong quá nhiều thời gian! tất nhiên sau khi rebase 'master' vẫn là tổ tiên của yêu cầu pull ... Tôi thích lệnh merge, trực quan hơn ngay cả khi kết quả giống nhau (tôi cũng upvoted một trong những câu trả lời của bạn) – CharlesB

1

OK, điều này một liner sẽ rebase cam kết của bạn trên đầu trang của các yêu cầu kéo (đó là nghịch đảo của những gì bạn muốn, xem câu trả lời khác của tôi):

git pull --rebase origin pull/NNN/head 

đâu NNN là số yêu cầu kéo. Điều này giả định origin là từ xa Github của bạn trên repo địa phương của bạn, và master được kiểm tra.

Explanation here trên blog của Douglas Stuarts: Github lưu trữ yêu cầu kéo từ các nhánh khác trong số origin repo của bạn, theo pull/NNN. Đây là những gì cho phép chạy pull --rebase trên đó.

+1

hah (/ tôi xóa câu trả lời) - Tôi không có mặt ở máy hôm qua để xác minh rằng công trình. Điều đó sẽ đặt "nhánh địa phương có các cam kết mới" trên đầu trang của các cam kết pr - nó không rõ ràng từ câu hỏi nếu đó là tốt hay không. +1. – AD7six

+1

Vâng, tôi không nghĩ đó là những gì OP đang tìm kiếm, nhưng nó là một câu trả lời thông minh. – jszakmeister

+0

Thực sự là nghịch đảo của những gì tôi muốn, nhưng thú vị bên lưu ý không có ít :) –

0

Install hub

# directly apply all commits from a pull request to the current branch 
$ git am -3 https://github.com/github/hub/pull/134 

TODO: cần phải tìm ra cách để buộc một --rebase

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