Di repo lokal, saya baru saja mengeksekusi git cherry-pick SHA
tanpa konflik atau masalah. Saya kemudian menyadari bahwa saya tidak ingin melakukan apa yang baru saja saya lakukan. Saya belum mendorong ini ke mana pun.
Bagaimana cara menghapus cherry pick ini?
Saya ingin tahu apakah ada cara untuk melakukan ini:
- ketika saya memiliki perubahan lokal lainnya
- ketika saya tidak memiliki perubahan lokal lainnya
Lebih disukai dengan satu perintah untuk kedua kasus jika memungkinkan.
Untuk membatalkan komit terakhir Anda, lakukan saja
git reset --hard HEAD~
.Sunting : jawaban ini diterapkan pada versi sebelumnya dari pertanyaan yang tidak menyebutkan pelestarian perubahan lokal; jawaban yang diterima dari Tim memang benar. Terima kasih untuk qwertzguy atas perhatiannya.
sumber
HEAD
) lebih kuat: pertimbangkan kasus yang tidak menguntungkan di manahead
nama referensi yang ada.Jika memungkinkan, hindari hard reset. Reset keras adalah salah satu dari sedikit operasi destruktif di git. Untungnya, Anda dapat membatalkan pilihan ceri tanpa pengaturan ulang dan menghindari apa pun yang merusak.
Perhatikan hash dari cherry-pick yang ingin Anda batalkan, katakan saja
${bad_cherrypick}
. Lakukangit revert ${bad_cherrypick}
. Sekarang isi pohon kerja Anda seperti sebelum Anda memilih ceri yang buruk.Ulangi
git cherry-pick ${wanted_commit}
, dan jika Anda senang dengan pilihan baru, lakukan agit rebase -i ${bad_cherrypick}~1
. Selama rebase, hapus keduanya${bad_cherrypick}
dan pengembalian yang sesuai.Cabang yang sedang Anda kerjakan hanya akan memiliki cherry-pick yang bagus. Tidak perlu reset!
sumber
git reflog
bisa datang untuk menyelamatkanmu.Ketik di konsol Anda dan Anda akan mendapatkan daftar riwayat git Anda bersama dengan SHA-1 yang mewakili mereka.
Cukup lakukan pembayaran SHA-1 yang ingin Anda kembalikan
Sebelum menjawab mari tambahkan beberapa latar belakang, menjelaskan apa ini
HEAD
.First of all what is HEAD?
HEAD
hanyalah referensi ke komit saat ini (terbaru) di cabang saat ini.Hanya boleh ada satu orang
HEAD
pada waktu tertentu. (tidak termasukgit worktree
)Konten
HEAD
disimpan di dalam.git/HEAD
dan berisi 40 byte SHA-1 dari komit saat ini.detached HEAD
Jika Anda tidak berada di komit terbaru - artinya
HEAD
menunjuk ke komit sebelumnya dalam riwayat panggilannyadetached HEAD
.Pada baris perintah, akan terlihat seperti ini- SHA-1 sebagai ganti nama cabang karena
HEAD
tidak mengarah ke ujung cabang saat iniBeberapa opsi tentang cara memulihkan dari HEAD yang terlepas:
git checkout
Ini akan memeriksa cabang baru yang menunjuk ke komit yang diinginkan.
Perintah ini akan memeriksa komit yang diberikan.
Pada titik ini, Anda dapat membuat cabang dan mulai bekerja dari titik ini.
git reflog
Anda selalu dapat menggunakan
reflog
juga.git reflog
akan menampilkan perubahan apa pun yang memperbaruiHEAD
dan memeriksa entri reflog yang diinginkan akan mengaturHEAD
kembali ke komit ini.Setiap kali HEAD diubah, akan ada entri baru di
reflog
Ini akan membuat Anda kembali ke komitmen yang Anda inginkan
git reset --hard <commit_id>
"Pindahkan" HEAD 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.
Anda juga dapat menggunakan file
git rebase --no-autostash
.git revert <sha-1>
"Urungkan" rentang komit atau komit yang diberikan.
Perintah reset akan "membatalkan" setiap perubahan yang dibuat dalam komit yang diberikan.
Komit baru dengan tambalan urung akan dilakukan sementara komit asli juga akan tetap ada dalam riwayat.
# add new commit with the undo of the original one. # the <sha-1> can be any commit(s) or commit range git revert <sha-1>
Skema ini menggambarkan perintah mana yang melakukan apa.
Seperti yang Anda lihat di sana,
reset && checkout
modifikasi fileHEAD
.sumber
git reset --hard
Menghadapi masalah yang sama ini, saya menemukan jika Anda telah melakukan dan / atau mendorong ke remote sejak cherry-pick Anda berhasil, dan Anda ingin menghapusnya, Anda dapat menemukan SHA cherry-pick dengan menjalankan:
git log --graph --decorate --oneline
Kemudian, (setelah menggunakan
:wq
untuk keluar dari log) Anda dapat menghapus cherry-pick menggunakangit rebase -p --onto YOUR_SHA_HERE^ YOUR_SHA_HERE
dimana
YOUR_SHA_HERE
sama dengan komit yang dipilih ceri 40- atau disingkat SHA 7 karakter.Pada awalnya, Anda tidak akan dapat mendorong perubahan Anda karena repo jarak jauh dan repo lokal Anda akan memiliki riwayat komit yang berbeda. Anda dapat memaksa komit lokal Anda untuk mengganti apa yang ada di remote Anda dengan menggunakan
git push --force origin YOUR_REPO_NAME
(Saya mengadaptasi solusi ini dari Seth Robertson : Lihat "Menghapus seluruh komit.")
sumber
Satu perintah dan tidak menggunakan
git reset
perintah destruktif :GIT_SEQUENCE_EDITOR="sed -i 's/pick/d/'" git rebase -i HEAD~ --autostash
Itu hanya menjatuhkan komit, menempatkan Anda kembali tepat sebelum pilihan ceri bahkan jika Anda memiliki perubahan lokal.
sumber
git reset HEAD^
?git reset
membatalkan tindakan komit tanpa menghilangkan perubahan apa pun. Saya sarankan Anda membaca git-scm.com/docs/git-reset . Pertanyaan dari OP adalah membatalkan pilihan ceri. Cobalah kedua perintah tersebut, perintah saya akan mengembalikan Anda ke keadaan yang sama seperti sebelum memilih ceri.git reset
akan mengacaukan pohon kerja Anda karena meninggalkan perubahan yang dipetik ceri dan menjadi tidak bisa dibedakan dari perubahan lokal Anda yang sudah ada sebelumnya.reset --hard
. Tidak ada perubahangit reset --hard
adalah perintah destruktif yang akan menghapus perubahan lokal yang tidak terkait juga dan akan melakukannya dengan cara yang tidak dapat dipulihkan! Jadi bukan itu yang diminta OP.sed
perintah itu, apa--autostash
bedanya dengan melakukannya secara manual, dan apa fungsinya.