Bagaimana cara membuang perubahan yang tidak dilakukan di Git?

4820

Bagaimana cara membuang perubahan dalam copy pekerjaan saya yang tidak ada dalam indeks?

Hanya baca
sumber
9
git-cleanhanya menghapus file yang tidak dilacak dari
Yega
24
Untuk memperjelas komentar Asenar di atas, git-clean -dfbisa berbahaya. Ini akan menghapus file lokal yang tidak dilacak (misalnya ditutupi oleh .gitignore) Baca semua di bawah ini dengan cermat dan pertimbangkan checkout git. sebaliknya
jacanterbury
15
'git clean -df' Diperingatkan! Saya mencoba itu dan kehilangan folder kunci yang tidak dapat dipulihkan ... Aduh!
Gabe Karkanis
46
memukul git statusmemberikan saran tentang cara melakukan itu! git checkout -- .
Paulo
4
@Paulo: mulai Juli 2019 git statusmemberikan saran: git restore. git restoreadalah perintah baru persis untuk tujuan ini. Lihat pembaruan 2019 saya .
prosoitos

Jawaban:

2686

Cara lain yang lebih cepat adalah:

git stash save --keep-index --include-untracked

Anda tidak perlu memasukkan --include-untrackedjika Anda tidak ingin menyeluruh tentang hal itu.

Setelah itu, Anda dapat menjatuhkan simpanan itu dengan git stash dropperintah jika Anda mau.

Greg Hewgill
sumber
122
Dan untuk menyeluruh tentang hal itu, Anda juga ingin --include-untracked.
TJ Crowder
9
@KarimSamir: Pertanyaan khusus menanyakan tentang perubahan yang tidak ada dalam indeks . The git resetperintah akan membuang perubahan dalam indeks juga.
Greg Hewgill
146
checkout git -. jauh lebih cepat
Frank
38
Baik git stash, maupun variasi apa pun git checkoutakan membuang penghapusan yang tidak dipentaskan. Menurut hasil dari git status, jawaban yang benar di sini adalah beberapa rasagit reset HEAD
Chris Warth
127
Ini mencemari tumpukan simpanan. git checkout -- .melakukan pekerjaan dengan satu perintah saja.
Felipe Tonello
5339

Untuk semua file yang tidak dipentaskan dalam direktori kerja saat ini, gunakan:

git checkout -- .

Untuk penggunaan file tertentu:

git checkout -- path/to/file/to/revert

--di sini untuk menghapus ambiguasi argumen .

Tobi
sumber
117
Ini sepertinya cara git kanonik. yaitu apa yang git katakan agar Anda lakukan jika Anda mengetikgit status
ABMagil
27
Tidak berfungsi jika ada file yang tidak dilacak. Kata Git error: The following untracked working tree files would be overwritten by checkout: ....
Michael Iles
92
pertanyaan pemula, apa artinya "git checkout -." maksud semantik?
kaid
120
@Ninjack git checkout -- .berarti hal yang sama dengan git checkout ., kecuali bahwa Anda eksplisit tentang fakta bahwa Anda tidak menentukan nama cabang. Mereka berdua mengatakan checkout versi HEAD di cabang saya saat ini untuk '.' atau './'. Jika Anda melakukannya git checkout branch-name directory-or-file-namesecara umum, Anda mendapatkan versi HEAD dari directory-or-file-namecabang branch-name.
akgill
23
IMO varian ini tidak sempurna, karena tidak menangani situasi ketika repositori Anda yang berubah tidak ada pada revisi KEPALA saat perubahan pembersihan dan Anda TIDAK ingin memperbaruinya ke KEPALA, dan ingin hanya membersihkan perubahan.
alexykot
1899

Sepertinya solusi lengkapnya adalah:

git clean -df
git checkout -- .

git clean menghapus semua file yang tidak dilacak ( tidak dilacak peringatan : sementara itu tidak akan menghapus file yang diabaikan yang disebutkan langsung di .gitignore, mungkin menghapus file yang diabaikan yang berada di folder ) dan git checkoutmenghapus semua perubahan yang tidak dipentaskan.

Mariusz Nowak
sumber
116
Dua jawaban lainnya tidak benar-benar berfungsi, yang ini berhasil.
John Hunt
18
@dval ini karena perintah pertama menghapus file yang tidak diindeks dan yang kedua menghapus perubahan yang tidak bertahap (dari file yang diindeks). Jadi jika Anda tidak memiliki perubahan bertahap, ini sama dengan kembali ke komitmen terakhir dengangit reset --hard
Amanuel Nega
3
gunakan -dff jika direktori yang tidak dilacak adalah klon git.
accuya
87
Hati-hati menjalankan git clean -df. Jika Anda tidak mengerti apa fungsinya, Anda mungkin menghapus file yang ingin Anda simpan, seperti robots.txt, file yang diunggah, dll.
ctlockey
40
Seperti yang dikatakan @ctlockey, perintah pertama juga menghapus direktori jika hanya terdiri dari file-file yang diabaikan ... Kehilangan banyak file konfigurasi pada proyek saya :( Hati-hati.
Maxime Lorant
326

Ini memeriksa indeks saat ini untuk direktori saat ini, membuang semua perubahan dalam file dari direktori saat ini ke bawah.

git checkout .

atau ini yang memeriksa semua file dari indeks, menimpa file pohon yang berfungsi.

git checkout-index -a -f
CB Bailey
sumber
28
Hai, apa perbedaan antara git checkout .dan git checkout -- .?
Evan Hu
5
@ Evan: Tidak ada perbedaan dalam hal ini.
Robert Siemer
10
@Robert Siemer dan dalam kasus umum?
RJFalconer
2
@Van: tempat yang buruk untuk menanyakan pertanyaan ini. - Ini tidak terkait dengan pertanyaan OP, dan tidak terkait dengan jawaban di sini.
Robert Siemer
14
+1 Ini adalah JAWABAN YANG TEPAT, karena menangani kasus dengan benar di mana beberapa file telah melakukan perubahan bertahap dan tidak bertahap. Perhatikan bahwa solusi ini MENGHILANGKAN perubahan yang tidak dipentaskan; jika Anda ingin mempertahankannya, maka Anda harus menggunakan jawaban @ greg-hewgill dari git stash save --keep-index.
Rhubbarb
248
git clean -df

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

-d: Hapus direktori tidak terlacak selain file tidak terlacak

-f: Memaksa (mungkin tidak perlu tergantung pada clean.requireForce pengaturan)

Jalankan git help cleanuntuk melihat manual

Elvis Ciotti
sumber
mengapa jawaban ini tidak memiliki semua suara? menjawab kembali pada tahun 2011 dan masih benar.
Eugene Braginets
106

Favorit saya adalah

git checkout -p

Itu memungkinkan Anda secara selektif mengembalikan potongan.

Lihat juga:

git add -p
Ben
sumber
9
Saya suka kemampuan untuk melihat perubahan yang sebenarnya sebelum dibuang.
Penghe Geng
Inilah yang saya gunakan. git checkout -p dan kemudian "a" untuk menerima semua.
Mattis
2
Saya tidak pernah memikirkannya. Itu -pmenambah lapisan keamanan ekstra yang bagus. Gabungkan dengan git clean -duntuk benar-benar menjawab OP.
Stephan Henningsen
96

Karena tidak ada jawaban yang menyarankan kombinasi opsi yang tepat yang saya gunakan, ini dia:

git clean -dfx
git checkout .

Ini adalah teks bantuan online untuk git cleanopsi yang digunakan :

-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 -fopsi dua kali jika Anda benar-benar ingin menghapus direktori seperti itu.

-f

Jika variabel konfigurasi Git clean.requireForcetidak diatur ke false, Git bersih akan menolak untuk menghapus file atau direktori kecuali diberikan -f, -natau -i. Git akan menolak untuk menghapus direktori dalam .gitsubdirektori atau file, kecuali satu detik -fdiberikan.

-x

Jangan gunakan aturan abaikan dari .gitignore(per direktori) dan $GIT_DIR/info/exclude, tapi tetap gunakan aturan abaikan yang diberikan dengan -eopsi. Ini memungkinkan menghapus semua file yang tidak dilacak, termasuk membangun produk. Ini dapat digunakan (mungkin bersama-sama dengan git reset) untuk membuat direktori kerja murni untuk menguji membangun bersih.

Juga, git checkout .perlu dilakukan di root repo.

Martin G
sumber
+1 untuk solusi ini. Mengenai komentar Anda bahwa "git checkout. Perlu dilakukan di root repo", mungkin Anda mungkin menyebutkan kami hanya bisa melakukannya git reset --hard? (yang sebenarnya setara dengan git reset --hard HEADdan harus bekerja mana saja yang merupakan direktori saat ini ...)
ErikMD
2
Juga mengenai perintah pertama git clean -dfx, berikut adalah tip yang saya gunakan untuk berada di sisi aman sebelum menjalankannya: jalankan saja git clean -d -x -nsebelumnya, untuk menampilkan daftar file yang akan dihapus, kemudian konfirmasikan operasi dengan menjalankan git clean -d -x -f(saya berikan argumen -n, resp. -fpada akhirnya untuk dapat dengan cepat mengubahnya di terminal)
ErikMD
5
Catat dengan cepat bahwa ini tidak dapat dipulihkan, dan jika Anda memiliki file di .gitignoredalamnya Anda akan kehilangan mereka. Jadi pertimbangkan untuk mencadangkan proyek Anda sebelum ini.
Rob
69

Jika Anda hanya ingin menghapus perubahan pada file yang ada , gunakan checkout( didokumentasikan di sini ).

git checkout -- .
  • Tidak ada cabang yang ditentukan, jadi ini memeriksa cabang saat ini.
  • Tanda hubung ganda ( --) memberi tahu Git bahwa yang berikut harus diambil sebagai argumen kedua (path), bahwa Anda melewatkan spesifikasi cabang.
  • Tanda titik ( .) menunjukkan semua jalur.

Jika Anda ingin menghapus file yang ditambahkan sejak komit terakhir Anda, gunakan clean( didokumentasikan di sini ):

git clean -i 
  • The -iinisiat pilihan interaktif clean, untuk mencegah penghapusan keliru.
  • Sejumlah opsi lain tersedia untuk eksekusi yang lebih cepat; lihat dokumentasi.

Jika Anda ingin memindahkan perubahan ke ruang penyimpanan untuk akses nanti , gunakan stash( didokumentasikan di sini ):

git stash
  • Semua perubahan akan dipindahkan ke Git's Stash, untuk kemungkinan akses nanti.
  • Sejumlah pilihan tersedia untuk simpanan yang lebih bernuansa; lihat dokumentasi.
2540625
sumber
Ini akan mengubah konversi Anda dan membuang file yang baru ditambahkan dari komit sebelumnya.
Yohan Chung
memutakhirkan ini untuk penjelasan :)
Archie G. Quiñones
62

Saya benar-benar menemukan artikel ini bermanfaat untuk menjelaskan kapan harus menggunakan perintah apa: http://www.szakmeister.net/blog/2011/oct/12/reverting-changes-git/

Ada beberapa kasus berbeda:

  1. Jika Anda belum menampilkan file, maka Anda gunakan git checkout. Checkout "memperbarui file di pohon kerja untuk mencocokkan versi dalam indeks". Jika file belum dipentaskan (alias ditambahkan ke indeks) ... perintah ini pada dasarnya akan mengembalikan file ke apa komit terakhir Anda.

    git checkout -- foo.txt

  2. Jika Anda telah mengatur file, maka gunakan git reset. Atur ulang mengubah indeks untuk mencocokkan komit.

    git reset -- foo.txt

Saya menduga bahwa menggunakan git stashadalah pilihan populer karena sedikit kurang berbahaya. Anda selalu dapat kembali ke sana jika Anda secara tidak sengaja meniup terlalu jauh saat menggunakan git reset. Atur ulang bersifat rekursif secara default.

Lihatlah artikel di atas untuk saran lebih lanjut.

blak3r
sumber
60

Cara termudah untuk melakukan ini adalah dengan menggunakan perintah ini:

Perintah ini digunakan untuk membuang perubahan dalam direktori kerja -

git checkout -- .

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

Dalam perintah git, penyimpanan file yang tidak terlacak dicapai dengan menggunakan:

git stash -u

http://git-scm.com/docs/git-stash

AHM Forhadul Islam
sumber
19
Dua kali saya datang ke sini, membaca jawaban ini, dan melupakan .bagian akhirnya. Untuk masa depan saya: periode ini sangat penting !
bejado
2
Saya perlu menyingkirkan semua perubahan lokal di sub direktori, tanpa membuang setiap perubahan lainnya. Jawaban ini sangat membantu, terima kasih
Ally
2
Tolong jelaskan apa yang dilakukan kedua perintah. Sangat tidak membantu jika tidak memiliki penjelasan.
Chris Kennedy
2
luar biasa. checkout melakukan dalam satu perintah apa yang paling populer dilakukan dalam dua perintah. juga dapat ditindaklanjuti dengan git clean -fdmembersihkan file yang tidak ada dalam indeks.
oligofren
49

Jika Anda tidak tertarik untuk menjaga perubahan yang tidak dipentaskan (terutama jika perubahan yang dipentaskan adalah file baru), saya menemukan ini berguna:

git diff | git apply --reverse
Joshua Kunzmann
sumber
44

git checkout -f


man git-checkout:

-f, --force

Saat berganti cabang, lanjutkan bahkan jika indeks atau pohon kerja berbeda dari HEAD. Ini digunakan untuk membuang perubahan lokal.

Saat memeriksa jalur dari indeks, jangan gagal pada entri yang tidak di-emergasi; sebagai gantinya, entri yang tidak dihapus diabaikan.

Bijan
sumber
2
Ini akan membuang perubahan dalam indeks !! (Dan OP harus membiarkan mereka apa adanya.)
Robert Siemer
44

Saat Anda mengetik status git, (gunakan "checkout git - ..." untuk membuang perubahan di direktori yang berfungsi) ditampilkan.

misalnya git checkout -- .

Erdem ÖZDEMİR
sumber
1
Turun karena tidak membantu menghapus semua file dengan cepat. Tiga titik menunjukkan bahwa Anda diharuskan untuk membuat daftar semua file. Ini sangat buruk jika Anda perlu membuang banyak file sekaligus, mis. selama penggabungan besar setelah Anda melakukan semua modifikasi yang ingin Anda pertahankan
usr-local-ΕΨΗΕΛΩΝ
2
Tentu saja, perintah yang benar adalah "git checkout -." satu titik. Dalam komentar tersebut, ketiga titik itu adalah hal yang gramatikal, untuk menunjukkan ada banyak pilihan lain yang bisa digunakan ..
Josef.B
39

Anda dapat menggunakan simpanan git - jika terjadi kesalahan, Anda masih dapat kembali dari simpanan. Mirip dengan beberapa jawaban lain di sini, tetapi yang ini juga menghapus semua file yang tidak dipentaskan dan juga semua penghapusan yang tidak dipentaskan:

git add .
git stash

jika Anda memeriksa apakah semuanya baik-baik saja, buang simpanan:

git stash drop

Jawaban dari Bilal Maqsood dengan git cleanjuga bekerja untuk saya, tetapi dengan simpanan saya memiliki lebih banyak kontrol - jika saya tidak sengaja, saya masih bisa mendapatkan perubahan saya kembali

MEMPERBARUI

Saya pikir ada 1 perubahan lagi (tidak tahu mengapa ini bekerja untuk saya sebelumnya):

git add . -A dari pada git add .

tanpa -Afile yang dihapus tidak akan dipentaskan

Asped
sumber
39

Pembaruan 2019:

Sejak Juli 2019 , telah ada perintah baru yang tidak tepat ini: git restore.

Di git status, sekarang Git merekomendasikan untuk menggunakan perintah ini alih-alih git checkoutseperti biasanya.

Sementara perintah ini juga dapat digunakan untuk mengembalikan pohon kerja ke komit tertentu atau untuk mengembalikan konten indeks, secara default, pohon kerja dikembalikan ke status dalam indeks (apa yang ditanyakan di sini).

Jadi, untuk mengembalikan file yang cocok dengan pathspec (menyingkirkan perubahan yang tidak dipentaskan), Anda harus melakukan:

git restore <pathspec>

Misalnya, untuk mengembalikan semua perubahan yang tidak dilakukan di direktori saat ini, Anda dapat menjalankan:

git restore .

Jika Anda menjalankan ini dari root proyek, itu akan mengembalikan semua perubahan yang tidak dipentaskan di seluruh repositori.

Perhatikan bahwa, seperti halnya git checkout -- .(seperti yang ditunjukkan oleh Mariusz Nowak), ini hanya akan membuang perubahan pada file yang dilacak oleh Git dan tidak akan membuang file baru yang tidak terlacak. Jika Anda ingin membuang perubahan yang tidak bertahap, termasuk file baru yang tidak dilacak, Anda dapat menjalankan tambahan:

git clean -df

Berhati-hatilah dengan perintah ini nanti karena Anda mungkin membuang file yang tidak ingin Anda singkirkan.


Catatan pada git restore: karena ini adalah perintah baru, halaman manualnya memberikan peringatan:

Perintah ini bersifat eksperimental. Perilaku dapat berubah.

Jadi mungkin saja jawaban ini menjadi usang jika perilakunya berubah di masa depan. Karena itu mungkin bijaksana untuk menjalankan quick man git-restoresebelum menggunakannya.

prosoitos
sumber
2
Saya ingin mengembalikan perubahan yang tidak dipentaskan hanya tanpa memengaruhi file yang baru ditambahkan sehingga git restore .berfungsi dengan baik. Terima kasih.
Saurabh Misra
3
Saya lakukan git restore <filename>dan itu bekerja dengan sempurna.
Merlin
1
Bekerja dengan baik untuk saya.
Prometheus
1
Menurut halaman manual git restore .mengembalikan semua file dalam direktori saat ini, bukan di seluruh repositori.
jarno
1
Kamu benar. Terima kasih! Saya baru saja mengujinya dan memang demikian. Namun, ini bersifat rekursif. Jadi ketika dijalankan dari root proyek, itu berlaku untuk seluruh repositori. Saya akan mengedit jawaban saya.
prosoitos
35

Alih-alih membuang perubahan, saya mengatur ulang remote ke asal. Catatan - metode ini untuk mengembalikan folder Anda sepenuhnya ke repo.

Jadi saya melakukan ini untuk memastikan mereka tidak duduk di sana ketika saya git reset (nanti - tidak termasuk gitignores pada Origin / branchname)

CATATAN: Jika Anda ingin menyimpan file yang belum dilacak, tetapi tidak di GITIGNORE, Anda mungkin ingin melewati langkah ini, karena ini akan menghapus file yang tidak dilacak ini yang tidak ditemukan di repositori jarak jauh Anda (terima kasih @XtrmJosh).

git add --all

Lalu saya

git fetch --all

Lalu saya reset ke asal

git reset --hard origin/branchname

Itu akan mengembalikannya ke titik awal. Sama seperti RE-Kloning cabang, SAAT menyimpan semua file gitignored saya secara lokal dan di tempat.

Diperbarui per komentar pengguna di bawah ini: Variasi untuk mengatur ulang cabang apa pun saat ini yang digunakan pengguna.

git reset --hard @{u}
Nick
sumber
Ini adalah opsi yang saya sukai, tetapi mengapa Anda menambahkan semua perubahan terlebih dahulu? Sejauh yang saya tahu ini hanya mengubah daftar direktori dalam file Git, saat menggunakan git reset --hard, ini akan tetap hilang sementara direktori masih akan dihapus.
XtrmJosh
Saya tidak menggunakan mac atau linux, Windows PowerShell terkadang meninggalkan file di sana setelah reset. Saya pikir itu karena reset git mengatur semua file dalam repo ke keadaan semula. Jika mereka tidak ditambahkan, mereka tidak tersentuh. Klien desktop kemudian akan mengambil "hei file ini ada di sini dan perlu dikomit"
Nick
Masuk akal. Saya tidak menggunakan Windows jadi belum melihat masalah itu (setidaknya tidak menggunakan Windows selama beberapa bulan terakhir, tidak ingat banyak sebelumnya - ini adalah salah satu blur yang sangat disesalkan). Mungkin perlu dicatat alasannya dalam jawaban utama Anda :)
XtrmJosh
Saya menemukan masalah ini pada Mac juga sekarang. Jika file tidak dilacak dalam Repo kadang-kadang git reset tidak menyentuhnya. Saya benar-benar tidak dapat mengisolasi "MENGAPA" tetapi ketika itu terjadi, jika saya reset, dan saya masih memiliki 1 atau dua file yang tidak dikomit, saya menambahkan --semua dan reset --hard lagi
Nick
2
Variasi kecil yang menyenangkan dari yang saya suka ini adalah git reset --hard @{u}yang menyetel ulang cabang ke mana pun cabang pelacakan jarak jauh saat ini
user2221343
31

Sudah mencoba semua solusi di atas tetapi masih belum bisa menyingkirkan file baru yang belum dipentaskan.

Gunakan git clean -funtuk menghapus file-file baru itu - dengan hati-hati! Perhatikan opsi gaya.

Artur
sumber
21

katakan saja

git stash

Ini akan menghapus semua perubahan lokal Anda. Anda juga bisa menggunakannya nanti dengan mengatakan

git stash apply 

atau git simpanan pop

piyushmandovra
sumber
21

Cukup gunakan:

git stash -u

Selesai Mudah.

Jika Anda benar-benar peduli dengan tumpukan simpanan Anda maka Anda dapat mengikuti git stash drop. Tetapi pada saat itu Anda lebih baik menggunakan (dari Mariusz Nowak):

git checkout -- .
git clean -df

Meskipun demikian, saya suka git stash -uyang terbaik karena "membuang" semua perubahan yang terlacak dan tidak terlacak hanya dalam satu perintah . Namun git checkout -- .hanya membuang dilacak perubahan, dan git clean -dfperubahan hanya membuang tidak terlacak ... dan mengetik kedua perintah ini jauh terlalu banyak pekerjaan :)

Ben Wilde
sumber
Catatan: git stash -uakan segera (Git 2.14.x / 2.15, Q3 2017) sedikit berkembang: stackoverflow.com/a/46027357/6309
VonC
Jika saya mendapatkan pertanyaan OP, file yang diindeks harus disimpan. Hanya perubahan unstage yang harus dihapus. Jadi harus git stash -kmenurut saya.
jepret
21

Untuk membuang secara permanen: git reset --hard

Untuk menyimpan perubahan untuk nanti: git stash

SANGEETHA PH
sumber
16

Ini berfungsi bahkan di direktori yang; di luar izin git normal.

sudo chmod -R 664 ./* && git checkout -- . && git clean -dfx

Terjadi pada saya baru-baru ini

GlassGhost
sumber
Namun berhati-hatilah, bahwa git mengabaikan konten tidak akan mempertahankan izin aslinya! Karena itu dapat menyebabkan risiko keamanan.
twicejr
@twicejr Anda salah, harap baca git help clean"-d Hapus direktori yang tidak bisa dilacak selain file yang tidak dilacak."
GlassGhost
Mengapa Anda mengatur semua file Anda menjadi dunia baca / tulis? Bukan latihan yang bagus.
Ghoti
@ Ghoti buruk saya, 664 benar? Anda juga boleh mengedit jawabannya.
GlassGhost
Menetapkan semua izin ke 664 membuat banyak asumsi tentang jenis izin yang dibutuhkan proyek. Saya pikir menggunakan bagian perintah itu akan menimbulkan masalah bagi sebagian orang.
ianrandmckenzie
15

Anda memiliki perintah git yang sangat sederhana git checkout .

khem raj regmi
sumber
14
cd path_to_project_folder  # take you to your project folder/working directory 
git checkout .             # removes all unstaged changes in working directory
vivekporwal04
sumber
12

Menurutku,

git clean -df

harus melakukan trik. Sesuai dokumentasi Git di git clean

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

Deskripsi

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.

Jika ada ... argumen opsional yang diberikan, hanya jalur yang terpengaruh.

Pilihan

-d Hapus direktori yang tidak dilacak selain file yang tidak dilacak. 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.

-f --force Jika variabel konfigurasi Git clean.requireForce tidak disetel ke false, git clean akan menolak dijalankan kecuali diberikan -f, -n atau -i.

Lahiru
sumber
11

Apa pun status repo Anda, Anda selalu dapat mengatur ulang ke komit sebelumnya:

git reset --hard <commit hash>

Ini akan membuang semua perubahan yang dilakukan setelah komit itu.

msangel
sumber
2
Ini juga akan membuang semua yang ada dalam indeks (bukan hanya hal-hal yang tidak ada dalam indeks), yang melampaui apa yang diminta OP.
Linus Arver
10

Cara lain untuk menyingkirkan file baru yang lebih spesifik daripada git clean -df (ini akan memungkinkan Anda untuk menyingkirkan beberapa file belum tentu semua), adalah dengan menambahkan file baru ke indeks terlebih dahulu, kemudian simpanan, kemudian jatuhkan menyimpan.

Teknik ini berguna ketika, karena alasan tertentu, Anda tidak dapat dengan mudah menghapus semua file yang tidak terlacak dengan mekanisme biasa (seperti rm).

tjb
sumber
9

Berikut ini benar-benar hanya solusi jika Anda bekerja dengan garpu repositori di mana Anda secara teratur menyinkronkan (misalnya menarik permintaan) dengan repo lain. Jawaban singkat: hapus fork dan refork, tetapi baca peringatan di github .

Saya memiliki masalah yang sama, mungkin tidak identik, dan saya sedih mengatakan solusi saya tidak ideal, tetapi akhirnya efektif.

Saya sering memiliki pesan status git seperti ini (melibatkan setidaknya 2/4 file):

$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2var.dats
#
# 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:   doc/PROJECT/MEDIUM/ATS-constraint/constraint_s2Var.dats
#       modified:   doc/PROJECT/MEDIUM/ATS-constraint/parsing/parsing_s2Var.dats

Mata yang tajam akan mencatat bahwa file-file ini memiliki dopplegangers yang merupakan huruf tunggal dalam kasus off. Entah bagaimana, dan saya tidak tahu apa yang membuat saya memulai jalur ini (karena saya tidak bekerja dengan file-file ini sendiri dari repo hulu), saya telah mengganti file-file ini. Coba banyak solusi yang tercantum di halaman ini (dan halaman lain) tampaknya tidak membantu.

Saya bisa memperbaiki masalah dengan menghapus repositori bercabang saya dan semua repositori lokal, dan reforking. Ini saja tidak cukup; upstream harus mengganti nama file yang dimaksud ke nama file baru. Selama Anda tidak memiliki pekerjaan yang tidak dikomit, tidak ada wiki, dan tidak ada masalah yang menyimpang dari repositori hulu, Anda harus baik-baik saja. Hulu mungkin tidak terlalu senang dengan Anda, untuk sedikitnya. Adapun masalah saya, tidak diragukan lagi kesalahan pengguna karena saya tidak begitu mahir dengan git, tetapi fakta bahwa itu jauh dari mudah untuk memperbaiki poin ke masalah dengan git juga.

bbarker
sumber
7

Saat Anda ingin mentransfer simpanan ke orang lain:

# add files
git add .  
# diff all the changes to a file
git diff --staged > ~/mijn-fix.diff
# remove local changes 
git reset && git checkout .
# (later you can re-apply the diff:)
git apply ~/mijn-fix.diff

Seperti yang dikomentari, mungkin untuk memberi nama simpanan. Nah, gunakan ini jika Anda ingin membagikan simpanan Anda;)

dua kali
sumber
5
Sebenarnya Git simpanan dapat memiliki judul. Misalnya git stash save "Feature X work in progress".
Colin D Bennett
7

Anda dapat membuat alias sendiri yang menjelaskan cara melakukannya secara deskriptif.

Saya menggunakan alias berikutnya untuk membuang perubahan.


Buang perubahan dalam (daftar) file di pohon kerja

discard = checkout --

Kemudian Anda dapat menggunakannya sebagai berikut untuk membuang semua perubahan:

discard .

Atau hanya sebuah file:

discard filename

Kalau tidak, jika Anda ingin membuang semua perubahan dan juga file yang tidak terlacak, saya menggunakan campuran checkout dan clean:

Bersihkan dan buang perubahan dan file yang tidak terlacak di pohon kerja

cleanout = !git clean -df && git checkout -- .

Jadi penggunaannya sederhana seperti berikut:

cleanout

Sekarang tersedia di repo Github berikutnya yang berisi banyak alias:

Pau
sumber
7

Saya memiliki situasi aneh di mana file selalu tidak dipentaskan, ini membantu saya untuk menyelesaikannya.

git rm .gitattributes
git add -A
git reset --hard

SDV
sumber