Bagaimana cara membuang perubahan dalam copy pekerjaan saya yang tidak ada dalam indeks?
git
version-control
Hanya baca
sumber
sumber
git-clean
hanya menghapus file yang tidak dilacak darigit-clean -df
bisa berbahaya. Ini akan menghapus file lokal yang tidak dilacak (misalnya ditutupi oleh .gitignore) Baca semua di bawah ini dengan cermat dan pertimbangkan checkout git. sebaliknyagit status
memberikan saran tentang cara melakukan itu!git checkout -- .
git status
memberikan saran:git restore
.git restore
adalah perintah baru persis untuk tujuan ini. Lihat pembaruan 2019 saya .Jawaban:
Cara lain yang lebih cepat adalah:
Anda tidak perlu memasukkan
--include-untracked
jika Anda tidak ingin menyeluruh tentang hal itu.Setelah itu, Anda dapat menjatuhkan simpanan itu dengan
git stash drop
perintah jika Anda mau.sumber
--include-untracked
.git reset
perintah akan membuang perubahan dalam indeks juga.git stash
, maupun variasi apa pungit checkout
akan membuang penghapusan yang tidak dipentaskan. Menurut hasil darigit status
, jawaban yang benar di sini adalah beberapa rasagit reset HEAD
git checkout -- .
melakukan pekerjaan dengan satu perintah saja.Untuk semua file yang tidak dipentaskan dalam direktori kerja saat ini, gunakan:
Untuk penggunaan file tertentu:
--
di sini untuk menghapus ambiguasi argumen .sumber
git status
error: The following untracked working tree files would be overwritten by checkout: ...
.git checkout -- .
berarti hal yang sama dengangit 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 melakukannyagit checkout branch-name directory-or-file-name
secara umum, Anda mendapatkan versi HEAD daridirectory-or-file-name
cabangbranch-name
.Sepertinya solusi lengkapnya adalah:
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 ) dangit checkout
menghapus semua perubahan yang tidak dipentaskan.sumber
git reset --hard
Ini memeriksa indeks saat ini untuk direktori saat ini, membuang semua perubahan dalam file dari direktori saat ini ke bawah.
atau ini yang memeriksa semua file dari indeks, menimpa file pohon yang berfungsi.
sumber
git checkout .
dangit checkout -- .
?git stash save --keep-index
.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 padaclean.requireForce
pengaturan)Jalankan
git help clean
untuk melihat manualsumber
Favorit saya adalah
Itu memungkinkan Anda secara selektif mengembalikan potongan.
Lihat juga:
sumber
-p
menambah lapisan keamanan ekstra yang bagus. Gabungkan dengangit clean -d
untuk benar-benar menjawab OP.Karena tidak ada jawaban yang menyarankan kombinasi opsi yang tepat yang saya gunakan, ini dia:
Ini adalah teks bantuan online untuk
git clean
opsi 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
-f
opsi dua kali jika Anda benar-benar ingin menghapus direktori seperti itu.-f
Jika variabel konfigurasi Git
clean.requireForce
tidak diatur kefalse
, Git bersih akan menolak untuk menghapus file atau direktori kecuali diberikan-f
,-n
atau-i
. Git akan menolak untuk menghapus direktori dalam.git
subdirektori atau file, kecuali satu detik-f
diberikan.-x
Jangan gunakan aturan abaikan dari
.gitignore
(per direktori) dan$GIT_DIR/info/exclude
, tapi tetap gunakan aturan abaikan yang diberikan dengan-e
opsi. Ini memungkinkan menghapus semua file yang tidak dilacak, termasuk membangun produk. Ini dapat digunakan (mungkin bersama-sama dengangit reset
) untuk membuat direktori kerja murni untuk menguji membangun bersih.Juga,
git checkout .
perlu dilakukan di root repo.sumber
git reset --hard
? (yang sebenarnya setara dengangit reset --hard HEAD
dan harus bekerja mana saja yang merupakan direktori saat ini ...)git clean -dfx
, berikut adalah tip yang saya gunakan untuk berada di sisi aman sebelum menjalankannya: jalankan sajagit clean -d -x -n
sebelumnya, untuk menampilkan daftar file yang akan dihapus, kemudian konfirmasikan operasi dengan menjalankangit clean -d -x -f
(saya berikan argumen-n
, resp.-f
pada akhirnya untuk dapat dengan cepat mengubahnya di terminal).gitignore
dalamnya Anda akan kehilangan mereka. Jadi pertimbangkan untuk mencadangkan proyek Anda sebelum ini.Jika Anda hanya ingin menghapus perubahan pada file yang ada , gunakan
checkout
( didokumentasikan di sini ).--
) memberi tahu Git bahwa yang berikut harus diambil sebagai argumen kedua (path), bahwa Anda melewatkan spesifikasi cabang..
) menunjukkan semua jalur.Jika Anda ingin menghapus file yang ditambahkan sejak komit terakhir Anda, gunakan
clean
( didokumentasikan di sini ):-i
inisiat pilihan interaktifclean
, untuk mencegah penghapusan keliru.Jika Anda ingin memindahkan perubahan ke ruang penyimpanan untuk akses nanti , gunakan
stash
( didokumentasikan di sini ):sumber
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:
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
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 stash
adalah 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.
sumber
Cara termudah untuk melakukan ini adalah dengan menggunakan perintah ini:
Perintah ini digunakan untuk membuang perubahan dalam direktori kerja -
https://git-scm.com/docs/git-checkout
Dalam perintah git, penyimpanan file yang tidak terlacak dicapai dengan menggunakan:
http://git-scm.com/docs/git-stash
sumber
.
bagian akhirnya. Untuk masa depan saya: periode ini sangat penting !git clean -fd
membersihkan file yang tidak ada dalam indeks.Jika Anda tidak tertarik untuk menjaga perubahan yang tidak dipentaskan (terutama jika perubahan yang dipentaskan adalah file baru), saya menemukan ini berguna:
sumber
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.
sumber
Saat Anda mengetik status git, (gunakan "checkout git - ..." untuk membuang perubahan di direktori yang berfungsi) ditampilkan.
misalnya
git checkout -- .
sumber
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:
jika Anda memeriksa apakah semuanya baik-baik saja, buang simpanan:
Jawaban dari Bilal Maqsood dengan
git clean
juga bekerja untuk saya, tetapi dengan simpanan saya memiliki lebih banyak kontrol - jika saya tidak sengaja, saya masih bisa mendapatkan perubahan saya kembaliMEMPERBARUI
Saya pikir ada 1 perubahan lagi (tidak tahu mengapa ini bekerja untuk saya sebelumnya):
git add . -A
dari padagit add .
tanpa
-A
file yang dihapus tidak akan dipentaskansumber
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-alihgit checkout
seperti 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:
Misalnya, untuk mengembalikan semua perubahan yang tidak dilakukan di direktori saat ini, Anda dapat menjalankan:
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: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:Jadi mungkin saja jawaban ini menjadi usang jika perilakunya berubah di masa depan. Karena itu mungkin bijaksana untuk menjalankan quick
man git-restore
sebelum menggunakannya.sumber
git restore .
berfungsi dengan baik. Terima kasih.git restore <filename>
dan itu bekerja dengan sempurna.git restore .
mengembalikan semua file dalam direktori saat ini, bukan di seluruh repositori.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).
Lalu saya
Lalu saya reset ke asal
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.
sumber
git reset --hard @{u}
yang menyetel ulang cabang ke mana pun cabang pelacakan jarak jauh saat iniSudah mencoba semua solusi di atas tetapi masih belum bisa menyingkirkan file baru yang belum dipentaskan.
Gunakan
git clean -f
untuk menghapus file-file baru itu - dengan hati-hati! Perhatikan opsi gaya.sumber
katakan saja
Ini akan menghapus semua perubahan lokal Anda. Anda juga bisa menggunakannya nanti dengan mengatakan
atau git simpanan pop
sumber
Cukup gunakan:
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):Meskipun demikian, saya suka
git stash -u
yang terbaik karena "membuang" semua perubahan yang terlacak dan tidak terlacak hanya dalam satu perintah . Namungit checkout -- .
hanya membuang dilacak perubahan, dangit clean -df
perubahan hanya membuang tidak terlacak ... dan mengetik kedua perintah ini jauh terlalu banyak pekerjaan :)sumber
git stash -u
akan segera (Git 2.14.x / 2.15, Q3 2017) sedikit berkembang: stackoverflow.com/a/46027357/6309git stash -k
menurut saya.Untuk membuang secara permanen:
git reset --hard
Untuk menyimpan perubahan untuk nanti:
git stash
sumber
Ini berfungsi bahkan di direktori yang; di luar izin git normal.
Terjadi pada saya baru-baru ini
sumber
git help clean
"-d Hapus direktori yang tidak bisa dilacak selain file yang tidak dilacak."Anda memiliki perintah git yang sangat sederhana
git checkout .
sumber
sumber
Menurutku,
harus melakukan trik. Sesuai dokumentasi Git di git clean
Deskripsi
Pilihan
sumber
Apa pun status repo Anda, Anda selalu dapat mengatur ulang ke komit sebelumnya:
Ini akan membuang semua perubahan yang dilakukan setelah komit itu.
sumber
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).
sumber
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):
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.
sumber
Saat Anda ingin mentransfer simpanan ke orang lain:
Seperti yang dikomentari, mungkin untuk memberi nama simpanan. Nah, gunakan ini jika Anda ingin membagikan simpanan Anda;)
sumber
git stash save "Feature X work in progress"
.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
Kemudian Anda dapat menggunakannya sebagai berikut untuk membuang semua perubahan:
Atau hanya sebuah file:
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
Jadi penggunaannya sederhana seperti berikut:
Sekarang tersedia di repo Github berikutnya yang berisi banyak alias:
sumber
Saya memiliki situasi aneh di mana file selalu tidak dipentaskan, ini membantu saya untuk menyelesaikannya.
sumber