Bagaimana cara membatalkan 'git reset'?

1313

Apa cara paling sederhana untuk membatalkan

git reset HEAD~

perintah? Saat ini, satu-satunya cara yang dapat saya pikirkan adalah melakukan "git clone http: // ..." dari repo jarak jauh.

Andriy Drozdyuk
sumber
2
Jika ada yang mencari cara untuk membatalkan hard reset, centang di Undoing a git reset --hard HEAD ~ 1 . Solusinya sangat mirip.
1
Kemungkinan rangkap dari Bagaimana saya bisa membatalkan git reset --hard HEAD ~ 1?
underscore_d
2
Ini bukan duplikat dari pertanyaan terkait --hard! Risiko menjalankan perintah ini secara tidak sengaja jauh lebih tinggi. Misalnya, Anda ingin menghapus unstage satu file dengan git reset foo-file. Anda hanya menulis bagian pertama dari nama file, tekan tab untuk pelengkapan otomatis, itu benar-benar selesai dengan nama cabang, Anda tidak memperhatikannya dan menjalankan perintah git reset foo-branchsebagai gantinya. Voilà
Yushin Washio

Jawaban:

2389

Jawaban singkat:

git reset 'HEAD@{1}'

Jawaban panjang:

Git menyimpan log semua pembaruan ref (misalnya, checkout, reset, komit, gabung). Anda dapat melihatnya dengan mengetik:

git reflog

Di suatu tempat dalam daftar ini adalah komit yang hilang. Katakanlah Anda baru saja mengetik git reset HEAD~dan ingin membatalkannya. Reflog saya terlihat seperti ini:

$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]

Baris pertama mengatakan bahwa HEAD0 posisi yang lalu (dengan kata lain, posisi saat ini) adalah 3f6db14; itu diperoleh dengan mengatur ulang ke HEAD~. Baris kedua mengatakan bahwa HEAD1 posisi yang lalu (dengan kata lain, status sebelum reset) adalah d27924e. Itu diperoleh dengan memeriksa komit tertentu (meskipun itu tidak penting sekarang). Jadi, untuk membatalkan pengaturan ulang, jalankan git reset HEAD@{1}(atau git reset d27924e).

Jika, di sisi lain, Anda telah menjalankan beberapa perintah lain sejak saat itu memperbarui HEAD, komit yang Anda inginkan tidak akan berada di bagian atas daftar, dan Anda harus mencari melalui reflog.

Satu catatan terakhir: Mungkin lebih mudah untuk melihat reflogcabang tertentu yang ingin Anda hapus, katakanlah master, daripada HEAD:

$ git reflog show master
c24138b master@{0}: merge origin/master: Fast-forward
90a2bf9 master@{1}: merge origin/master: Fast-forward
[...]

Ini seharusnya memiliki lebih sedikit noise daripada yang umum HEAD reflog.

Mark Lodato
sumber
25
Sebagai alternatif yang lebih visual dan bagus refloguntuk tujuan ini, saya suka menggunakannya git log --graph --decorate --oneline $(git rev-list -g --all). Ini menunjukkan pohon dari semua komitmen, termasuk menggantung cabang yang tidak disebutkan namanya
texasflood
1
Katakanlah saya memiliki direktori dengan file yang ada di dalamnya. Dalam direktori ini saya jalankan git init, dan kemudian setelah itu git reset --hard. Tidak ada reflog, atau bahkan log untuk memulai. Apakah file-file ini bersulang cukup banyak sekarang?
AlanSE
@AlanSE, sayangnya file-file itu bersulang, sejauh yang saya tahu. Jika Anda belum pernah melakukan git add(yaitu tidak pernah mementaskan versi file itu), maka git checkoutatau git reset --hardakan membuang satu-satunya salinan (direktori kerja) tanpa cadangan. Saya berharap tidak.
Mark Lodato
2
git reset HEAD~12oops ... git reset HEAD@{12}nooo .. 'git reflog' untuk menyelamatkan! oh itu hanyagit reset HEAD@{1}
Dennis
Setelah membaca artikel git -scm.com/blog/2011/07/11/reset.html git-reset yang sangat baik, saya sedikit kurang bingung.
Andriy Drozdyuk
192

Pertanyaan lama, dan jawaban yang diposting berfungsi dengan baik. Saya akan berpadu dengan opsi lain.

git reset ORIG_HEAD

ORIG_HEADreferensi komit yang HEADsebelumnya direferensikan.

Dan Fischer
sumber
1
Ini tampak hebat - apakah Anda bisa menguraikan? Apakah "ORIG" di sini singkat untuk "asli" atau untuk "asal"? ... Yaitu, apakah itu mengatur ulang ke tempat KEPALA sebelum mulai monyet dengan itu? Atau ke tempat asal HEAD? Apa yang terjadi jika Anda telah memindahkan HEAD beberapa kali sebelum git reset ORIG_HEAD? Terima kasih.
Benjohn
ORIG singkatan asli, ORIG_HEAD berarti KEPALA asli, sebelum reset
Sam Gallagher
"Operasi tertentu, seperti menggabungkan dan mengatur ulang, merekam versi HEAD sebelumnya di ORIG_HEAD sesaat sebelum menyesuaikannya dengan nilai baru. Anda dapat menggunakan ORIG_HEAD untuk memulihkan atau kembali ke keadaan sebelumnya atau untuk membuat perbandingan." Kutipan dari buku: "Kontrol Versi dengan Git"
Amirreza
56

Situasi saya sedikit berbeda, saya lakukan git reset HEAD~tiga kali.

Untuk membatalkannya saya harus lakukan

git reset HEAD@{3}

jadi kamu harus bisa melakukannya

git reset HEAD@{N}

Tetapi jika Anda telah melakukan git reset menggunakan

git reset HEAD~3

Anda perlu melakukannya

git reset HEAD@{1}

Karena {N} mewakili jumlah operasi di Reflog. Seperti yang ditunjukkan Mark dalam komentar.

zainengineer
sumber
2
opsi yang diterima tidak memberikan contoh untuk maju NI berada dalam situasi satu jam yang lalu di mana saya ingin meneruskan lebih dari 1. Mencoba dengan beberapa dan berhasil. Ingin menambahkan itu di sini. Akan berguna bagi orang yang mencari undo reset dengan git reset HEAD ~ 3
zainengineer
3
tetapi jika seseorang telah melakukan git reset HEAD ~ 3 dia dapat dengan cepat melihat cara membatalkannya, git reset HEAD @ {3} diperlukan tanpa masuk ke reflog git reset HEAD ~ 3 dll adalah situasi yang umum
zainengineer
1
Saya pikir siapa pun yang melihat {1} / {2} akan menyadari bahwa nomor tersebut dapat berupa angka revisi, yang reflogdisediakan perintah untuk Anda. Setuju bahwa poin Anda tentang angka sama untuk kedua arah ~ 3 / @ {3} tetapi tidak benar-benar perlu menjadi jawaban baru.
Clint
30

1.Gunakan git refloguntuk mendapatkan semua pembaruan referensi.

2.git reset <id_of_commit_to_which_you_want_restore>

omilus
sumber