Yang perlu Anda lakukan adalah membuat komit baru dengan detail yang sama dengan HEAD
komit saat ini , tetapi dengan induk sebagai versi sebelumnya HEAD
. git reset --soft
akan memindahkan pointer cabang sehingga komit berikutnya terjadi di atas komit yang berbeda dari tempat kepala cabang saat ini sekarang.
# Move the current head so that it's pointing at the old commit
# Leave the index intact for redoing the commit.
# HEAD@{1} gives you "the commit that HEAD pointed at before
# it was moved to where it currently points at". Note that this is
# different from HEAD~1, which gives you "the commit that is the
# parent node of the commit that HEAD is currently pointing to."
git reset --soft HEAD@{1}
# commit the current tree using the commit details of the previous
# HEAD commit. (Note that HEAD@{1} is pointing somewhere different from the
# previous command. It's now pointing at the erroneously amended commit.)
git commit -C HEAD@{1}
git reflog
untuk mencari angka yang benar, misalnya{2}
.git commit --amend
. Yang ke-2 adalah "redo" menjadi komit baru. Ini bekerja untuk apa pungit commit
, bukan hanya--amend
.git commit
.git reset --soft HEAD@{1}
:fatal: ambiguous argument 'HEAD@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions
. Ketika saya digantiHEAD@{1}
dengan hash komit yang ditunjukkan padagit reflog
(terima kasih JJD!), Jawaban ini bekerja dengan sangat baik!HEAD@{1}
. Jika saya menjalankanecho HEAD@{1}
tcsh misalnya, outputnya adalahHEAD@1
karena kawat gigi ditafsirkan oleh tcsh. Jika saya menggunakan tanda kutip tunggal, kawat gigi akan dipertahankan.gunakan ref-log :
Anda kemudian harus memiliki semua perubahan yang diubah sebelumnya hanya di copy pekerjaan Anda dan dapat melakukan lagi
untuk melihat daftar lengkap dari tipe indeks sebelumnya
git reflog
sumber
HEAD@{1}
danHEAD~1
?HEAD~1
persis sama denganHEAD^
dan mengidentifikasi induk dari komit saat ini.HEAD@{1}
di sisi lain mengacu pada komit yang ditunjuk KEPALA sebelum ini, yaitu komit berarti berbeda ketika Anda checkout cabang yang berbeda atau mengubah komit.git reset HEAD@{1}
sudah cukup.Temukan komitmen yang diubah oleh:
Catatan: Anda dapat menambahkan
--patch
untuk melihat tubuh komit untuk kejelasan. Sama dengangit reflog
.kemudian atur ulang KEPALA Anda ke komit sebelumnya pada saat itu baik-baik saja dengan:
Catatan: Ganti SHA1 dengan hash komit asli Anda. Perhatikan juga bahwa perintah ini akan kehilangan perubahan yang tidak dikomit, jadi Anda dapat menyimpannya sebelumnya. Sebagai alternatif, gunakan
--soft
sebagai gantinya untuk menyimpan perubahan terbaru dan kemudian lakukan.Kemudian pilih cherry yang lain yang Anda butuhkan di atasnya:
sumber
git reset SHA1 --soft
, Anda dapat menyimpan perubahan terbaru dan kemudian mengkomitnya.Anda selalu dapat membagi komit, Dari manual
sumber
git reflog
adalah yang Anda butuhkangit reset
alih - alihgit reset --soft
, lalu lakukangit add --patch
.Mungkin perlu dicatat bahwa jika Anda masih di editor Anda dengan pesan komit, Anda dapat menghapus pesan komit dan itu akan membatalkan
git commit --amend
perintah.sumber
Mungkin bisa digunakan
git reflog
untuk mendapatkan dua komit sebelum mengubah dan setelah mengubah.Kemudian gunakan
git diff before_commit_id after_commit_id > d.diff
untuk mendapatkan perbedaan antara sebelum mengubah dan setelah mengubah.Penggunaan selanjutnya
git checkout before_commit_id
untuk kembali sebelum komitDan penggunaan terakhir
git apply d.diff
untuk menerapkan perubahan nyata yang Anda lakukan.Itu memecahkan masalah saya.
sumber
Jika Anda telah mendorong komit ke remote dan kemudian salah mengubah perubahan pada komit ini, ini akan memperbaiki masalah Anda. Masalah a
git log
untuk menemukan SHA sebelum komit. (ini menganggap remote bernama asal). Sekarang keluarkan perintah ini menggunakan SHA itu.sumber
Anda dapat melakukan di bawah ini untuk membatalkan
git commit —amend
git reset --soft HEAD^
git checkout files_from_old_commit_on_branch
git pull origin your_branch_name
====================================
Sekarang perubahan Anda seperti sebelumnya. Jadi, Anda sudah selesai dengan undo untuk
git commit —amend
Sekarang Anda bisa melakukannya
git push origin <your_branch_name>
, untuk mendorong ke cabang.sumber
Hampir 9 tahun terlambat untuk ini tetapi tidak melihat variasi ini disebutkan menyelesaikan hal yang sama (ini semacam kombinasi dari beberapa di antaranya, mirip dengan jawaban teratas ( https://stackoverflow.com/a/1459264/4642530 ) .
Cari semua kepala terpisah di cabang
git reflog show origin/BRANCH_NAME --date=relative
Kemudian temukan hash SHA1
Setel ulang ke SHA1 lama
git reset --hard SHA1
Kemudian dorong kembali.
git push origin BRANCH_NAME
Selesai
Ini akan mengembalikan Anda sepenuhnya ke komitmen lama.
(Termasuk tanggal komit terlepas sebelumnya yang ditimpa sebelumnya)
sumber
--soft
untuk menjaga perubahan saya. Saya hanya ingin itu dilakukan secara terpisahCheckout ke cabang sementara dengan komit terakhir
git branch temp HEAD@{1}
Setel ulang komit terakhir
git reset temp
Sekarang, Anda akan memiliki semua file komit Anda dan juga komit sebelumnya. Periksa status semua file.
git status
Setel ulang file komit Anda dari tahap git.
git reset myfile1.js
(seterusnya)Pasang kembali komit ini
git commit -C HEAD@{1}
Tambahkan dan komit file Anda ke komit baru.
sumber