2013-10-31 14 views
18

chi nhánh của tôi là:git rebase: sao chép thay vì di chuyển

o---o support.2013.16 
    \ 
     o---o---o---o---o master 
         \ 
         o---o---o hotfix/A 

tôi cần phải sao chép hotfix/A đến support.2013.16. Tôi biết việc hái hoa anh đào, nhưng bạn có thể làm điều gì đó như

git rebase --onto support.2013.16 master hotfix/A 

nhưng không cần phải di chuyển nhánh mà sao chép?

+5

Bạn có thể sử dụng 'git checkout -b 'đầu tiên để tạo ra các tên chi nhánh mới, sau đó sử dụng rebase. Chi nhánh 'hotfix/A' ban đầu sẽ không thay đổi. – qqx

Trả lời

35

Git rebase thực sự sao chép nhánh gốc sang nhánh mới; nhưng bởi vì nó di chuyển đầu nhánh, nó cảm thấy giống như một di chuyển chứ không phải là một bản sao. Nếu bạn đã sử dụng git branch để thêm một nhánh chi nhánh bổ sung vào chi nhánh ban đầu, bạn vẫn sẽ có quyền truy cập dễ dàng vào chi nhánh ban đầu sau git rebase đã tạo bản sao được rebased. Vì vậy, trong ví dụ của bạn

git branch rebased-A hotfix/A 
git rebase --onto support.2013.16 master rebased-A 

lá bạn với

 o---o---o rebased-A (hotfix/A') 
    /
o---o support.2013.16 
    \ 
     o---o---o---o---o master 
         \ 
         o---o---o hotfix/A 
+1

Lưu ý rằng điều này không giống như giải pháp khác ('git checkout -b'). (Tôi thích câu trả lời này tốt hơn vì được vẽ trong cây cam kết .--)) – torek

7

Bạn có thể tạo một chi nhánh mới:

git checkout -b hotfix/A-support hotfix/A 

và rebase nó để thay thế. Vì vậy, bạn sẽ có hai chi nhánh. Có thể bạn có thể quyết định thả chi nhánh sau khi hợp nhất chi nhánh vào chi nhánh support.

Hoặc, bạn có thể rebase số hoftix/A lên số git merge-base support.2013.16 master và sau đó bạn có thể dễ dàng hợp nhất hotfix/A vào cả hai nhánh. Nó sẽ cung cấp cho bạn lịch sử đẹp hơn, không có cam kết trùng lặp.

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