Bagaimana saya bisa membatalkan reset git --hard HEAD ~ 1?

Bisakah saya membatalkan perubahan yang disebabkan oleh perintah berikut? Jika ya, bagaimana caranya?

 git reset --hard HEAD~1 
852
08 авг. diatur oleh Paul Wicks 08 Agustus. 2008-08-08 02:22 '08 pukul 2:22 2008-08-08 02:22
@ 12 jawaban

Pat Notts benar. Anda dapat mengembalikan fiksasi selama dibutuhkan beberapa hari. git hanya sampah yang dikumpulkan dalam waktu sekitar satu bulan atau lebih, kecuali jika Anda secara eksplisit mengatakannya untuk menghapus tetes baru.

 $ git init Initialized empty Git repository in .git/ $ echo "testing reset" > file1 $ git add file1 $ git commit -m 'added file1' Created initial commit 1a75c1d: added file1 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 file1 $ echo "added new file" > file2 $ git add file2 $ git commit -m 'added file2' Created commit f6e5064: added file2 1 files changed, 1 insertions(+), 0 deletions(-) create mode 100644 file2 $ git reset --hard HEAD^ HEAD is now at 1a75c1d... added file1 $ cat file2 cat: file2: No such file or directory $ git reflog 1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD f6e5064... HEAD@{1}: commit: added file2 $ git reset --hard f6e5064 HEAD is now at f6e5064... added file2 $ cat file2 added new file 

Contoh menunjukkan bahwa file2 telah dihapus dari hard reset, tetapi dimasukkan di tempat ketika saya reset melalui reflog.

1300
22 авг. Balas diberikan oleh Brian Riehman 22 Agu 2008-08-22 07:36 '08 pada 7:36 2008-08-22 07:36

Yang ingin Anda lakukan adalah menentukan perintah sha1 yang ingin Anda pulihkan. Anda bisa mendapatkan sha1 dengan memeriksa reflog ( git reflog ) dan kemudian melakukannya

git reset --hard <sha1 of desired commit>

Tapi jangan menunggu terlalu lama ... dalam beberapa minggu git akhirnya akan melihat komit itu tidak direferensikan dan menghapus semua tetes.

300
09 авг. balasan yang diberikan oleh Pat Notz 09 Agustus 2008-08-09 08:30 '08 pukul 8:30 pagi 2008-08-09 08:30

Jawabannya tersembunyi dalam jawaban terperinci di atas, Anda cukup melakukannya:

 $> git reset --hard HEAD@{1} 

(Lihat git reflog show output)

111
26 февр. balasan diberikan kepada markmc 26 Feb 2011-02-26 18:13 '11 pada 18:13 2011-02-26 18:13

Ini dapat dipulihkan jika Git tidak mengumpulkan sampah.

Dapatkan ikhtisar komit menggantung menggunakan fsck :

 $ git fsck --lost-found dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf 

Pulihkan komit yang rusak menggunakan rebase:

 $ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf 
78
22 авг. balas diberikan sverrejoh 22 Agustus 2008-08-22 09:11 '08 pada jam 9:11 2008-08-22 09:11

Jika Anda benar-benar beruntung, seperti saya, Anda dapat kembali ke editor teks Anda dan klik "batal."

Saya tahu bahwa ini bukan jawaban yang tepat, tetapi dia menyelamatkan saya setengah hari, jadi saya berharap dia akan melakukan hal yang sama untuk orang lain!

31
13 янв. Chris memberi balasan 13 Januari 2012-01-13 03:48 '12 pada 3:48 2012-01-13 03:48

Contoh kasus IRL:

$ git fsck --lost-found

 Checking object directories: 100% (256/256), done. Checking objects: 100% (3/3), done. dangling blob 025cab9725ccc00fbd7202da543f556c146cb119 dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4 dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98 dangling blob 9183b84bbd292dcc238ca546dab896e073432933 dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22 dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7 dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66 dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b dangling blob b87163c8def315d40721e592f15c2192a33816bb dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7 dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133 dangling blob 4a71f9ff8262701171d42559a283c751fea6a201 dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2 dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed dangling blob 749ffc9a412e7584245af5106e78167b9480a27b dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a <- it this one 

$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

 commit f6ce1a403399772d4146d306d5763f3f5715cb5a Author: Stian Gudmundsen Høiland <stian@Stians-Mac-mini.local> Date: Wed Aug 15 08:41:30 2012 +0200 *MY COMMIT MESSAGE IS DISPLAYED HERE* diff --git a/Some.file b/Some.file new file mode 100644 index 0000000..15baeba --- /dev/null +++ b/Some.file *THE WHOLE COMMIT IS DISPLAYED HERE* 

$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

 First, rewinding head to replay your work on top of it... Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a. 
25
15 авг. Balas diberikan oleh Stian Høiland 15 Agu. 2012-08-15 10:01 '12 pada pukul 10:01 2012-08-15 10:01

sejauh yang saya tahu, --hard akan membuang perubahan yang tidak dikomit. Karena mereka tidak dilacak oleh git. tetapi Anda dapat membatalkan discarded commit .

 $ git reflog 

akan terdaftar:

 b0d059c HEAD@{0}: reset: moving to HEAD~1 4bac331 HEAD@{1}: commit: added level introduction.... .... 

di mana 4bac331 discarded commit .

Sekarang cukup gerakkan kepala Anda ke perintah commit:

 $ git reset --hard 4bac331 
23
02 апр. jawabannya diberikan suhailvs 02 Apr 2015-04-02 11:57 '15 pada 11:57 2015-04-02 11:57

Jika Anda belum memiliki sampah yang mengumpulkan repositori Anda (misalnya, menggunakan git repack -d atau git gc , tetapi perhatikan bahwa pengumpulan sampah juga dapat terjadi secara otomatis), maka komit Anda masih ada - tidak lagi tersedia melalui HEAD .

Anda dapat mencoba menemukan komit Anda dengan melihat output dari git fsck --lost-found .

Dalam versi Git yang lebih baru, ada sesuatu yang disebut "reflog", yang merupakan log dari semua perubahan yang dibuat pada ref (berbeda dengan perubahan yang dilakukan pada isi repositori). Jadi, misalnya, setiap kali Anda mengganti HEAD (mis. Setiap kali Anda melakukan git checkout untuk berpindah cabang) yang akan didaftarkan. Dan, tentu saja, git reset juga mengatur HEAD, jadi itu juga dicatat. Anda dapat mengakses status lama tautan Anda dengan cara yang sama seperti Anda dapat mengakses status lama dari repositori Anda menggunakan tanda @ alih-alih ~ , misalnya git reset HEAD@{1} .

Butuh beberapa waktu untuk mencari tahu perbedaan antara HEAD @ {1} dan HEAD ~ 1, jadi inilah sedikit penjelasan:

 git init git commit --allow-empty -mOne git commit --allow-empty -mTwo git checkout -b anotherbranch git commit --allow-empty -mThree git checkout master # This changes the HEAD, but not the repository contents git show HEAD~1 # => One git show HEAD@{1} # => Three git reflog 

Jadi HEAD~1 berarti "pergi ke komit untuk berkomitmen, yang saat ini KEPALA menunjuk," dan HEAD@{1} berarti "pergi ke komit yang ditunjuk KEPALA, sebelum ia menunjukkan di mana ia menunjuk pada ".

Ini dengan mudah memungkinkan Anda menemukan perbaikan yang hi>

20
27 авг. Balas diberikan oleh Jörg W Mittag 27 Agustus 2008-08-27 06:45 '08 pada 6:45 pagi 2008-08-27 06:45

Dalam kebanyakan kasus, ya.

Bergantung pada keadaan repositori Anda, ketika Anda menjalankan perintah, efek dari git reset --hard dapat bervariasi dari sepele hingga pembatalan, pada prinsipnya, tidak mungkin.

Di bawah ini, saya telah membuat daftar beberapa skenario yang mungkin berbeda dan cara untuk mengembalikannya.

Semua perubahan saya dibuat, tetapi sekarang komit hi>

Situasi ini biasanya terjadi ketika Anda menjalankan git reset dengan argumen, seperti pada git reset --hard HEAD~ . Jangan khawatir, ini mudah dikembalikan!

Jika Anda baru saja menjalankan git reset dan tidak melakukan apa-apa sejak itu, Anda dapat kembali ke tempat Anda dulu dengan satu lapisan ini:

 git reset --hard @{1} 

Ini me-reset cabang saat ini terlepas dari keadaan sebelum sebelum terakhir diubah (dalam kasus Anda, modifikasi terbaru dari cabang akan menjadi sulit diatur u>

Namun, jika Anda membuat perubahan lain pada cabang Anda dengan reset, file superscript satu baris tidak akan berfungsi. Sebagai gantinya, Anda harus menjalankan git reflog <branchname> untuk melihat daftar semua perubahan terbaru yang dilakukan pada utas Anda (termasuk tetes). Daftar ini akan terlihat seperti ini:

 7c169bd master@{0}: reset: moving to HEAD~ 3ae5027 master@{1}: commit: Changed file2 7c169bd master@{2}: commit: Some change 5eb37ca master@{3}: commit (initial): Initial commit 

Temukan operasi dalam daftar ini yang ingin Anda "batalkan". Pada contoh di atas, ini akan menjadi baris pertama, yang mengatakan "reset: go to HEAD ~". Kemudian salin tampilan fiksasi ke (di bawah) operasi ini. Dalam kasus kami, ini akan menjadi master@{1} (atau 3ae5027 , keduanya mewakili komit yang sama), dan menjalankan git reset --hard <commit> untuk mengatur u>

Saya melakukan perubahan dengan git add , tetapi saya tidak pernah melakukannya. Sekarang perubahan saya hi>

Agak sulit untuk pulih. git memiliki salinan file yang Anda tambahkan, tetapi karena salinan ini tidak pernah dikaitkan dengan komit tertentu, Anda tidak dapat segera mengembalikan perubahan. Sebagai gantinya, Anda perlu mencari file individual di database git dan mengembalikannya secara manual. Anda dapat melakukan ini menggunakan git fsck .

Untuk detailnya, lihat Membatalkan git atur u> .

Saya memiliki perubahan pada file di direktori kerja saya yang tidak pernah saya lakukan dengan git add dan tidak pernah melakukannya. Sekarang perubahan saya hi>

Oh, oh Aku benci mengatakan ini padamu, tapi kamu mungkin tidak beruntung. git tidak menyimpan perubahan yang tidak Anda tambahkan atau transfer, dan sesuai dengan dokumentasi untuk git reset :

- keras

Atur u>Setiap perubahan pada file yang dipantau di pohon kerja dengan <commit> dibuang.

Anda mungkin dapat memulihkan perubahan Anda dengan utilitas pemulihan disk atau layanan pemulihan data profesional, tetapi saat ini mungkin lebih banyak masalah daripada nilainya.

18
16 янв. jawabannya diberikan Ajedi32 16 Januari. 2015-01-16 21:37 '15 jam 9:37 malam 2015-01-16 21:37

Saya tahu ini adalah utas lama ... tetapi karena banyak orang mencari cara untuk membatalkan materi di Git, saya masih berpikir itu adalah ide yang baik untuk terus memberikan saran di sini.

Ketika Anda membuat "git add" atau memindahkan sesuatu dari kiri atas ke kiri bawah di git gui, isi file disimpan dalam gumpalan, dan isi file dapat dikembalikan dari gumpalan ini,

Dengan demikian, Anda dapat memulihkan file, meskipun tidak diperbaiki, tetapi harus ditambahkan.

 git init echo hello >> test.txt git add test.txt 

Sekarang gumpalan dibuat, tetapi indeks merujuk padanya, sehingga tidak akan terdaftar dengan git fsck sampai kita mengatur u>

 git reset --hard git fsck 

Anda akan mendapatkan gumpalan gantung ce013625030ba8dba906f756967f9e9ca394464a

 git show ce01362 

akan memberi Anda isi file "halo" kembali

Untuk menemukan komitmen yang tidak terhitung, saya menemukan petunjuk di suatu tempat, menyarankan ini.

 gitk --all $(git log -g --pretty=format:%h) 

Saya punya alat di git gui, dan itu sangat nyaman.

9
20 янв. jawabannya diberikan martin 20 januari. 2014-01-20 09:27 '14 pada 9:27 2014-01-20 09:27

Saya baru saja membuat hard reset pada proyek yang salah. Yang menyelamatkan hidup saya adalah kisah Eclipse setempat. Dilaporkan bahwa IntelliJ Idea juga memilikinya, dan karenanya editor Anda dapat memeriksa:

1
07 апр. Balas diberikan oleh Maciek Łoziński 07 Apr. 2017-04-07 11:46 '17 pada 11:46 2017-04-07 11:46

Buat skrip kecil untuk membuatnya lebih mudah menemukan perintah yang Anda cari:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'

Ya, itu bisa dibuat lebih indah dengan awk atau sesuatu seperti itu, tapi itu sederhana, dan saya hanya membutuhkannya. Dapat menyimpan orang lain 30 detik.

0
11 марта '14 в 11:09 2014-03-11 11:09 jawabannya diberikan neuron 11 Maret '14 pukul 11:09 2014-03-11 11:09

Pertanyaan lain tentang tag atau Ajukan Pertanyaan