Bagaimana cara mengembalikan perubahan yang tidak dikomit termasuk file dan folder?

1071

Apakah ada perintah git untuk mengembalikan semua perubahan yang tidak dikomit di pohon dan indeks yang berfungsi dan juga menghapus file dan folder yang baru dibuat?

MEM
sumber
1
Yah, saya telah membaca semua jawaban yang bervariasi dan sulit diingat di bawah ini, dengan peringatan dan kasus tepi mereka dan "tidak bekerja jika Anda memiliki xxx", dan telah terjebak dengan menghapus seluruh repo, mengkloningnya untuk menghapus semua file yang diedit dan ditambahkan. . Juga hanya dua perintah. rm -r projectdir; git clone xxx. Bagi saya ini adalah operasi yang sering - periksa repo bermain-main dengannya, lalu ingin kembali ke checkout bersih sehingga saya dapat mulai memodifikasinya. Tidak hebat, tetapi bekerja 100%. Berharap suatu hari mereka akan menambahkan perintah sederhana untuk ini.
John Little

Jawaban:

1771

Anda dapat menjalankan dua perintah ini:

# Revert changes to modified files.
git reset --hard

# Remove all untracked files and directories.
# '-f' is force, '-d' is remove directories.
git clean -fd
htanata
sumber
147
ide yang bagus untuk menjalankan 'git clean -nd' untuk melihat pratinjau perubahan sebelum menjalankan git clean untuk memastikan Anda tidak memiliki file atau direktori yang tidak terpantau yang Anda pedulikan yang akan dihapus.
jpw
79
Menyelamatkan seseorang perjalanan ke dokumen: -f adalah kekuatan, -d menghapus direktori, -n adalah run kering (juga --dry-run; tampilkan output tanpa melakukan apa pun)
Aaron Campbell
12
git clean -iuntuk mode interaktif.
galath
Itu tidak mengatur ulang file saya yang tidak dipentaskan, saya harus mementaskannya terlebih dahulu.
Aron Lorincz
4
@IgorGanapolsky Anda mungkin berada di tengah-tengah konflik gabungan. Coba jalankan git merge --abort.
htanata
555

Jika Anda ingin mengembalikan perubahan hanya di direktori kerja saat ini, gunakan

git checkout -- .

Dan sebelum itu, Anda dapat membuat daftar file yang akan dikembalikan tanpa benar-benar melakukan tindakan apa pun, hanya untuk memeriksa apa yang akan terjadi, dengan:

git checkout --
Ramashish Baranwal
sumber
1
Ketika saya mencoba ini saya mendapatkan "error: pathspec '.' tidak cocok dengan file mana pun yang dikenal git
Mike K
34
apa perbedaan antara ini dan git reset --hard?
Felipe Almeida
104
'git reset --hard' akan membatalkan perubahan yang dipentaskan dan yang tidak dipentaskan, sedangkan 'git checkout -.' akan membatalkan hanya perubahan yang tidak
dipentaskan
Tetapi jika Anda menggunakan checkout dan Anda telah memodifikasi file, cmd akan mengembalikan bahwa saya perlu melakukan penggabungan, bahkan ketika saya hanya perlu mengembalikan perubahan ini
Vinicius Monteiro
7
git checkout - hanya akan daftar file yang akan dikembalikan (tidak ada tindakan, daftar saja). ini berguna jika Anda ingin melihat file apa yang akan terpengaruh sebelum melakukan checkout git -.
Krish Srinivasan
107

Gunakan "git checkout - ..." untuk membuang perubahan pada direktori yang berfungsi

git checkout -- app/views/posts/index.html.erb

atau

git checkout -- *

menghapus semua perubahan yang dibuat untuk file yang tidak dipentaskan dalam status git misalnya

modified:    app/controllers/posts.rb
modified:    app/views/posts/index.html.erb
Zarne Dravitzki
sumber
5
git checkout -- *tidak berfungsi untuk saya kecuali saya berada di direktori tempat file yang diubah berada. Untuk checkout semua file di seluruh repositori, Anda harus melakukannyagit checkout -- :/
waldyrious
Di git checkout -- *, bintang digantikan oleh Shell, dengan semua file dan direktori di direktori saat ini. Jadi harus masuk dalam subdirektori. Ini bekerja untuk saya. Tapi terima kasih untuk menyoroti sintaks ": /" yang menurut saya lebih bersih.
mcoolive
53

Salah satu cara non-sepele adalah menjalankan dua perintah ini:

  1. git stash Ini akan memindahkan perubahan Anda ke simpanan, membawa Anda kembali ke status KEPALA
  2. git stash drop Ini akan menghapus simpanan terbaru yang dibuat dalam perintah terakhir.
muram
sumber
3
Ini tidak berfungsi untuk perubahan yang tidak dikomit, hanya perubahan yang dilakukan.
b0xxed1n
4
Saya telah menggunakannya untuk perubahan yang tidak dikomit dan berfungsi.
Paul D. Eden
7
@ b0xxed1n Stashing adalah tentang perubahan yang tidak dikomit, dan jelas itu bekerja untuk mereka.
TJ
git simpanan dibuat untuk menyimpan perubahan yang tidak dikomit sehingga Anda dapat .. menyimpannya tanpa melakukan.
Rob
git simpanan menghasilkan kesalahan berikut:fatal: git-write-tree: error building trees Cannot save the current index state
IgorGanapolsky
19
git clean -fd

tidak membantu, file baru tetap ada. Apa yang saya lakukan adalah benar-benar menghapus semua pohon yang bekerja dan kemudian

git reset --hard

Lihat " Bagaimana cara menghapus direktori kerja lokal saya di git? " Untuk saran untuk menambahkan -xopsi untuk membersihkan:

git clean -fdx

Catatan -x bendera akan menghapus semua file diabaikan oleh Git jadi hati-hati (lihat diskusi dalam jawaban saya lihat).

Fr0sT
sumber
apa itu -fdx? "force, directory, dan x is?
Adi Prasetyo
@AdiPrasetyo -x flag menghapus semua file yang diabaikan juga; mungkin efek yang tidak diinginkan jadi saya memperbarui jawaban saya.
Fr0sT
Saya masih tidak bisa rebase. Saya mendapatkan kesalahan: kesalahan: Gagal menggabungkan perubahan. Patch gagal pada 0003 Buat menelepon kembali ke Salinan patch yang gagal ditemukan di:
IgorGanapolsky
13

Saya pikir Anda dapat menggunakan perintah berikut: git reset --hard

Josnidhin
sumber
hhmm ... Saya melakukan itu tetapi file saya masih ada. Haruskah saya melakukan sesuatu setelahnya?
MEM
1
git reset hanya mengembalikan perubahan yang tidak dikomit di pohon kerja. Itu tidak akan menghapus file dan folder baru. Saya tidak yakin bagaimana melakukannya dengan git
Josnidhin
1
Jadi, jika kita mengubah direktori sistem dengan menambahkan file dan folder baru, dan kemudian kita ingin mengembalikan direktori itu ke keadaan sebelumnya (tanpa file dan folder itu), kita tidak bisa melakukannya dengan git? Jadi yang terbaik yang kami bisa adalah mengembalikan status file? Tetapi begitu kita membuat file, kita tidak bisa menghapus file itu kecuali kita melakukannya secara manual?
MEM
6

Harap dicatat bahwa mungkin masih ada file yang tampaknya tidak akan hilang - mereka mungkin belum diedit, tetapi git mungkin telah menandai mereka sebagai sedang diedit karena perubahan CRLF / LF. Lihat apakah Anda telah membuat beberapa perubahan .gitattributesbaru-baru ini.

Dalam kasus saya, saya telah menambahkan pengaturan CRLF ke .gitattributesfile dan semua file tetap dalam daftar "file yang dimodifikasi" karena ini. Mengubah pengaturan .gitattributes membuatnya menghilang.

rampok
sumber
6

Jika Anda memiliki perubahan yang tidak dikomit (hanya di copy pekerjaan Anda) yang ingin Anda kembalikan ke salinan di komit terbaru Anda, lakukan hal berikut:

git checkout filename
kgandroid
sumber
Saya mencoba ini setelah tidak berkomitmen git rm filename, dan tidak berfungsi. error: pathspec 'filename' did not match any file(s) known to git.
falsePockets
Solusi untuk kehancuran git rmadalahgit checkout master -- filename
falsePockets
3

Git 2.23 memperkenalkan git restoreperintah untuk mengembalikan file pohon yang berfungsi.

https://git-scm.com/docs/git-restore

Untuk mengembalikan semua file di direktori saat ini

git restore.

Jika Anda ingin mengembalikan semua file sumber C agar sesuai dengan versi dalam indeks, Anda bisa melakukannya

git restore '* .c'

Efek Kojuju
sumber
1
itu git 2.23 , bukan 2.13
phuclv
2

Anda bisa menggunakan perintah git berikut yang dapat mengembalikan kembali semua perubahan yang tidak dikomit yang dibuat dalam repositori Anda:

git checkout .

Contoh:

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   application/controllers/Drivers.php
        modified:   application/views/drivers/add.php
        modified:   application/views/drivers/load_driver_info.php
        modified:   uploads/drivers/drivers.xlsx

no changes added to commit (use "git add" and/or "git commit -a")

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git checkout .

ABC@ABC-PC MINGW64 /c/xampp/htdocs/pod_admin (master)
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean
Haritsinh Gohil
sumber
-2

Saya biasanya menggunakan cara ini yang bekerja dengan baik:

mv fold/file /tmp
git checkout fold/file
berpikiran
sumber
Ini persis sama dengan apa yang diusulkan pria dengan "suka" 357. Hanya Anda yang membuat cadangan dari file yang baru diperiksa.
Matthias
-3

Jalan yang aman dan jauh:

  1. git branch todelete
  2. git checkout todelete
  3. git add .
  4. git commit -m "I did a bad thing, sorry"
  5. git checkout develop
  6. git branch -D todelete
Jason Lemay
sumber
-3

Menggunakan:

git reset HEAD filepath

Sebagai contoh:

git reset HEAD om211/src/META-INF/persistence.xml
Aniket
sumber