2011-01-06 27 views
8

tôi đã kéo trong thư mục emacs của tôi, và nhấn xung đột sau:Sau tệp git rm; cam kết - cách lấy lại tệp từ nhánh từ xa?

CONFLICT (add/add): Merge conflict in elisp/dired-details+.el 

tình trạng Git cho thấy như sau:

Unmerged paths: 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# both added:   elisp/dired-details+.el 

Được rồi, vì vậy đề nghị sử dụng git git rm. Tôi muốn thay thế hoàn toàn tệp cục bộ bằng tệp tôi đang kéo vào, do đó, có vẻ như là loại hợp lý ... Vì vậy, tôi thực hiện git rm elisp/dired-details+.elgit merge. Tôi nhận được:

git hợp nhất: gây tử vong: Bạn chưa kết luận hợp nhất của mình (MERGE_HEAD tồn tại). Vui lòng cam kết thay đổi của bạn trước khi bạn có thể hợp nhất.

Được rồi, tốt: git commit -a -m "ugh merge conflicts"; git pull origin master.

Bây giờ tất cả mọi thứ kết hợp tốt, ngoại trừ tôi đang thiếu dired-details+.el, tôi loại bối rối, và tôi muốn biết câu trả lời cho những điều sau đây:

  1. Làm thế nào để undo git-rm và nhận được rằng tập tin từ các chi nhánh từ xa? ..
  2. tại sao đã có một cuộc xung đột ở nơi đầu tiên? .. những gì đang xảy ra ở đây với add/add? ..
  3. gì nên tôi đã làm thay vì git-rm 'ing file tôi muốn thay thế? ..

Trả lời

9

Trước tiên, hoàn tác cam kết hợp nhất của bạn bằng cách sử dụng git reset --hard HEAD^. Lưu ý rằng điều này sẽ quét sạch cam kết cuối cùng và đặt lại bản sao làm việc của bạn về trạng thái của cam kết trước đó, vì vậy hãy cẩn thận để hiểu điều này sẽ làm gì trước khi thực hiện. gitk có thể giúp hình dung điều này.

Thứ hai, git rm không làm những gì bạn mong đợi ở đây. Khi bạn có xung đột hợp nhất, bạn đang xem tệp ở trạng thái đã được hợp nhất, với tệp chứa các điểm đánh dấu xung đột để bạn giải quyết xung đột. Tại thời điểm này, bạn đang được yêu cầu sửa chữa bản sao làm việc đến trạng thái mà bạn muốn hợp nhất cuối cùng cam kết như thế nào. Bằng cách loại bỏ các tập tin, bạn nói với git rằng bạn không muốn các tập tin có mặt ở tất cả nữa, đó không phải là những gì bạn muốn.

Những gì bạn cần làm ở giai đoạn này là cập nhật tệp bị xung đột trong bản sao làm việc của bạn lên phiên bản bạn muốn giữ lại. Thông thường, điều này được thực hiện bằng cách kiểm tra các điểm đánh dấu xung đột và điều chỉnh tệp tương ứng. Trong trường hợp của bạn, nếu bạn biết chắc chắn rằng bạn muốn bản sao từ chi nhánh bạn đang hợp nhất, bạn có thể sử dụng git show :3:elisp/dired-details+.el > elisp/dired-details+.el để thực hiện việc này. Sau đó, git add elisp/dired-details+.el để nói với git rằng bạn đã giải quyết xung đột trong tệp đó và sau đó git commit để hoàn tất.

Ở đây, git show :3:... đang yêu cầu phiên bản của tệp từ MERGE_HEAD. Nếu bạn cần một phiên bản khác, bạn cũng có thể sử dụng 1 cho tổ tiên chung hoặc 2 cho "bên" của bạn trong quá trình hợp nhất.

+0

Vâng, tất cả dường như rất rõ ràng trong tình trạng khó hiểu. Tôi không biết về: n: ký hiệu, có vẻ khá hữu ích. –

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