Pertanyaan Cara membatalkan "git commit --amend" yang dilakukan alih-alih "git commit"


Saya tidak sengaja mengubah komitmen saya sebelumnya. Komitmen seharusnya terpisah untuk menyimpan riwayat perubahan yang saya buat pada file tertentu.

Apakah ada cara untuk membatalkan komitmen terakhir? Jika saya melakukan sesuatu seperti git reset --hard HEAD^, komit pertama juga dibatalkan.

(Saya belum mendorong ke direktori remote)


942
2017-09-22 09:56


asal


Jawaban:


Yang perlu Anda lakukan adalah membuat komitmen baru dengan detail yang sama seperti saat ini HEAD commit, tetapi dengan induk sebagai versi sebelumnya dari HEAD. git reset --soft akan memindahkan penunjuk cabang sehingga commit berikutnya terjadi di atas komitmen 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}

1662
2017-09-22 10:23



menggunakan ref-log:

git branch fixing-things HEAD@{1}
git reset fixing-things

Anda kemudian harus memiliki semua perubahan yang sebelumnya diubah hanya dalam copy pekerjaan Anda dan dapat melakukan commit lagi

untuk melihat daftar lengkap dari jenis indeks sebelumnya git reflog


101
2017-09-22 10:02



Temukan komitmen Anda yang diubah dengan:

git log --reflog

Catatan: Anda dapat menambahkan --patch untuk melihat tubuh komit untuk kejelasan. Sama dengan git reflog.

kemudian setel ulang HEAD Anda ke commit sebelumnya pada saat itu baik-baik saja dengan:

git reset SHA1 --hard

catatan: Menggantikan SHA1 dengan hash komitmen Anda yang sebenarnya. Juga perhatikan bahwa perintah ini akan kalah perubahan apa pun yang tidak terikat, jadi Anda mungkin menyimpannya sebelumnya.

Kemudian ceri pilih komitmen lain yang Anda butuhkan di atasnya:

git cherry-pick SHA1

32
2018-03-27 01:56



Anda selalu dapat membagi komit, Dari manual

  • Mulai rebase interaktif dengan git rebase -i commit ^, di mana commit adalah komitmen yang ingin Anda bagi. Bahkan, setiap rentang komit akan dilakukan, selama mengandung komit itu.
  • Tandai komit yang ingin Anda bagi dengan aksi "edit".
  • Ketika datang untuk mengedit yang melakukan, jalankan git reset HEAD ^. Efeknya adalah bahwa HEAD di-rewound oleh satu, dan indeks mengikuti. Namun, pohon kerja tetap sama.
  • Sekarang tambahkan perubahan pada indeks yang ingin Anda miliki pada commit pertama. Anda dapat menggunakan git add (mungkin secara interaktif) atau git-gui (atau keduanya) untuk melakukan itu.
  • Komit sekarang indeks saat ini dengan pesan komitmen apa pun yang sesuai sekarang.
  • Ulangi dua langkah terakhir hingga pohon kerja Anda bersih.
  • Lanjutkan rebase dengan git rebase - lanjutkan.

20
2017-09-22 10:01



Mungkin bisa digunakan git reflog untuk mendapatkan dua komitmen sebelum mengubah dan setelah melakukan amandemen.

Kemudian gunakan git diff before_commit_id after_commit_id > d.diff untuk mendapatkan perbedaan antara sebelum perubahan dan setelah perubahan.

Penggunaan selanjutnya git checkout before_commit_id untuk kembali sebelum berkomitmen

Dan terakhir digunakan git apply d.diff untuk menerapkan perubahan nyata yang Anda lakukan.

Itu memecahkan masalah saya.


13
2017-09-20 12:39



Mungkin perlu diperhatikan bahwa jika Anda masih di editor dengan pesan commit, Anda dapat menghapus pesan commit dan itu akan membatalkan git commit --amend perintah.


12
2018-03-03 18:45



Hampir 9 tahun terlambat untuk ini tetapi tidak melihat variasi ini menyebutkan mencapai hal yang sama (ini semacam kombinasi dari beberapa ini, mirip dengan jawaban atas (https://stackoverflow.com/a/1459264/4642530).

Cari semua kepala terpisah di cabang

git reflog show origin/BRANCH_NAME --date=relative

Kemudian temukan SHA1 hash

Setel ulang ke SHA1 lama

git reset --hard SHA1

Kemudian dorong kembali.

git push origin BRANCH_NAME

Selesai

Ini akan mengembalikan Anda kembali ke komitmen lama sepenuhnya.

(Termasuk tanggal kepala komit tertimpa yang ditimpa sebelumnya)


1
2018-06-17 21:55



  1. Checkout ke cabang sementara dengan commit terakhir

    git branch temp HEAD@{1}

  2. Setel ulang commit terakhir

    git reset temp

  3. Sekarang, Anda akan memiliki semua file komit Anda serta komit sebelumnya. Periksa status semua file.

    git status

  4. Setel ulang file commit Anda dari tahap git.

    git reset myfile1.js (seterusnya)

  5. Pasang kembali komitmen ini

    git commit -C HEAD@{1}

  6. Tambahkan dan komit file Anda ke commit baru.


0
2018-03-04 07:28