Pertanyaan Cara mengembalikan repositori Git ke commit sebelumnya


Bagaimana cara mengembalikan status saya saat ini ke cuplikan yang dibuat pada komitmen tertentu?

Bila saya lakukan git log, lalu 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.

Bagaimana mengembalikan ke komit mulai 3 November, yaitu berkomitmen 0d1d7fc?


6011
2017-11-06 16:58


asal


Jawaban:


Ini sangat tergantung pada apa yang Anda maksud dengan "kembalikan".

Beralih sementara ke komit yang berbeda

Jika Anda ingin kembali ke sana untuk sementara, main-main, lalu kembali ke tempat Anda berada, yang harus Anda lakukan hanyalah memeriksa komitmen yang diinginkan:

# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32

Atau jika Anda ingin membuat komitmen saat berada di sana, lanjutkan dan buat cabang baru saat Anda berada di sana:

git checkout -b old-state 0d1d7fc32

Untuk kembali ke tempat Anda berada, cukup periksa cabang tempat Anda berada lagi. (Jika Anda telah membuat perubahan, seperti biasa ketika berpindah cabang, Anda harus berurusan dengan mereka sebagaimana mestinya. Anda dapat mengatur ulang untuk membuangnya; Anda dapat menyimpan, checkout, menyimpan pop untuk membawanya bersama Anda; Anda dapat melakukan mereka ke cabang di sana jika Anda menginginkan cabang di sana.)

Hard hapus commit yang tidak diterbitkan

Jika, di sisi lain, Anda ingin benar-benar menyingkirkan semua yang telah Anda lakukan sejak itu, ada dua kemungkinan. Satu, jika Anda belum memublikasikan salah satu dari commit ini, atur ulang:

# 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's 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 sudah membuang perubahan lokal, tetapi setidaknya Anda bisa kembali ke tempat Anda sebelumnya dengan mengatur ulang lagi.

Batalkan publikasi yang diterbitkan dengan commit baru

Di sisi lain, jika Anda telah mempublikasikan karya tersebut, Anda mungkin tidak ingin mengatur ulang cabang, karena itu secara efektif menulis ulang sejarah. Dalam hal ini, Anda memang bisa mengembalikan komit. Dengan Git, kembalikan memiliki arti yang sangat spesifik: buat komit dengan patch terbalik untuk membatalkannya. Dengan cara ini Anda tidak menulis ulang riwayat apa pun.

# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053

# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD

#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053 

# Reverting a merge commit
git revert -m 1 <merge_commit_sha>

# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .

# Then commit. Be sure and write a good message describing what you just did
git commit

Itu git-revert manpage sebenarnya mencakup banyak hal ini dalam deskripsinya. Tautan bermanfaat lainnya adalah bagian git-scm.com ini membahas git-revert.

Jika Anda memutuskan Anda tidak ingin mengembalikan setelah semua, Anda dapat mengembalikan kembali (seperti yang dijelaskan di sini) atau mengatur ulang kembali sebelum pengembalian (lihat bagian sebelumnya).

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


7825
2017-11-06 17:04



Mengembalikan Salinan Kerja ke Komitmen Terbaru

Untuk kembali ke commit sebelumnya, abaikan semua perubahan:

git reset --hard HEAD

di mana HEAD adalah komit terakhir di cabang Anda saat ini

Mengembalikan Salinan Kerja ke Komitmen Lama

Untuk kembali ke commit yang lebih lama dari commit terbaru:

# Resets index to former commit; replace '56e05fced' with your commit code
git reset 56e05fced 

# Moves pointer back to previous HEAD
git reset --soft HEAD@{1}

git commit -m "Revert to 56e05fced"

# Updates working copy to reflect the new commit
git reset --hard

Kredit masuk ke pertanyaan Stack Overflow yang serupa, Kembalikan ke komit oleh hash SHA di Git?.


1260
2017-08-21 06:19



Banyak jawaban yang rumit dan berbahaya di sini, tetapi sebenarnya mudah:

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

Ini akan mengembalikan semuanya dari HEAD kembali ke hash komit, yang berarti ia akan menciptakan kembali status commit di pohon kerja seolah-olah setiap komit sejak telah berjalan kembali. Anda kemudian dapat melakukan pohon saat ini, dan itu akan menciptakan komitmen baru yang pada dasarnya setara dengan komitmen yang "dikembalikan" ke Anda.

(Itu --no-commit flag memungkinkan git mengembalikan semua commit sekaligus - jika tidak Anda akan diminta untuk pesan untuk setiap commit dalam rentang, membuang sejarah Anda dengan commit baru yang tidak perlu.)

Ini adalah sebuah cara aman dan mudah untuk kembali ke keadaan sebelumnya. Tidak ada riwayat yang dihancurkan, sehingga dapat digunakan untuk komit yang sudah dipublikasikan.


1221
2018-02-12 04:18



Pilihan terbaik untuk saya dan mungkin yang lain adalah opsi reset Git:

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

Ini adalah pilihan terbaik untukku! Ini sederhana, cepat dan efektif!


Catatan :  Seperti yang disebutkan dalam komentar, jangan lakukan ini jika Anda membagikan cabang Anda dengan orang lain yang memiliki salinan dari commit lama

Juga dari komentar, jika Anda ingin metode 'ballzy' yang bisa Anda gunakan

git clean -i 


153
2017-10-22 11:53



Jika Anda ingin "tidak bercabang", menghapus pesan komit terakhir, dan menyimpan kembali file yang diubah dalam pementasan, Anda akan menggunakan perintah:

git reset --soft HEAD~1
  • --soft menunjukkan bahwa file yang tidak terikat harus dipertahankan sebagai file kerja yang ditentang --hard yang akan membuangnya.
  • HEAD~1 adalah komit terakhir. Jika Anda ingin melakukan rollback 3 commit yang bisa Anda gunakan HEAD~3. Jika Anda ingin mengembalikan ke nomor revisi tertentu, Anda juga bisa melakukannya menggunakan hash SHA-nya.

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

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


102
2018-03-04 17:25



Sebelum menjawab, tambahkan beberapa latar belakang, jelaskan apa ini HEAD aku s.

First of all what is HEAD?

HEAD hanyalah referensi ke commit saat ini (terbaru) pada cabang saat ini. Hanya ada satu HEAD pada waktu tertentu (tidak termasuk git worktree).

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


detached HEAD

Jika Anda tidak melakukan commit terbaru - artinya itu HEAD menunjuk ke komitmen sebelumnya dalam sejarah disebut detached HEAD.

Enter image description here

Pada baris perintah akan terlihat seperti ini - SHA-1 bukannya nama cabang sejak HEAD tidak mengarah ke ujung cabang saat ini:

Enter image description here


Beberapa opsi tentang cara memulihkan diri dari HEAD yang terpisah:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Ini akan memeriksa cabang baru yang mengarah ke komit yang diinginkan. Perintah ini akan melakukan checkout ke suatu commit yang diberikan.

Pada titik ini Anda dapat membuat cabang dan mulai bekerja dari titik ini di:

# Checkout a given commit.
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# Create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Anda selalu dapat menggunakan reflog demikian juga. git reflog akan menampilkan perubahan apa pun yang memperbarui HEAD dan memeriksa entri reflog yang diinginkan akan mengatur HEAD kembali ke commit ini.

Setiap kali HEAD diubah, akan ada entri baru di reflog

git reflog
git checkout HEAD@{...}

Ini akan membuat Anda kembali ke komitmen yang Anda inginkan

Enter image description here


git reset HEAD --hard <commit_id>

"Pindahkan" kepala Anda kembali ke komit 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's 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.
  • Catatan: (Sejak Git 2.7) Anda juga bisa menggunakan git rebase --no-autostash demikian juga.

Skema ini mengilustrasikan perintah mana yang melakukan apa. Seperti yang Anda lihat di sana reset && checkout memodifikasi HEAD.

Enter image description here


101
2018-02-05 21:56



Saya telah mencoba banyak cara untuk mengembalikan perubahan lokal di Git, dan tampaknya ini berfungsi paling baik jika Anda hanya ingin kembali ke status commit terbaru.

git add . && git checkout master -f

Deskripsi Singkat:

  • Ini TIDAK akan membuat commit sebagai git revert tidak.
  • Ini TIDAK akan melepaskan HEAD Anda seperti git checkout <commithashcode> tidak.
  • Ini AKAN menimpa semua perubahan lokal Anda dan HAPUS semua file yang ditambahkan sejak commit terakhir di cabang.
  • Ini hanya bekerja dengan nama cabang, jadi Anda dapat kembali hanya ke commit terbaru di cabang dengan cara ini.

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

git add . && git reset --hard HEAD

di mana KEPALA menunjuk kepada komitmen terbaru di cabang Anda saat ini.

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


96
2017-07-29 11:01