git: batalkan semua perubahan dir yang berfungsi termasuk file baru

1151

Cara menghapus semua perubahan dari direktori kerja termasuk file baru yang tidak terlacak. Saya tahu itu git checkout -fbisa, tetapi itu tidak menghapus file baru yang tidak terlacak yang dibuat sejak komit terakhir.

Adakah yang punya ide bagaimana melakukan itu?

Aler
sumber
1
@ Joel & Wayfarer: kenapa tidak Anda coba git help resetdangit help clean
SHernandez
3
Membuat alias untuk ini di konfigurasi git Anda adalah ide yang bagus;)
anubina

Jawaban:

1699
git reset --hard # removes staged and working directory changes

## !! be very careful with these !!
## you may end up deleting what you don't want to
## read comments and manual.
git clean -f -d # remove untracked
git clean -f -x -d # CAUTION: as above but removes ignored files like config.
git clean -fxd :/ # CAUTION: as above, but cleans untracked and ignored files through the entire repo (without :/, the operation affects only the current directory)

Untuk melihat apa yang akan dihapus sebelumnya, tanpa benar-benar menghapusnya, gunakan -nflag (ini pada dasarnya adalah uji coba). Ketika Anda siap untuk benar-benar menghapus, maka hapus -nbendera:

git clean -nfd

BKSpurgeon
sumber
16
Catatan: git reset --hard menghapus perubahan bertahap serta perubahan direktori kerja. Juga, git clean -f -d mungkin merupakan kebalikan dari menambahkan file baru yang tidak terlacak. Dari pertanyaan, penanya mungkin cukup senang dengan set file yang saat ini diabaikannya.
CB Bailey
7
Baca jawaban selanjutnya dan perhatikan tombol -x. (Mungkin juga menghapus konfigurasi lokal Anda seperti file password / db-setting. Mis. Database.yml)
Boris
9
Switch -x itu tidak perlu dan agak berbahaya dalam kasus ini.
Tim Gautier
66
git clean -fxdsebenarnya bisa BENAR-BENAR berbahaya jika Anda tidak tahu apa yang Anda lakukan. Anda dapat menghapus secara permanen beberapa file penting yang tidak terlacak, seperti database Anda, dll. Berhati-hatilah.
Mason Stewart
10
Perhatikan bahwa git clean -f -dakan menghapus file dari folder yang diabaikan juga. Jadi semua log lokal Anda dan hal-hal seperti itu akan hilang. Biasanya itu bukan masalah besar, tetapi lebih baik untuk tahu.
cyriel
299

Metode teraman, yang sering saya gunakan:

git clean -fd

Penjelasan sintaks per /docs/git-cleanhalaman:

  • -f(alias:) --force. Jika variabel konfigurasi Git clean.requireForce tidak disetel ke false, git clean akan menolak untuk menghapus file atau direktori kecuali diberikan -f, -n atau -i. Git akan menolak untuk menghapus direktori dengan sub direktori atau file .git kecuali -f kedua diberikan.
  • -d. Hapus direktori tidak terlacak selain file tidak terlacak. Jika direktori tidak dilacak dikelola oleh repositori Git yang berbeda, itu tidak dihapus secara default. Gunakan opsi -f dua kali jika Anda benar-benar ingin menghapus direktori tersebut.

Seperti yang disebutkan dalam komentar, mungkin lebih baik melakukan git clean -ndyang berjalan kering dan memberi tahu Anda apa yang akan dihapus sebelum benar-benar menghapusnya.

Tautan ke git cleanhalaman dokumen: https://git-scm.com/docs/git-clean

Heath Dutton
sumber
124
Saya selalu git clean -nd .sebelum benar-benar menghapus file menggunakangit clean -fd .
tbear
14
Mengapa? Tolong jelaskan detailnya.
Greg B
31
Per git clean -n opsi sebenarnya adalah dry run yang tidak menghilangkan apa-apa, itu hanya menunjukkan apa yang akan dilakukan.
RNickMcCandless
2
@tbear, Anda selalu dapat melakukan add -A+ commit -a+ kosong revert headterlebih dahulu git clean. Meninjau setiap penghapusan tidak cukup untuk skenario besar. Juga, lari kering bukanlah peluru perak: bagaimana jika Anda melewatkan sesuatu atau melakukan kesalahan selama peninjauan?
Pacerier
1
Ini menghapus file, tetapi itu tidak membatalkan modifikasi.
donquixote
202

Untuk semua file yang tidak dipentaskan, gunakan:

git checkout -- .

Itu . akhirnya itu penting.

Anda dapat mengganti .dengan nama sub-direktori untuk menghapus hanya sub-direktori spesifik proyek Anda. Masalahnya dibahas secara khusus di sini .

jfountain
sumber
7
@Vincent: The - menghindari kesalahan pengetikan dengan memberi tahu perintah checkout bahwa tidak ada lagi parameter yang ditentukan. Tanpa mereka, Anda bisa mengakhiri dengan cabang baru alih-alih mengatur ulang cabang saat ini!
Igor Rodriguez
2
Ini adalah rute teraman, tetapi itu tidak akan menghapus file yang tidak dilacak (file yang baru ditambahkan).
TinkerTenorSoftwareGuy
5
Ini tidak mengembalikan file yang dihapus, namun tidak berkomitmen,.
Cerin
Hanya FYI. Saya melewatkan ini. Pastikan Anda berada di direktori yang ingin Anda hapus perubahannya. Sebagai contoh, saya memiliki perubahan dalam 2 file berbeda di lokasi berbeda pada cabang, yaitu: src/app/work/filename.jsdan ../app/working/test/filename.js. Hanya menggunakan git checkout -- .di cabang hanya menghapus file pertama ( tanpa yang memimpin ../ ). Jadi saya harus cd ../naik ke direktori lokasi kedua untuk menghapus file kedua menggunakan perintah itu.
Chris22
57

Lihatlah git cleanperintahnya.

git-clean - Hapus file yang tidak terlacak dari pohon yang berfungsi

Bersihkan pohon yang bekerja dengan menghapus file secara rekursif yang tidak di bawah kontrol versi, mulai dari direktori saat ini.

Biasanya, hanya file yang tidak dikenal ke git yang dihapus, tetapi jika opsi -x ditentukan, file yang diabaikan juga dihapus. Ini dapat, misalnya, berguna untuk menghapus semua produk buatan.

Greg Hewgill
sumber
Saya telah mencoba git clean -idan memilih "bersih" dari menu - ini akhirnya menghapus file baru.
Sany
43

Karya-karya berikut:

git add -A .
git stash
git stash drop stash@{0}

Harap dicatat bahwa ini akan membuang perubahan lokal Anda yang tidak dipentaskan dan dipentaskan. Jadi, Anda harus melakukan apa pun yang ingin Anda pertahankan, sebelum Anda menjalankan perintah ini.

Kasus penggunaan umum: Anda memindahkan banyak file atau direktori, dan kemudian ingin kembali ke keadaan semula.

Kredit: https://stackoverflow.com/a/52719/246724

donquixote
sumber
1
Mengapa Anda merujuk simpanan @ {0} bukan hanya git stash drop?
maikel
Jujur, saya tidak ingat :)
donquixote
Yang ini berhasil. Sebagai catatan, pastikan Anda berada di direktori home ( git add -A .). Saya kehilangan 30m karena tidak ada kecocokan file. Terima kasih!
user9869932
Saya biasa menggunakan pendekatan ini, dan itu pantas. Namun, saya telah menemukan solusi yang diusulkan oleh jfountain dan Heath Dutton lebih tepat untuk masalah aslinya, IMHO.
HeyZiko
2
git stash drop stash @ {0} menjatuhkan simpanan terbaru jika Anda melakukannya git stash, akan menghapus semua simpanan yang Anda lakukan
DonatasD
42

Anda dapat melakukan ini dalam dua langkah:

  1. Kembalikan file yang dimodifikasi: git checkout -f
  2. Hapus file yang tidak dilacak: git clean -fd
Gerard de Visser
sumber
3
+1 karena sederhana. Juga karena berfungsi dan melakukan persis apa yang diinginkan OP tanpa membuat mereka takut dengan omg, ini akan menghapus semuanya.
geekzster
30

Saya pikir itu ( peringatan: mengikuti akan menghapus semuanya )

$ git reset --hard HEAD
$ git clean -fd

Untuk resetmembatalkan perubahan. The cleanuntuk menghilangkan terpantau f iles dan d irectories.

skube
sumber
Ini tidak berhasil, saya masih mendapatkan peringatan konflik ketika melakukan git pullsesudahnya: CONFLICT (content): Merge conflict in...Saya hanya menyelesaikan ini dengangit pull --strategy=ours
rubo77
7
git reset --hard origin/{branchName}

Ini akan menghapus semua file yang tidak terlacak.

santosh kumar
sumber
4

git clean -ipertama-tama akan menunjukkan kepada Anda item yang akan dihapus dan melanjutkan setelah konfirmasi Anda. Saya menemukan ini berguna ketika berurusan dengan file penting yang tidak boleh dihapus secara tidak sengaja.

Lihat git help cleanuntuk informasi lebih lanjut, termasuk beberapa opsi berguna lainnya.

Taiga
sumber
4

Jika Anda ingin membuang semua perubahan, Anda bisa menggunakan salah satu opsi yang valid di alias di .gitconfig. Contohnya:

[alias]
    discard = "!f() { git add . && git stash && git stash drop stash@{0}; }; f"

Pemakaian: git discard

Agorreca
sumber
1
Alias ​​ini saya sangat suka
bendera
3

Solusi alternatif adalah dengan melakukan perubahan, dan kemudian menyingkirkan komitmen tersebut. Ini tidak memiliki manfaat langsung pada awalnya, tetapi membuka kemungkinan untuk melakukan potongan, dan untuk membuat tag git untuk cadangan.

Anda dapat melakukannya di cabang saat ini, seperti ini:

git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git revert HEAD
git reset HEAD^^

Atau Anda dapat melakukannya di HEAD terpisah. (dengan asumsi Anda mulai di cabang BRANCHNAME):

git checkout --detach HEAD
git add (-A) .
git commit -m"DISCARD: Temporary local changes"
git tag archive/local-changes-2015-08-01  # optional
git checkout BRANCHNAME

Namun, apa yang biasanya saya lakukan adalah dengan melakukan potongan, kemudian beri nama beberapa atau semua komit sebagai "DISCARD: ...". Kemudian gunakan rebase interaktif untuk menghapus komitmen buruk dan menjaga yang baik.

git add -p  # Add changes in chunks.
git commit -m"DISCARD: Some temporary changes for debugging"
git add -p  # Add more stuff.
git commit -m"Docblock improvements"
git tag archive/local-changes-2015-08-01
git rebase -i (commit id)  # rebase on the commit id before the changes.
  # Remove the commits that say "DISCARD".

Ini lebih bertele-tele, tetapi memungkinkan untuk meninjau perubahan mana yang ingin Anda buang.

The git loldangit lola cara pintas telah sangat membantu dengan alur kerja ini.

donquixote
sumber
3

Untuk folder tertentu yang saya gunakan:

git checkout -- FolderToClean/*
Glauco Neves
sumber
3
Itu tidak menghapus file yang tidak dilacak, seperti yang dinyatakan OP.
vonbrand
0

Ini mungkin jawaban noob, tetapi: Saya menggunakan TortoiseGit untuk windows dan memiliki fitur yang bagus yang disebut REVERT. Jadi yang Anda lakukan untuk mengembalikan perubahan nonpushed lokal yang tidak bertahap adalah:

  1. memunculkan menu konteks untuk folder yang diperlukan dan pilih kembali, itu menunjukkan popup kembali di mana Anda dapat memilih file yang diubah untuk mengembalikan / memulihkan.
  2. Jika Anda juga ingin menghapus file yang ditambahkan (yang belum ada di git) klik komit (dari menu konteks yang sama) itu memunculkan popup Komit dan menunjukkan kepada Anda file yang ditambahkan, kemudian klik kanan masing-masing dan pilih hapus. Tapi jangan tekan Komit btn di sembulan ini, karena Anda tidak ingin komit, tetapi hanya melihat file yang ditambahkan dan menghapusnya dari sini.
Oleg Vorontsov
sumber