Cara mengembalikan repositori Git ke komit sebelumnya

Bagaimana saya bisa kembali dari keadaan saat ini ke foto yang diambil pada perbaikan tertentu?

Jika saya melakukan git log , maka saya mendapatkan output berikut:

 $ git log commit a867b4af366350be2e7c21b8de9cc6504678a61b' Author: Me <me@me.com> Date: Thu Nov 4 18:59:41 2010 -0400 blah blah blah... commit 25eee4caef46ae64aa08e8ab3f988bc917ee1ce4 Author: Me <me@me.com> Date: Thu Nov 4 05:13:39 2010 -0400 more blah blah blah... commit 0766c053c0ea2035e90f504928f8df3c9363b8bd Author: Me <me@me.com> Date: Thu Nov 4 00:55:06 2010 -0400 And yet more blah blah... commit 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 Author: Me <me@me.com> Date: Wed Nov 3 23:56:08 2010 -0400 Yep, more blah blah. 

Cara kembali ke fiksasi mulai 3 November, yaitu untuk memperbaiki 0d1d7fc ?

6500
06 нояб. diatur oleh Crazy Serb 06 Nov. 2010-11-06 19:58 '10 pada 19:58 2010-11-06 19:58
ответ 41 jawaban
  • 1
  • 2

Itu sangat tergantung pada apa yang Anda maksud dengan "mengembalikan".

Beralih sementara ke perbaikan lain.

Jika Anda ingin sementara kembali ke sana, menipu diri sendiri, dan kemudian kembali ke tempat Anda sekarang, yang perlu Anda lakukan adalah memeriksa fiksasi yang diinginkan:

 # This will destroy any local modifications. # Don't do it if you have uncommitted work you want to keep. git reset --hard 0d1d7fc32 # Alternatively, if there work to keep: git stash git reset --hard 0d1d7fc32 git stash pop # This saves the modifications, then reapplies that patch after resetting. # You could get merge conflicts, if you've modified things which were # changed since the commit you reset to. 

Jika Anda mengacaukan, Anda telah menjatuhkan perubahan lokal Anda, tetapi Anda setidaknya bisa kembali ke tempat Anda sebelumnya dengan mengatur u>

Batalkan komitmen yang dipublikasikan dengan komitmen baru

Di sisi lain, jika Anda menerbitkan karya ini, Anda mungkin tidak ingin mengatur u>

Manual git-revert revert benar-benar membahas banyak hal ini dalam deskripsi.  Tautan lain yang bermanfaat adalah bagian git-scm.com, yang membahas git-revert . 

Jika Anda memutuskan bahwa Anda tidak ingin kembali pada akhirnya, Anda dapat mengembalikan yang terbalik (seperti yang dijelaskan di sini) atau kembali sebelum kembali (lihat bagian sebelumnya).

Anda juga dapat menemukan jawaban ini bermanfaat dalam kasus ini:
Bagaimana cara memindahkan kepala kembali ke tempat sebelumnya? (Kepala terpisah)

8356
06 нояб. Jawabannya diberikan oleh Cascabel 06 Nov. 2010-11-06 20:04 '10 pada 20:04 2010-11-06 20:04

Kembalikan copy pekerjaan ke komit terakhir

Untuk kembali ke komitmen sebelumnya, abaikan perubahan apa pun:

 git reset --hard HEAD 

di mana HEAD adalah perbaikan terakhir di utas Anda saat ini.

border=0

Mengembalikan copy pekerjaan ke komit yang lebih lama

Untuk kembali ke komit, yang lebih besar dari komit terakhir:

1396
21 авг. boulder_ruby reply 21 Agustus 2012-08-21 09:19 '12 pada 9:19 2012-08-21 09:19

Ada banyak jawaban yang sulit dan berbahaya, tetapi sebenarnya mudah:

 git revert --no-commit 0766c053..HEAD git commit 

Ini akan mengembalikan semuanya dari HEAD ke hash commit, yang berarti bahwa ia menciptakan kembali commit ini di pohon kerja, seolah-olah setiap komit sejak itu telah dikembalikan. Kemudian Anda dapat memperbaiki pohon saat ini, dan itu akan membuat perbaikan yang sama sekali baru, secara substansial setara dengan perbaikan, yang Anda "kembalikan".

(Bendera --no-commit memungkinkan git untuk mengembalikan semua komit pada saat yang sama - jika tidak, Anda akan diminta untuk mengirim pesan untuk setiap komit dalam kisaran, mengotori riwayat Anda dengan komit baru yang tidak perlu.)

Ini adalah cara yang aman dan mudah untuk kembali ke keadaan sebelumnya . Tidak ada riwayat yang dimusnahkan, sehingga dapat digunakan untuk komit yang telah diterbitkan.

1361
12 февр. jawabannya diberikan oleh Yarin pada 12 Februari. 2014-02-12 07:18 '14 pukul 7:18 2014-02-12 07:18

Opsi terbaik untuk saya dan mungkin untuk orang lain adalah opsi reset Git:

 git reset --hard <commidId>  git clean -f 

Itu pilihan terbaik bagi saya! Sederhana, cepat, dan efisien!


Catatan: Seperti disebutkan dalam komentar, jangan lakukan ini jika Anda berbagi cabang dengan orang lain yang memiliki salinan komitmen lama.

Juga dari komentar, jika Anda ingin menggunakan metode "kurang nyaman", Anda dapat menggunakan

git clean -i

173
22 окт. Jawabannya diberikan oleh Pogrindis pada 22 Oktober. 2013-10-22 14:53 '13 pada 14:53 2013-10-22 14:53

Sebelum menjawab, tambahkan sedikit latar belakang, jelaskan apa itu HEAD .

First of all what is HEAD?

HEAD hanyalah referensi ke komit saat ini (terakhir) di utas saat ini. Kapan saja hanya ada satu HEAD (tidak termasuk git worktree ).

Isi HEAD disimpan di dalam .git/HEAD dan mengandung 40 byte SHA-1 dari commit saat ini.


detached HEAD

Jika Anda tidak menggunakan komit terakhir, ini berarti bahwa HEAD menunjuk ke komit sebelumnya dalam sejarah, ini disebut detached HEAD .

2019

06 февр. Jawabannya diberikan CodeWizard 06 Feb. 2015-02-06 00:56 '15 pada 0:56 2015-02-06 00:56

Jika Anda ingin melakukan overclock, hapus pesan komit terakhir dan letakkan file yang dimodifikasi dalam antrian, Anda harus menggunakan perintah:

 git reset --soft HEAD~1 
  • --soft menunjukkan bahwa file yang tidak dikunci harus disimpan sebagai file yang berfungsi, berlawanan dengan --hard , yang membuangnya.
  • HEAD~1 - perbaikan terakhir. Jika Anda ingin mengembalikan 3 perbaikan, Anda dapat menggunakan HEAD~3 . Jika Anda ingin mengembalikan ke nomor revisi tertentu, Anda juga dapat melakukan ini menggunakan hash SHA Anda.

Ini adalah perintah yang sangat berguna dalam situasi di mana Anda melakukan hal yang salah, dan ingin membatalkan komit terakhir ini.

Sumber: http://nakkaya.com/2009/09/24/git-delete-last-commit/

116
04 марта '14 в 20:25 2014-03-04 20:25 Jawaban diberikan oleh Stephen Ostermiller pada 04 Maret '14 pada 20:25 2014-03-04 20:25

Saya telah mencoba banyak cara untuk mengurungkan perubahan lokal di Git, dan sepertinya itu bekerja paling baik jika Anda hanya ingin kembali ke status commit terakhir.

 git add .  git checkout master -f 

Deskripsi singkat:

  • Itu tidak akan membuat commit, seperti yang dilakukan git revert .
  • Itu tidak akan melepaskan KEPALA Anda seperti git checkout <commithashcode> .
  • Ini akan menimpa semua perubahan lokal Anda dan menghapus semua file yang ditambahkan sejak komit terakhir di utas.
  • Ini hanya berfungsi dengan nama cabang, jadi Anda hanya bisa kembali ke komit terakhir di cabang dengan cara ini.

Saya menemukan cara yang jauh lebih nyaman dan mudah untuk mencapai hasil di atas:

 git add .  git reset --hard HEAD 

di mana HEAD menunjukkan komit terakhir di utas Anda saat ini.

Ini adalah kode yang sama dengan boulder_ruby, tetapi saya menambahkan git add . sebelum git reset --hard HEAD untuk menghapus semua file baru yang dibuat sejak komit terakhir, karena ini adalah apa yang kebanyakan orang harapkan ketika saya kembali ke komit terakhir.

104
29 июля '12 в 14:01 2012-07-29 14:01 jawabannya diberikan Roman Minenok 29 Juli '12 pada 14:01 2012-07-29 14:01

Anda dapat melakukan ini dengan dua perintah berikut:

 git reset --hard [previous Commit SHA id here] git push origin [branch Name] -f 

Ini akan menghapus komit Git sebelumnya.

Jika Anda ingin menyimpan perubahan, Anda juga dapat menggunakan:

 git reset --soft [previous Commit SHA id here] 

Maka itu akan menyimpan perubahan Anda.

90
12 дек. Jawabannya diberikan kiran boghra 12 Des. 2014-12-12 09:52 '14 jam 9:52 2014-12-12 09:52

Katakanlah Anda memiliki komit berikut dalam file teks bernama ~/commits-to-revert.txt (saya menggunakan git log --pretty=oneline untuk mendapatkannya)

 fe60adeba6436ed8f4cc5f5c0b20df7ac9d93219 0c27ecfdab3cbb08a448659aa61764ad80533a1b f85007f35a23a7f29fa14b3b47c8b2ef3803d542 e9ec660ba9c06317888f901e3a5ad833d4963283 6a80768d44ccc2107ce410c4e28c7147b382cd8f 9cf6c21f5adfac3732c76c1194bbe6a330fb83e3 fff2336bf8690fbfb2b4890a96549dc58bf548a5 1f7082f3f52880cb49bc37c40531fc478823b4f5 e9b317d36a9d1db88bd34831a32de327244df36a f6ea0e7208cf22fba17952fb162a01afb26de806 137a681351037a2204f088a8d8f0db6e1f9179ca 

Buat skrip bash shell untuk mengembalikan masing-masing:

55
14 окт. jawabannya diberikan oleh Lance Caraccioli 14 Oktober. 2011-10-14 00:51 '11 pada 0:51 2011-10-14 00:51

Alternatif Tambahan untuk Solusi Jefromi

Solusi Jefromi jelas yang terbaik, dan Anda harus menggunakannya. Namun, untuk kelengkapannya, saya juga ingin menunjukkan solusi alternatif lain ini, yang juga dapat digunakan untuk mengembalikan komit (dalam arti Anda membuat komit baru yang membalikkan perubahan pada komit sebelumnya, seperti halnya git revert ).

Agar lebih jelas, alternatif ini bukan cara terbaik untuk kembali ke komit , solusi Jefromi , tapi saya hanya ingin menunjukkan bahwa Anda juga dapat menggunakan metode lain ini untuk mencapai tingkat yang sama dengan git revert .

Alternatif 1: Reset keras dan lunak

Apakah ini versi yang sangat sedikit dimodifikasi dari solusi Charles Bailey untuk Mendapatkan komitmen SHA-hash kembali ke Git? :

53
29 июня '14 в 20:51 2014-06-29 20:51 jawabannya diberikan oleh user456814 29 Juni '14 pada 20:51 2014-06-29 20:51

Tidak ada yang berhasil untuk saya di sini kecuali kombinasi yang tepat ini:

 git reset --hard <commit_hash> git push origin <branch_name> --force 

Kuncinya di sini adalah dipaksa mendorong, tidak ada pesan tambahan tentang memperbaiki / memperbaiki, dll.

53
13 февр. jawabannya diberikan serdarsenay 13 feb . 2018-02-13 01:40 '18 pada 1:40 2018-02-13 01:40

Berikut adalah cara yang jauh lebih mudah untuk kembali ke komit sebelumnya (dan membuatnya dalam keadaan tidak terkelola, lakukan apa pun yang Anda suka dengannya):

 git reset HEAD~1 

Jadi, tidak perlu memperbaiki pengidentifikasi, dll :)

50
29 февр. jawaban yang diberikan oleh Paul Walczewski pada 29 Feb. 2016-02-29 11:40 '16 pada 11:40 2016-02-29 11:40

Ok, kembali ke commit sebelumnya di git cukup sederhana ...

Kembalikan tanpa menyimpan perubahan:

 git reset --hard <commit> 

Kembali dan simpan perubahan:

 git reset --soft <commit> 

Jelaskan bahwa dengan menggunakan git reset, Anda dapat mengatur u>

Tapi, seperti yang Anda lihat, perbedaannya adalah menggunakan dua flag --soft dan --hard , defaultnya adalah git reset menggunakan flag --soft , tetapi selalu disarankan untuk menggunakan flag ini, saya jelaskan masing-masing flag:


--soft

Bendera default, seperti yang dijelaskan, tidak mengharuskannya disediakan, tidak mengubah pohon kerja, tetapi menambahkan semua file perubahan yang siap untuk dikomit, jadi Anda kembali ke status komit, di mana perubahan file menjadi tidak berubah.


--hard

Hati-hati dengan bendera ini, ini me-reset pohon yang berfungsi, dan semua perubahan pada file yang dipantau menghi>


Saya juga membuat gambar di bawah ini yang bisa terjadi di kehidupan nyata saat bekerja dengan git:

2019

Dengan asumsi bahwa Anda berbicara tentang tuan rumah dan cabang yang sesuai (ini menunjukkan bahwa itu bisa berupa cabang pekerjaan yang Anda khawatirkan):

 # Revert local master branch to November 3rd commit ID git reset --hard 0d1d7fc32e5a947fbd92ee598033d85bfc445a50 # Revert remote master branch to November 3rd commit ID git push -f origin 0d1d7fc32e5a947fbd92ee598033d85bfc445a50:master 

Saya menemukan jawaban dari posting blog Hapus repositori Git jarak jauh untuk komit tertentu .

45
10 мая '16 в 20:21 2016-05-10 20:21 balasan diberikan kepada markreyes 10 Mei '16 pada 20:21 2016-05-10 20:21

Setelah semua perubahan, saat Anda menekan semua perintah ini, Anda mungkin harus menggunakan:

 git push -f ... 

Dan bukan hanya git push .

34
05 сент. jawabannya diberikan oleh sivi 05 sep . 2013-09-05 17:03 '13 pada 17:03 2013-09-05 17:03

Ada perintah (bukan bagian dari kernel Git, tetapi ada dalam paket git-extras ) khusus untuk mengembalikan dan menjalankan commit lama:

 git back 

Di halaman manual , itu juga dapat digunakan seperti:

 # Remove the latest three commits git back 3 
32
08 авг. jawabannya diberikan oleh Shadow Man 08 Agustus. 2013-08-08 21:30 '13 pada 21:30 2013-08-08 21:30

Kembali ke komit terakhir dan abaikan semua perubahan lokal:

 git reset --hard HEAD 
27
26 июля '16 в 16:13 2016-07-26 16:13 Jawaban diberikan oleh Mohammed Irfan Tirupattur pada 26 Juli '16 pada 16:13 2016-07-26 16:13

Pilih punggawa yang diperlukan dan periksa.

 git show HEAD git show HEAD~1 git show HEAD~2 

sampai Anda mendapatkan fiksasi yang Anda inginkan. Untuk memaksa HEAD mengarahkan hal ini, lakukan

 git reset --hard HEAD~1 

atau git reset --hard HEAD~2 atau sesuatu yang lain.

26
26 февр. jawabannya diberikan tonythomas01 26 Feb. 2014-02-26 15:52 '14 pada 15:52 2014-02-26 15:52

Anda bisa menyelesaikan sendiri >

  1. Tarik keluar versi terbaru dari repositori Anda dari Bitbucket menggunakan perintah git pull --all .

  2. Jalankan perintah git log dengan -n 4 dari terminal Anda. Angka setelah -n menentukan jumlah komit dalam log, dimulai dengan komit terakhir dalam riwayat lokal Anda.

    $ git log -n 4

  3. Reset git reset --hard HEAD~N riwayat repositori Anda menggunakan git reset --hard HEAD~N mana N adalah jumlah komit yang ingin Anda kembalikan. Dalam contoh berikut, kepala akan diatur ke satu komit, komit terakhir dalam sejarah repositori:

  4. Klik pada perubahan dalam git repo dengan git push --force untuk memaksa perubahan.

Jika Anda ingin repositori git memiliki komit sebelumnya

 git pull --all git reset --hard HEAD~1 git push --force 
24
06 апр. Balas diberikan oleh Nanhe Kumar pada 06 Apr 2017-04-06 15:20 '17 pada 15:20 2017-04-06 15:20

Ini adalah metode reset >
 git stash git stash clear 

Itu secara >

PS: Ada sedikit masalah; itu juga menghapus semua perubahan cache yang baru disimpan. Saya pikir dalam banyak kasus itu tidak masalah.

20
05 мая '16 в 14:43 2016-05-05 14:43 jawabannya diberikan oleh Point Networks 05 Mei '16 pada 14:43 2016-05-05 14:43

Untuk benar-benar membersihkan direktori coder dari beberapa perubahan acak, kami menggunakan:

 git add -A . git reset --hard HEAD 

Cukup git reset --hard HEAD menyingkirkan perubahan, tetapi itu tidak akan menyingkirkan file "baru". Dalam kasus mereka, mereka secara tidak sengaja menyeret folder penting di suatu tempat secara acak, dan semua file ini diperlakukan sebagai baru dengan Git, jadi reset --hard tidak memperbaikinya. Menjalankan git add -A . sebelumnya, dia secara eksplisit melacak mereka semua dengan Git, yang dihancurkan dengan reset.

20
11 окт. Balas diberikan oleh Chris Moschini pada 11 Oktober 2015-10-11 03:10 '15 pada 3:10 2015-10-11 03:10

Untuk menyimpan perubahan dari komit sebelumnya ke HEAD dan pergi ke komit sebelumnya, jalankan:

 git reset <SHA> 

Jika tidak diperlukan perubahan dari komit sebelumnya ke HEAD dan cukup buang semua perubahan, ikuti >

 git reset --hard <SHA> 
20
28 июля '15 в 11:35 2015-07-28 11:35 jawabannya diberikan oleh Wisnu Atrai 28 Juli '15 di 11:35 2015-07-28 11:35

Saya percaya bahwa beberapa orang mungkin datang ke pertanyaan ini, ingin tahu bagaimana kemunduran membuat perubahan yang mereka buat pada pemiliknya - yaitu, membuang semuanya dan kembali ke asal / pemilik, dan dalam hal ini lakukan hal berikut:

 git reset --hard origin/master 

https://superuser.com/questions/273172/how-to-reset-master-to-origin-master

19
05 февр. jawabannya diberikan nevster 05 feb . 2015-02-05 04:28 '15 pada 4:28 2015-02-05 04:28

Kembalikan adalah perintah untuk melakukan komit.

 git revert <commit1> <commit2> 

Contoh:

git revert 2h3h23233

Itu dapat menerima rentang dari kepala seperti yang ditunjukkan di bawah ini. Di sini saya mengatakan: "Kembalikan perbaikan terakhir."

git revert HEAD~1..HEAD

dan kemudian lakukan git push

16
20 авг. balasan yang diberikan oleh Sireesh Yarlagadda 20 Agustus. 2015-08-20 17:45 '15 jam 5:45 sore 2015-08-20 17:45

Kembalikan Komit Terkini:

 git reset --hard HEAD 

HEAD hanyalah referensi ke komit saat ini (terakhir) di utas saat ini. Hanya ada satu HEAD setiap saat.

Kembali ke perintah yang lebih lama: cara tercepat untuk memulihkan versi yang lama adalah dengan menggunakan perintah reset :

 # Resets index to former commit git reset 56e05fced # Moves pointer back to previous HEAD git reset --soft HEAD@{1} # Updates working copy to reflect the new commit git reset --hard 

Ini memundurkan cabang HEAD Anda ke versi yang ditentukan. Semua komit yang muncul setelah versi ini sebenarnya dibatalkan; proyek Anda persis sama dengan pada saat itu.

Perintah reset memiliki beberapa opsi, salah satu yang paling menarik adalah tanda --soft . Jika Anda menggunakannya sebagai ganti --hard , Git akan menyimpan semua perubahan pada "undone" ini sebagai perubahan lokal.

Memulihkan versi di cabang lokal baru

Seperti yang dikatakan, menggunakan perintah reset pada cabang HEAD Anda adalah tindakan yang cukup radikal: akan menghapus komit (di cabang ini) yang muncul setelah revisi yang ditentukan. Jika Anda yakin ini yang Anda inginkan, semuanya beres.

Namun, ada juga cara yang lebih aman jika Anda memilih untuk tidak meninggalkan cabang KEPALA Anda saat ini. Так как "ветки" настолько дешевы и легки в Git, мы можем легко создать новую ветку, которая начинается с этой старой версии:

 git checkout -b old-project-state 0ad5a7a6