2011-01-12 28 views
16

Giả sử tôi có chi nhánh được gọi là master và chi nhánh có tên là upstream_lib.Làm thế nào để buộc một tổ tiên chung trong một hợp nhất git?

Chi nhánh master có một thư mục con lib dựa trên mã trên chi nhánh upstream_lib; thay đổi trong upstream_lib được hợp nhất (với chiến lược subtree) đến chi nhánh master định kỳ. Thư mục lib trong master có một số sửa đổi của riêng nó mà không có trong upstream_lib. Tuy nhiên, giả sử hai nhánh không có lịch sử chung (vì kho lưu trữ vừa được di chuyển sang git) hoặc cơ sở hợp nhất không chính xác vì việc hợp nhất trong upstream_lib đã bị đè bẹp, đã có một số rebasing hoặc bất cứ điều gì.

Câu hỏi đặt ra là: đưa ra một tập hợp thay đổi mới trên upstream_lib, cách buộc hợp nhất xem là tổ tiên chung một bản sửa đổi cụ thể của upstream_lib?

Trả lời

9

Tôi chưa bao giờ sử dụng chiến lược subtree, vì vậy có thể đây là giải pháp tối ưu (và có thể nó sẽ không hoạt động^^), nhưng bạn có thể áp dụng tất cả các cam kết mới trong upstream_lib cho nhánh tạm thời tắt của master và sau đó hợp nhất. Những gì tôi có trong tâm trí về cơ bản không sửa chữa tình huống của bạn, do đó bạn sẽ phải thực hiện loại "hợp nhất thủ công" này mỗi khi bạn muốn thay đổi mới, nhưng dưới đây là cách hoạt động:

  1. Xác định tổ tiên chung giả trong dòng tổ tiên master, giả sử master~100.
  2. Xác định tổ tiên chung giả mạo trong dòng upstream_lib, giả sử upstream_lib~150.
  3. Tạo một bản sao throwaway của chi nhánh upstream_lib: git branch --no-track new_upstream_lib upstream_lib
  4. rebase new_upstream_lib vào master~100 sử dụng chiến lược đệ quy với các tùy chọn cây con. (Tôi không nghĩ rằng bạn chỉ có thể sử dụng chiến lược cây con bởi vì, như bạn nói, lib thư mục trong master có những thay đổi của riêng nó.) Dưới đây là một lệnh hoàn toàn chưa được kiểm tra cho điều này:

    git rebase -s recursive -X subtree=lib --onto master~100 upstream_lib~150 new_upstream_lib 
    

    Lưu ý rằng new_upstream_lib nay có toàn bộ cây master trong đó, mặc dù bạn chỉ quan tâm đến thư mục lib.

  5. Hợp nhất: git checkout master && git merge new_upstream_lib && git branch -d new_upstream_lib.
+0

Nó hoạt động hoàn hảo, cảm ơn! – Artefacto

+1

Tôi đoán vấn đề duy nhất là không có lịch sử được chia sẻ hoặc cam kết với chi nhánh upstream_lib, nhưng tôi có thể sống với điều đó. – Artefacto

+0

Rất vui khi biết điều đó! Nếu bạn muốn ép buộc tổ tiên được chia sẻ, bạn có thể tạo một commit trống ban đầu và rebase cả 'master' và' upstream_lib' vào đó. Giả sử tất nhiên 'upstream_lib' là nhánh của riêng bạn chứ không phải từ xa. Tuy nhiên, nếu việc nhập ban đầu của 'upstream_lib' vào thư mục' lib' chỉ là 'cp' chứ không phải là một phép hợp nhất (như được mô tả tại http://www.kernel.org/pub/software/scm/git/docs/ howto/using-merge-subtree.html), bạn vẫn sẽ gặp vấn đề bạn mô tả. –

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