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:
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}
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.
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.
--hard
! Risiko menjalankan perintah ini secara tidak sengaja jauh lebih tinggi. Misalnya, Anda ingin menghapus unstage satu file dengangit 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 perintahgit reset foo-branch
sebagai gantinya. VoilàJawaban:
Jawaban singkat:
Jawaban panjang:
Git menyimpan log semua pembaruan ref (misalnya, checkout, reset, komit, gabung). Anda dapat melihatnya dengan mengetik:
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:Baris pertama mengatakan bahwa
HEAD
0 posisi yang lalu (dengan kata lain, posisi saat ini) adalah 3f6db14; itu diperoleh dengan mengatur ulang keHEAD~
. Baris kedua mengatakan bahwaHEAD
1 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, jalankangit reset HEAD@{1}
(ataugit 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
reflog
cabang tertentu yang ingin Anda hapus, katakanlah master, daripadaHEAD
:Ini seharusnya memiliki lebih sedikit noise daripada yang umum
HEAD reflog
.sumber
reflog
untuk tujuan ini, saya suka menggunakannyagit log --graph --decorate --oneline $(git rev-list -g --all)
. Ini menunjukkan pohon dari semua komitmen, termasuk menggantung cabang yang tidak disebutkan namanyagit init
, dan kemudian setelah itugit reset --hard
. Tidak ada reflog, atau bahkan log untuk memulai. Apakah file-file ini bersulang cukup banyak sekarang?git add
(yaitu tidak pernah mementaskan versi file itu), makagit checkout
ataugit reset --hard
akan membuang satu-satunya salinan (direktori kerja) tanpa cadangan. Saya berharap tidak.git reset HEAD~12
oops ...git reset HEAD@{12}
nooo .. 'git reflog' untuk menyelamatkan! oh itu hanyagit reset HEAD@{1}
Pertanyaan lama, dan jawaban yang diposting berfungsi dengan baik. Saya akan berpadu dengan opsi lain.
git reset ORIG_HEAD
ORIG_HEAD
referensi komit yangHEAD
sebelumnya direferensikan.sumber
git reset ORIG_HEAD
? Terima kasih.Situasi saya sedikit berbeda, saya lakukan
git reset HEAD~
tiga kali.Untuk membatalkannya saya harus lakukan
jadi kamu harus bisa melakukannya
Tetapi jika Anda telah melakukan git reset menggunakan
Anda perlu melakukannya
Karena {N} mewakili jumlah operasi di Reflog. Seperti yang ditunjukkan Mark dalam komentar.
sumber
reflog
disediakan perintah untuk Anda. Setuju bahwa poin Anda tentang angka sama untuk kedua arah ~ 3 / @ {3} tetapi tidak benar-benar perlu menjadi jawaban baru.1.Gunakan
git reflog
untuk mendapatkan semua pembaruan referensi.2.
git reset <id_of_commit_to_which_you_want_restore>
sumber