Git: không thể hoàn tác các thay đổi cục bộ (lỗi: đường dẫn không được trộn lẫn)


335

Tôi đã theo trạng thái cây làm việc

$ git status foo/bar.txt
# On branch master
# Unmerged paths:
#   (use "git reset HEAD <file>..." to unstage)
#   (use "git add/rm <file>..." as appropriate to mark resolution)
#
#       deleted by us:      foo/bar.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

Tệp foo/bar.txtở đó và tôi muốn đưa nó về "trạng thái không thay đổi" một lần nữa (tương tự như 'svn Revert'):

$ git checkout HEAD foo/bar.txt
error: path 'foo/bar.txt' is unmerged
$ git reset HEAD foo/bar.txt
Unstaged changes after reset:
M       foo/bar.txt

Bây giờ nó đang trở nên khó hiểu:

$ git status foo/bar.txt
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   foo/bar.txt
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   foo/bar.txt
#

Các tập tin giống nhau trong cả hai phần, mới sửa đổi? Tôi nên làm gì?


7
Tôi ước ai đó có thể giải thích làm thế nào để chúng ta vào tình huống này, tại sao nó lại xảy ra và tại sao giải pháp lại hiệu quả.
Marcos Dione

1
Tôi đã gặp phải tình huống này khi tôi bật stash của mình sau một cuộc nổi loạn khiến tôi rơi vào một cuộc xung đột hợp nhất (stash pop không hợp nhất) .... Để giải quyết nó, tôi đã thực hiện một "kiểm tra - theirs" .... rõ ràng là những thay đổi vẫn còn đó .... để loại bỏ những điều đó..Tôi đã thử kiểm tra lại tệp một lần nữa .. đó là khi tôi thấy lỗi trên.
Arindam Roychowdhury

Câu trả lời:


553

Bạn đã làm nó sai cách xung quanh. Trước tiên, bạn phải thiết lập lại để hủy tập tin, sau đó kiểm tra, để hoàn nguyên các thay đổi cục bộ.

Thử cái này:

$ git reset foo/bar.txt
$ git checkout foo/bar.txt

Cảm ơn; làm việc như người ở! Tôi đã phải cam kết ( không phải với -a arg, những thay đổi có liên quan đã được dàn dựng) và sau đó tôi đã có thể đẩy / kéo như bình thường.
Patrick

18
Đối với tôi, nó yêu cầu: <br/> $ git reset - foo / bar.txt <br/> $ git checkout - foo / bar.txt <br/> (Lưu ý thêm "-" ở giữa)
Jan

4
Cú pháp tốt là "git reset HEAD file1 file2 ..." rồi "git checkout - file1 file2 ..."
Thomas Decaux

1
Điều này luôn gây cười khi câu trả lời được bình chọn cao nhất về cơ bản chỉ nói rằng "bạn đang làm sai" :)
nathanchere

4
Một lời giải thích (về những việc cần làm) sẽ rất tuyệt vời
Kissaki

51

Điều này làm việc hoàn hảo cho tôi:

$ git reset -- foo/bar.txt
$ git checkout foo/bar.txt

14
git checkout origin/[branch] .
git status

// Lưu ý dấu chấm (.) Ở cuối. Và tất cả sẽ tốt


-2
git checkout foo/bar.txt

bạn đã thử chưa? (không có từ khóa CHÍNH)

Tôi thường hoàn nguyên các thay đổi của mình theo cách này.


1
Lỗi điển hình khi thử a checkoutở giữa hợp nhất: $ git co path/to/file= result => error: path 'path/to/file' is unmerged => vì vậy, trước tiên hãy chạy: $ git reset path/to/filevà sau đó git checkout path/to/filenên hoạt động.
michael

2
Không chỉ định HEAD sẽ thực hiện kiểm tra git từ chỉ mục, đây là hoạt động yếu hơn (nguồn nội dung là chỉ mục chứ không phải là CHÍNH). Hơn nữa, tôi không nghĩ rằng điều đó tạo ra sự khác biệt trong trường hợp này - với vấn đề cụ thể mà câu hỏi đã nêu. Đã bạn thử đó?
Kissaki

-4

Tôi thấy git stash rất hữu ích để xử lý tạm thời tất cả các trạng thái 'bẩn'.


4
Nếu bạn thấy nó hữu ích, xin vui lòng đưa ra lời giải thích về cách nó sẽ giúp ích trong trường hợp cụ thể này. Làm thế nào bạn sẽ sử dụng nó ở đây?
Kissaki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.