2012-01-16 2 views
15

Có tệp có hai cam kết quan tâm, cả trên chi nhánh Master, cả hai chỉ sửa đổi một tệp foo: cam kết trước AA và phiên bản hiện tại trong HEAD. Tôi muốn hợp nhất hai phiên bản của tệp, giữ các bit của cả hai, thành HEAD trên Master.Git: Hợp nhất cam kết cũ vào phiên bản hiện tại

tôi đã làm điều đơn giản nhất mà tôi nghĩ sẽ làm việc:

git checkout -b merge-purgatory AA 
git commit -m "pulled foo back from previous commit for merging into HEAD." 
git checkout master 
git merge merge-purgatory 

Mà chỉ đơn giản là ghi đè phiên bản hiện tại của HEADfoo với phiên bản AA. Thử kết quả chi tiết hơn git checkout -m, cùng một kết quả: ghi đè câm.

Làm cách nào để buộc git xử lý phiên bản AA của foo làm một sự xung đột xung đột với phiên bản HEAD hiện tại?

Trả lời

14

Nếu git của trộn thư sẽ không làm những gì bạn muốn, bạn có thể làm như sau thay vì:

  1. Hãy chắc chắn rằng không có thay đổi không bị giam trong file foo, ví dụ bằng cách đảm bảo rằng git status sạch sẽ.
  2. Ghi đè foo với các phiên bản từ AA sử dụng: git show AA:foo > foo
  3. chọn lọc giai đoạn chỉ những thay đổi từ foo mà bạn muốn với: git add -p foo
  4. Huỷ tất cả những thay đổi khác để foo với git checkout -- foo
  5. Cam kết những thay đổi tổ chức: git commit

Hoặc, nếu bạn muốn sử dụng công cụ tìm khác biệt đồ họa (chẳng hạn như meld), bạn chỉ có thể làm:

git show AA:foo > old-foo 
meld old-foo foo 
+2

Vì vậy, về cơ bản, chỉ cần bỏ qua kiến ​​thức của git về cam kết trước đó và sử dụng một hợp nhất thủ công/mergetool. Đã hy vọng cho một hành vi cromulent từ git, nhưng điều này là đơn giản như vậy mà tôi đã sử dụng nó thành công và chỉ cần làm một chút của sạch-up sau đó. Cảm ơn! – Noel

1
git merge --no-commit merge-purgatory 

ít nhất sẽ cung cấp cho bạn cơ hội để đánh giá: thay đổi hợp nhất trước khi cam kết.
Xem thêm các kỹ thuật được đề xuất trong "How do you merge selective files with git-merge?", dựa trên chọn hoặc thanh toán bằng quả anh đào.


Về buộc merge thủ công, bạn có thể tuyên bố trong một .gitatributes file, cho rằng tập tin cụ thể, chính sách merge thiết lập để unset.

Thực hiện ba chiều merge

merge

The attribute merge affects how three versions of a file is merged when a file-level merge is necessary during git merge, and other commands such as git revert and git cherry-pick. 
Unset 

Lấy phiên bản từ chi nhánh hiện nay là kết quả hợp nhất dự kiến, và tuyên bố rằng việc hợp nhất có xung đột. Điều này phù hợp với các tệp nhị phân không có ngữ nghĩa hợp nhất được xác định rõ.

+0

Là "đánh giá: thay đổi" lệnh hoặc tùy chọn chuyển đổi? – Noel

+0

Và, trong mọi trường hợp, "Tự động hợp nhất đều ổn, dừng trước khi cam kết theo yêu cầu" không trả lời được câu hỏi của tôi: cách ngăn "Tự động hợp nhất" xảy ra, và thay vào đó xử lý hai phiên bản là xung đột ghi đè lên các dòng của nhau) và yêu cầu hợp nhất thủ công? – Noel

+0

@Noel: xin lỗi, tôi đã giới thiệu phần hợp nhất thủ công. Tôi đã chỉnh sửa câu trả lời của mình. – VonC

3

Câu trả lời trước không giữ câu chuyện thay đổi, vì vậy bạn đã sử dụng cam kết trước đó để tạo cam kết mới. Quy trình sau sẽ giữ câu chuyện này.

git checkout -b merge-purgatory AA 

tại đây bạn cần sửa đổi một chút tệp của mình, ví dụ: bạn có thể thêm một dòng trống. Sau đó,

git commit "pulled foo back from previous commit for merging into HEAD." 
git checkout master 
git merge --no-commit merge-purgatory 

Bằng cách này hợp nhất sẽ không thành công và tất cả những gì bạn cần làm là giải quyết xung đột. Điều này làm việc cho tôi.