Sepertinya tidak bisa membuang perubahan di Git

125

Setelah melihat yang berikut dari baris perintah:

# On branch RB_3.0.10
# 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:   index.htm

Saya mencoba membuang perubahan saya dengan mengetik perintah:

git checkout -- index.htm

tetapi ketika saya menjalankan kembali status git, tampilannya sama persis. Kasir sepertinya tidak berfungsi. Apakah saya melakukan sesuatu yang salah? Saya menggunakan GIT 1.6.1.2 di windows / cygwin.

# On branch RB_3.0.10
# 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:   index.htm
Eyal
sumber
4
Apakah git checkout HEAD -- index.htm(memeriksa dari status komitmen terakhir, alih-alih memeriksa dari indeks) berfungsi?
Jakub Narębski
3
git checkout HEAD -- index.htmberhasil untuk saya!
Ben Tideswell

Jawaban:

52

Ini telah mengganggu saya untuk sementara waktu, hampir setiap repo yang saya periksa memiliki perubahan yang tidak dapat saya buang. Singkat cerita, saya mencoba semua hal di atas, tidak ada yang berhasil. Inilah yang saya lakukan untuk mengembalikan semuanya ke normal (di Mac):

Completely remove the autocrlf & safecrlf settings from ~/.gitconfig
Completely remove the autocrlf & safecrlf settings from your repo's local config ./.git/config
git rm --cached -r .
git reset --hard
Frank Martin
sumber
7
Setelah mencoba semua hal di atas, ini adalah satu-satunya hal yang berhasil untuk saya (di Windows)
Anders
Terima kasih! Seperti yang dikatakan Anders, solusi ini juga berhasil untuk saya. Saya mengganti autocrlf dengan # autocrlf
David
37

Inilah pengalaman saya, atur variabel berikut di .git/config:

[core]
    autocrlf = false
    safecrlf = false
    eol = crlf

lalu lari $ git checkout HEAD ., dan berhasil. tapi $ git checkout -- .tidak, aneh!

* git versi 1.9.3

Nianliang
sumber
35

Perubahan apa yang git diffditampilkan di file? Di windows, saya telah melihat masalah dengan ujung baris yang menyebabkan masalah seperti ini. Dalam hal ini, lihat pengaturan apa yang Anda miliki untuk git config core.autocrlfdan git config core.safecrlf. Ada beberapa dokumentasi untuk pengaturan ini di sini .

Saya akan mengatakan, jika Anda menggunakan git svnuntuk integrasi dengan subversi, maka pastikan autocrlfdimatikan. Dari apa yang saya tahu itu hanya rusak dalam konfigurasi ini dan itu membuat sebagian besar alat mengira file telah diubah, ketika Anda telah melakukan checkoutuntuk mengembalikan perubahan apa pun.

Jika Anda melihat masalah di mana Anda melakukannya git checkout, dan kemudian git statusmenunjukkan bahwa file masih dimodifikasi, dan git diffmenunjukkan bahwa file tersebut dimodifikasi pada setiap baris dalam file, maka ini adalah masalah yang Anda lihat.

core.autocrlf

Jika benar, buat git convert CRLF di akhir baris dalam file teks ke LF saat membaca dari sistem file, dan ubah secara terbalik saat menulis ke sistem file. Variabel dapat diatur ke input, dalam hal ini konversi terjadi hanya saat membaca dari sistem file tetapi file ditulis dengan LF di akhir baris. Saat ini, jalur mana untuk mempertimbangkan "teks" (yaitu tunduk pada mekanisme autokrlf) diputuskan murni berdasarkan isinya.

core.safecrlf

Jika benar, buat git periksa apakah mengonversi CRLF seperti yang dikendalikan oleh core.autocrlf dapat dibalik. Git akan memverifikasi jika sebuah perintah mengubah file di pohon kerja baik secara langsung maupun tidak langsung. Misalnya, melakukan file yang diikuti dengan memeriksa file yang sama akan menghasilkan file asli di pohon kerja. Jika tidak demikian halnya dengan pengaturan core.autocrlf saat ini, git akan menolak file tersebut. Variabel dapat disetel ke "warn", dalam hal ini git hanya akan memperingatkan tentang konversi yang tidak dapat diubah tetapi melanjutkan operasi. ...

1800 INFORMASI
sumber
core.autocrlf = true core.safecrlf belum disetel. Haruskah ini disetel ke true untuk windows? Apa perbedaan diantara keduanya?
Saya akan mengatakan, tinggalkan keduanya JIKA Anda menggunakan git svn. Saya menambahkan lebih banyak detail.
1800 INFORMASI
4
Saya berasumsi yang dia maksud adalah memutarnya setidaknya 90 derajat
vijrox
2
Ketika saya menyetel core.autocrlf dan core.safecrlf ke true, saya dapat membuang perubahan yang terdeteksi pada file yang melanggar dengan menjalankan 'git reset --hard HEAD'.
Aleksey
19

Saya pikir Anda harus lulus -f

Dari halaman manual ( man git-checkout, GIT-CHECKOUT (1)):

-f, --force
Proceed meskipun indeks atau pohon kerja berbeda dari HEAD.
Ini digunakan untuk membuang perubahan lokal .

Misalnya, buang perubahan pada cabang saat ini dan beralihlah ke cabang lain:

git checkout -f master
hasen
sumber
7
Lulus -f untuk apa? Alangkah baiknya jika jawabannya lengkap
PandaWood
@Matt niat saya bukan untuk checkout cabang yang berbeda. Jawabannya dari tahun 2009 jadi saya tidak terlalu ingat tapi menilai dari pertanyaannya, saya rasa saya bermaksud untuk lolos -fke checkout - <filename> seperti dalamgit checkout -f -- filename
hasen
@hasen Tiga komentar yang Anda minta untuk klarifikasi, itulah mengapa saya menambahkan "misalnya". Contoh ini tidak menghalangi penggunaan lain dari-f
Matt H
Bekerja untuk saya. git checkout -f mastermelemparkan "Already on 'master'" tetapi perubahannya hilang.
Kristen
12

Ini mungkin akhir baris, seperti yang disarankan @ 1800-information, tetapi kemungkinan lain adalah bahwa perbedaannya (yang mencegah Anda mengembalikan file ini dengan perintah checkout) adalah salah satu mode file. Inilah yang terjadi pada saya. Di versi git saya, Anda dapat menemukannya dengan menggunakan

git diff index.htm

Dan itu akan menunjukkan kepada Anda perubahan mode file. Itu tetap tidak akan membiarkan Anda mengembalikannya, menggunakan checkout, bahkan dengan opsi -f. Untuk penggunaan itu juga

git config core.filemode false

atau ubah git .config Anda di editor teks dengan menambahkan

[inti]

filemode = false

Setelah Anda melakukan ini, Anda dapat menggunakan

git setel ulang HEAD index.htm

dan file tersebut akan hilang.

(Saya mendapatkan semua ini dari jawaban untuk Bagaimana cara membuat perubahan mode abaikan git (chmod)? Dan memperbarui-file-izin-hanya-dalam-git )

Eyal
sumber
Terima kasih banyak! Tidak ada saran lain yang berhasil bagi saya untuk menyingkirkan perubahan mode file.
Thorkil Værge
6

Apakah Anda pengguna OSX atau Windows? Jika demikian, masalahnya mungkin memiliki dua file dengan nama yang sama, dengan kasus yang berbeda. misalnya. index.htm dan Index.htm

Windows, dan secara default OSX, menggunakan sistem file tidak peka huruf besar / kecil, yang bertentangan dengan huruf besar dan kecil.

Fil
sumber
2

Saya mengalami masalah ini dan setelah mencoba semua hal di atas, tidak ada yang berhasil.

Apa yang berhasil bagi saya adalah menghapus direktori tempat file itu berada, lalu melakukan git statusdan memastikan bahwa semua file di direktori itu sekarang ditandai sebagai dihapus. Setelah itu saya langsung melakukannya git checkout -fdan semuanya kembali normal.

Eldar
sumber
1

Saya sedang mengerjakan sebuah libGDXproyek Android Studiodan saya ingin membuang semua perubahan yang telah saya lakukan, dan tidak ada yang berhasil untuk saya, solusi yang saya dapatkan adalah melakukan semua perubahan ke cabang baru

git checkout -b TRASH
git add .
git commit -m "discarded changes"
git checkout master

dan kemudian Anda dapat menghapus TRASHcabang tersebut jika Anda mau.

Waqleh
sumber
1

Saya memiliki masalah yang sama, tidak ada dari komentar di atas yang berhasil. Ternyata, filesystem saya tidak case sensitive (osx default, tetapi windows mungkin berperilaku sama) dan sebuah file hadir dengan huruf besar dan kecil di direktori yang sama, dengan konten yang berbeda. Karena di komputer saya kedua nama menunjuk ke file yang sama, status git selalu menunjukkan modifikasi, apa pun yang saya lakukan. Untuk mengatasi masalah tersebut:

  • Saya harus menghapus salah satu file dari komputer lain dan mendorongnya ke repo

  • hapus seluruh versi lokal sepenuhnya

  • lakukan git clone dari awal

joe
sumber
0

Saya mengalami masalah serupa, yang tidak mengizinkan saya untuk membuang file yang tidak ada atau telah diubah. Saya menggunakan Visual Studio di tempat kerja, dan saya menemukan bahwa ini terjadi saat berpindah cabang saat aplikasi sedang berjalan.

git checkoutdan mencoba membuang tidak membantu. Itu tidak akan berhasil atau hanya akan memberi tahu saya bahwa saya tidak memiliki izin.

Solusi yang berhasil:

  1. Masuk ke Safe Mode
  2. Buang file

Memulai ulang memang menyebalkan, tetapi ini bekerja lebih cepat daripada mencoba 100 hal.

Gene Parcellano
sumber
0

Ada solusi yang mudah. Jika ini terjadi (biasanya dari shutdown windows yang tidak terduga atau memory dump) dan Anda tidak dapat membuang perubahan Anda dan bahkan berpindah antar cabang (Git mengatakan Anda tidak memiliki cukup izin); di Windowslingkungan show all hidden files and foldersdari opsi folder. Buka direktori GIT Anda (harus dimulai dengan .git) dan hapus "index.lock"file. Maka Git akan membiarkan Anda melakukan apa pun yang Anda ingin lakukan.

Mahib
sumber
0

Saya akhirnya melakukan git stashdiikuti dengan git stash cleanuntuk menyingkirkan beberapa. Tidak melihat konfigurasi cr / lf otomatis dalam hal .git / atau ~ / .git.

Matt H.
sumber
0

Dalam kasus saya, saya tidak dapat membuang perubahan yang terkait dengan direktori. misalnya ketika saya menjalankan git diff, saya akan melihat ini: -Subproject commit fdcccccccccccccccccccccccccccccccccccccc +Subproject commit f1bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

Jadi saya memanggil direktori itu dan menjalankan status git di sana. Itu dalam kondisi HEAD terlepas. Dan kemudian saya berlari git checkout masterke sana. Itu membuat segalanya benar untuk saya. Tapi ini tidak membantu untuk skenario persis yang ditanyakan di sini.

Sheetal Kaul
sumber
0

Ini adalah pertanyaan lama, tapi masih relevan bagi saya. Saya tidak menemukan jawaban saya sampai bertanya di sekitar kantor, dan menemukan bahwa masalahnya ada pada submodul. Ketika mereka diperbarui, dan repositori Anda sendiri tidak mencerminkan perubahan itu, itu muncul sebagai memiliki perbedaan, mengatur ulang head tidak membantu. Jika ini masalahnya, jalankan:

git status update

Itu akan membantu memperbaiki berbagai hal (dalam kasus khusus ini)

Bradley Robinson
sumber
0

Saya memiliki masalah izin di Windows dan harus melakukannya icacls containingFolder /reset /t /l /cdan kemudian klik dua kali folder tersebut untuk mendapatkan izin saya kembali.

Noumenon
sumber
0

Saya memiliki .gitattributes dengan konten berikut:

* text=auto eol=lf

Untuk mengatasi masalah ini, edit .gitattributesuntuk menghapus baris ini yang melonggarkan akhir baris. Kemudian git reset --hard HEADmengembalikan file dan .gitattributesfile.

James Jithin
sumber
0

Bagi saya masalah ini muncul dengan kombinasi pengunduhan gambar Git-LFS yang diunggah melalui Netlify CMS dan disajikan secara berbeda oleh penangan Netlify Large Media mereka.

Solusi saya adalah mengomentari / menghapus baris ini dari saya ~/.gitconfigsehingga terlihat seperti di bawah ini, dan kemudian periksa git statuslagi.

# [filter "lfs"]
#   clean = git-lfs clean %f
#   smudge = git-lfs smudge %f
#   required = true

ATAU Anda mungkin dapat menambahkan lebih banyak filter lokal melalui a .gitconfigdi root repo dan entah bagaimana menimpa aturan filter untuk lfs di sana.

Semoga ini bisa membantu sesama.

Knogobert
sumber
-1

Saya juga menghadapi masalah yang agak mirip dan langkah-langkah berikut membantu saya:

git commit -am 'temp commit'
git pull origin master
git reset head~1
git reset head --hard

Semoga bisa membantu orang lain juga.

Atin Agarwal
sumber