git membatalkan semua perubahan yang tidak dikomit atau tidak disimpan

834

Saya mencoba untuk membatalkan semua perubahan sejak komit terakhir saya. Saya mencoba git reset --harddan git reset --hard HEADsetelah melihat posting ini . Saya merespons dengan kepala sekarang di 18c3773 ... tetapi ketika saya melihat sumber lokal saya semua file masih ada. Apa yang saya lewatkan?

Antarr Byrd
sumber
1
Ini adalah sumber yang bagus langsung dari Github: Cara membatalkan (hampir) apa pun dengan Git
jasonleonhard
Mudah dimengerti dan mudah dibaca: git-scm.com/book/en/v2/Git-Basics-Undoing-Things
MyTitle

Jawaban:

1620
  • Ini akan membatalkan pentas semua file yang mungkin telah Anda tampilkan git add:

    git reset
    
  • Ini akan mengembalikan semua perubahan yang tidak dikomit lokal (harus dijalankan di root repo):

    git checkout .
    

    Anda juga dapat mengembalikan perubahan yang tidak dikomit hanya ke file atau direktori tertentu:

    git checkout [some_dir|file.txt]
    

    Namun cara lain untuk mengembalikan semua perubahan yang tidak dikomit (untuk mengetik, tetapi berfungsi dari subdirektori mana pun):

    git reset --hard HEAD
    
  • Ini akan menghapus semua file lokal yang tidak dilacak , sehingga hanya file git yang dilacak yang tersisa:

    git clean -fdx
    

    PERINGATAN: -x juga akan menghapus semua file yang diabaikan, termasuk yang ditentukan oleh .gitignore! Anda mungkin ingin menggunakan -npratinjau file yang akan dihapus.


Singkatnya: menjalankan perintah di bawah ini pada dasarnya sama dengan segar git clonedari sumber asli (tetapi tidak mengunduh ulang apa pun, jadi jauh lebih cepat):

git reset
git checkout .
git clean -fdx

Penggunaan umum untuk ini adalah dalam skrip build, ketika Anda harus memastikan bahwa pohon Anda benar-benar bersih - tidak memiliki modifikasi atau file objek yang dibuat secara lokal atau membuat artefak, dan Anda ingin membuatnya bekerja sangat cepat dan tidak mengulangi clone seluruh repositori setiap saat.

mvp
sumber
@turibe itu benar. Saya harus memulai proyek saya beberapa kali karena itu menghapus semua dependensi yang diunduh dan folder .idea saya. Butuh solusi yang lebih baik.
EresDev
2
@ EresDev, Anda tidak harus mengeksekusi git clean, itu akan membatalkan perubahan yang tidak dikomit tetapi menyimpan semua file yang tidak dilacak atau ditambahkan. Tetapi, ini dapat memengaruhi hasil pembangunan karena beberapa file yang tidak terlacak mungkin mengganggu. Misalnya bagaimana jika direktori .idea Anda rusak?
mvp
git resetmemberi tahu saya bahwa saya memiliki perubahan yang harus saya selamatkan
Daniel Springer
1
menjalankan git clean -fdxmenghapus saya node_modulesdan .env, hebat
fires3as0n
1
@ fires3as0n Apa lagi yang Anda harapkan? Ini pasti akan terjadi. Ada peringatan dalam jawabannya juga.
Rishav
148

Jika Anda ingin " membatalkan " semua perubahan yang tidak dikomit, jalankan saja:

git stash
git stash drop

Jika Anda memiliki file yang tidak dilacak (periksa dengan menjalankan git status), ini dapat dihapus dengan menjalankan:

git clean -fdx

git stashmenciptakan simpanan baru yang akan menjadi simpanan @ {0} . Jika Anda ingin memeriksa dulu, Anda dapat berlari git stash listuntuk melihat daftar simpanan Anda. Ini akan terlihat seperti:

stash@{0}: WIP on rails-4: 66c8407 remove forem residuals
stash@{1}: WIP on master: 2b8f269 Map qualifications
stash@{2}: WIP on master: 27a7e54 Use non-dynamic finders
stash@{3}: WIP on blogit: c9bd270 some changes

Setiap simpanan dinamai setelah komit pesan sebelumnya.

Abram
sumber
2
Sebuah solusi yang bagus memang tetapi Anda perlu melakukan perubahan menggunakan git add .sebelumnya git stashkarena itu menunjukkan saya perubahan yang tidak berkomitmen bahkan setelahgit stash
EresDev
21

ada juga git stash- yang "menyembunyikan" perubahan lokal Anda dan dapat diterapkan kembali di lain waktu atau dibatalkan jika tidak lagi diperlukan

info lebih lanjut tentang penyimpanan

keshav
sumber
12

Saya menggunakan hierarki sumber .... Anda dapat mengembalikan semua perubahan yang tidak dikomit dengan 2 langkah mudah:

1) hanya perlu mengatur ulang status file ruang kerja

masukkan deskripsi gambar di sini 2) pilih semua file unstage (perintah + a), klik kanan dan pilih hapus

masukkan deskripsi gambar di sini

Sesederhana itu: D

pengguna1872384
sumber
Jika Anda mengatur ulang dan kemudian mengubah cabang dan rebase pada cabang yang diatur ulang ini akan menyakitkan. Reset berguna, tetapi jangan digunakan untuk menjatuhkan perubahan yang tidak dikomit. Dalam kasus menjatuhkan perubahan yang tidak dikomit, cukup simpanan dan lepas simpanan.
Dinu Nicolae
10

Apa yang saya lakukan adalah

git add . (adding everything)
git stash 
git stash drop

Satu liner: git add . && git stash && git stash drop

Muntah
sumber
ini yang terbaik
Madrugada
7

Bagi mereka yang sampai di sini mencari apakah mereka bisa membatalkan git clean -f -d, dengan mana file dibuat dalam gerhana dihapus,

Anda dapat melakukan hal yang sama dari UI menggunakan "restore from local history" untuk ref: Restore from local history

Abdul Rahman K
sumber
3
Saya tidak memilih tetapi jawaban Anda kurang jelas pada niat Anda; akan membantu jika Anda menulis ulang kalimat pertama dalam jawabannya.
Mark Schultheiss
5

Menyatakan transisi dari satu komit ke komit baru

0. last commit,i.e. HEAD commit
1. Working tree changes, file/directory deletion,adding,modification.
2. The changes are staged in index
3. Staged changes are committed

Tindakan untuk transisi negara

0->1: manual file/directory operation
1->2: git add .
2->3: git commit -m "xxx"

Periksa perbedaan

0->1: git diff
0->2: git diff --cached
0->1, and 0->2: git diff HEAD
last last commit->last commit: git diff HEAD^ HEAD

Kembalikan ke komit terakhir

2->1: git reset
1->0: git checkout .     #only for tracked files/directories(actions include modifying/deleting tracked files/directories)
1->0: git clean -fdx     #only for untracked files/directories(action includes adding new files/directories)
2->1, and 1->0: git reset --hard HEAD

Setara dengan git clone, tanpa mengunduh ulang apa pun

git reset && git checkout . && git clean -fdx
Zii
sumber
Saya tidak melihat bagaimana ini berhubungan dengan pertanyaan yang diajukan. Ini hanya serangkaian resep aneh, tanpa zat nyata.
mvp