Git: tidak dapat mengurungkan perubahan lokal (kesalahan: jalur ... tidak dihapus)

337

Saya telah mengikuti status pohon yang berfungsi

$ 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")

File foo/bar.txtada di sana dan saya ingin kembali ke "keadaan tidak berubah" (mirip dengan '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

Sekarang semakin membingungkan:

$ 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
#

File yang sama di kedua bagian, baru dan diubah? Apa yang harus saya lakukan?

mklhmnn
sumber
7
Saya berharap seseorang dapat menjelaskan bagaimana kita masuk ke dalam situasi ini, mengapa itu terjadi, dan mengapa solusinya bekerja.
Marcos Dione
1
Saya masuk ke situasi ini ketika saya muncul simpanan saya setelah rebase yang membuat saya menjadi konflik penggabungan (simpanan pop melakukan penggabungan) .... Untuk mengatasinya, saya melakukan "checkout --theirs" .... rupanya saya perubahan masih ada .... untuk menghapusnya..saya mencoba checkout pada file lagi..itu ketika saya melihat kesalahan di atas.
Arindam Roychowdhury

Jawaban:

557

Anda melakukannya dengan cara yang salah. Anda dimaksudkan untuk mengatur ulang terlebih dahulu, untuk menghapus stage file, lalu checkout, untuk mengembalikan perubahan lokal.

Coba ini:

$ git reset foo/bar.txt
$ git checkout foo/bar.txt
Igor Zevaka
sumber
Terima kasih; bekerja seperti pesona! Saya harus komit ( bukan dengan -a arg, perubahan yang relevan sudah dipentaskan) dan kemudian saya bisa mendorong / menarik seperti biasa.
Patrick
18
Bagi saya diperlukan: <br/> reset $ git - foo / bar.txt <br/> checkout $ git - foo / bar.txt <br/> (Perhatikan tambahan "-" di antaranya)
Jan
4
Sintaks yang baik adalah "git reset HEAD file1 file2 ..." lalu "git checkout - file1 file2 ..."
Thomas Decaux
1
Itu selalu lucu ketika jawaban tertinggi pada dasarnya hanya mengatakan "Anda salah melakukannya" :)
nathanchere
4
Penjelasan (tentang hal-hal apa) akan menjadi hebat ...
Kissaki
52

Ini bekerja dengan baik untuk saya:

$ git reset -- foo/bar.txt
$ git checkout foo/bar.txt
Steffi
sumber
14
git checkout origin/[branch] .
git status

// Catatan dot (.) Di bagian akhir. Dan semuanya akan baik-baik saja

Joe Hyde
sumber
-2
git checkout foo/bar.txt

Apakah kamu sudah mencobanya? (tanpa kata kunci KEPALA)

Saya biasanya mengembalikan perubahan saya dengan cara ini.

zed_0xff
sumber
1
Kesalahan umum ketika mencoba a checkoutdi tengah-tengah gabungan: $ git co path/to/file= hasil => error: path 'path/to/file' is unmerged => jadi, jalankan pertama:, $ git reset path/to/filedan kemudian git checkout path/to/fileharus bekerja.
michael
2
Tidak menentukan HEAD akan membuat checkout checkout dari indeks, yang merupakan operasi yang lebih lemah (sumber konten adalah indeks daripada HEAD). Lebih lanjut saya tidak berpikir itu membuat perbedaan dalam kasus ini sama sekali - dengan masalah khusus yang dinyatakan pertanyaan. Apakah kamu mencobanya?
Kissaki
-4

Saya menemukan simpanan git sangat berguna untuk penanganan sementara semua keadaan 'kotor'.

takeshin
sumber
4
Jika Anda merasa itu berguna, tolong berikan penjelasan tentang bagaimana itu akan membantu dalam kasus nyata ini. Bagaimana Anda menggunakannya di sini?
Kissaki