2010-07-02 32 views
41

Tôi đã được làm việc trong đường thẳng:git: làm thế nào để di chuyển một số cam kết với chi nhánh mới

A---B---C---D---E---F (master:HEAD) 

Bây giờ tôi muốn chuyển ngược:

git checkout C 

và di chuyển vài cam kết cuối cùng để một mới Chi nhánh:

Lựa chọn 1:

  D---E---F (new:HEAD) 
     /
A---B---C (master) 

Tùy chọn 2:

  F (new:HEAD) 
     /
A---B---C (master) 

Làm cách nào để chuyển sang tùy chọn 1 và cách tùy chọn 2?

Trả lời

70

Để nhận được từ sơ đồ của bạn đầu tiên (master = ĐẦU = F) để lựa chọn 1:

git branch new  # Make a 'new' branch pointing at HEAD, which is F 
git reset --hard C # Move master back to point at C 
git checkout new  # Make HEAD follow new, and get F in the working tree 

Và từ tùy chọn từ 1 tới phương án 2 (chọn lên nơi trên trái off),

git rebase -i master # Start the process of re-jiggering this branch 
# edit the commit list that opens up to only include F 
# save and exit 
# resolve potential conflicts from missing changes in D and E 

Để truy cập trực tiếp từ điểm bắt đầu của bạn đến tùy chọn 2:

git checkout -b new C # Start the 'new' branch at C 
git cherry-pick F  # Include F on it 
git checkout master # Switch back to master 
git reset --hard C  # Rewind master to the earlier commit 
+2

Cảm ơn câu trả lời chi tiết này. – takeshin

+1

Cảm ơn :) Ngoài ra, +1 cho "tái kích hoạt"! – dokkaebi

+3

Nếu bạn gặp lỗi "Bản cập nhật đã bị từ chối bởi vì đầu của nhánh hiện tại của bạn nằm phía sau đối tác từ xa" khi cố đẩy chủ, bạn cần sử dụng tùy chọn --force: 'git push --force origin master' – Tamlyn

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