2009-06-10 28 views
35

Tôi vô tình thực hiện 10 cam kết trên nhánh "kiểm tra" khi tôi định cam kết chúng trên nhánh "master". Các cam kết khác trên nhánh "testing" là rác, vì vậy tôi không muốn hợp nhất nó với "master". Thay vào đó, tôi chỉ muốn phát lại 10 commit mới nhất trên master.Phát lại Nit cam kết cuối cùng trên một chi nhánh khác

Trả lời

16
  1. git checkout chủ
  2. git whatchanged thử nghiệm
  3. git cherry-pick _________

?

+5

Chỉ cần một fyi - cherry-pick sẽ chỉ thực hiện một cam kết tại một thời điểm, vì vậy bạn sẽ phải thử nghiệm cherry-picket ~ 9 sau đó thử nghiệm ~ 8 rồi ... thử nghiệm. Đó là lý do tại sao tôi thích cách tiếp cận rebase mà Talljoe gợi ý ... tất nhiên kết quả là như nhau. Trong thực tế, nếu bạn thực hiện rebase tương tác, git sẽ thực sự sử dụng lựa chọn cherry dưới mui xe. –

+9

@PatNotz 'git cherry-pick' hiện có thể thực hiện nhiều lần commit (ví dụ:' git cherry-pick testing ~ 10..testing'). –

+0

Bạn không bao giờ nên sử dụng 'cherry-pick'. Đọc [bài viết này] (http://www.draconianoverlord.com/2013/09/07/no-cherry-picking.html) để biết thêm thông tin. – Tim

80

Việc rebase nên thực hiện.

git rebase -p --onto master testing~10 testing 

Điều này sẽ sao chép mười lần thử nghiệm cuối cùng để kiểm tra và làm cho thử nghiệm mới (thử nghiệm cũ sẽ là trẻ mồ côi). Sau đó, bạn có thể hợp nhất tổng thể để thử nghiệm dưới dạng tua đi nhanh.

git checkout master 
git merge testing 
+0

Đã sử dụng câu trả lời của Ron trước khi đăng. –

+8

Có thể đáng chú ý rằng điều này lá kiểm tra tại cùng một điểm như chủ, để lại các 'rác' cam kết mồ côi. Điều này có thể hoặc có thể không phải là một điều tốt. Một khả năng khác sẽ là git checkout master; git reset --hard testing; git rebase --onto HEAD @ {1} HEAD ~ 10 –

+0

@CharlesBailey Bạn đang định nhấn git flog gì? – Fredrick

2

Như đã nói trong ý kiến, câu trả lời -inspired rebasebỏ rơi 'rác' cam mồ côi.

Chỉ cần sử dụng các công cụ đơn giản:

git checkout master 
git merge testing 
git checkout testing 
git reset --hard HEAD~10 # Go back 10 commits (*1) 
git checkout master 

(* 1) Bạn chỉ có "mất" cam kết từ các chi nhánh testing, vì bạn sẽ có những cam kết trong master nhờ vào merge.

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