Tôi đã gắn cờ câu hỏi này như trùng lặp. Tôi sẽ viết những gì tôi đã giải thích the other answer nhưng sử dụng ví dụ của bạn.
Phương pháp mà tôi sử dụng đối với trường hợp sử dụng như vậy là để hợp nhất tất cả các ngành được chuyển vào 1 chung nhân tạo nút, và sau đó sử dụng lệnh rebase với các tùy chọn --preserve-merges
. Hợp nhất tất cả các chi nhánh sẽ phơi bày 1 điểm kết thúc sẽ được sử dụng làm thông số đầu vào cuối cùng cho rebase --onto
. Các điểm bắt đầu thường là hiển nhiên, nguồn gốc của cây con để di chuyển.
Khi hợp nhất để nhận được điểm cuối subtree, các xung đột cần được giải thích tránh. Do đó, các lệnh hợp nhất sẽ được hướng dẫn để giải quyết chúng tự động với tùy chọn -Xours
. Kết quả hợp nhất không quan trọng là vì các nút nhân tạo hợp nhất này sẽ bị hủy sau khi rebase.
Bạn nên tạo một chi nhánh mới gói để không bị mất các tài liệu tham khảo gốc . Trong ví dụ trên, các lệnh sau sẽ là được thực hiện:
$ git checkout -b pack WIP1 # create new branch at 'WIP1'
$ git merge -s recursive -Xours WIP2 # merges WIP2 into pack (node p2)
$ git merge -s recursive -Xours WIP3 # merges WIP3 into pack
Dưới đây có thể thấy cây sẽ trở thành cái gì. Hai mới nhân tạo nút p2 và gói đã được tạo bằng cách hợp nhất.
o (master)
/
/ (WIP1) (p2)
/ o-----o-----o----o (pack)
/ / //
o--o--o--o-----o-----o /(WIP2)
(X) \ /
o------------o (WIP3)
Bây giờ là lúc để rebase. Kể từ bây giờ có một thiết bị đầu cuối phổ biến đối với tất cả các chi nhánh (gói), thật dễ dàng để di chuyển toàn bộ cây con với:
$ git rebase --preserve-merges --onto master X pack
nào sản xuất này:
(WIP1') (p2')
o-----o-----o----o (pack')
(master) / //
o----o----o--o--o-----o-----o /(WIP2')
(X) \ /
o------------o (WIP3')
Bây giờ là thời gian để sắp xếp lại các tài liệu tham khảo. Tôi không biết tại sao, trong một số trường hợp các tham chiếu được di chuyển và trong trường hợp khác thì không. Loại này cho mỗi WIP1 tham khảo, WIP2, WIP3 hoặc bất cứ điều gì bạn cần:
$ git checkout WIP1
$ git reset --hard <WIP1' hash>
Và cuối cùng, thoát khỏi cam kết nhân tạo đã được tạo cho tạo ra một nút cuối cây con chung.
$ git branch -D pack
$ git branch -D p2 # if there is any
Vì vậy, cây cuối cùng sẽ là:
(WIP1')
o-----o
(master) /
o----o----o--o--o-----o-----o (WIP2')
(X) \
o------------o (WIP3')
thể trùng lặp của [rebasing một chi nhánh bao gồm tất cả các con của nó] (http://stackoverflow.com/questions/5600659/rebasing-a-branch -including-all-its-children) –
Có thể trùng lặp của [Rebasing a tree (một cam kết/chi nhánh và tất cả các con của nó)] (https://stackoverflow.com/questions/17315285/rebasing-a-tree-a-commit -branch-and-all-its-children) – carnicer