Git: Bagaimana cara menggunakan kembali / menyimpan pesan komit setelah 'git reset'?

104

Sebagai pengguna Git, saya biasa menjumpai situasi tersebut, bahwa saya perlu mengerjakan ulang satu atau lebih komitmen dengan cara yang tidak sesuai --amendatau rebase -idengan komitmen perbaikan. Biasanya saya akan melakukan sesuatu seperti

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Saya menerima pesan komit tersusun yang masuk akal dengan cukup serius. Mereka biasanya berisi teks yang lebih besar dengan referensi & pembenaran untuk perubahan tersebut. Sampai saat ini, saya cukup terganggu dengan proses yang panjang untuk memulihkan pesan komit lama saya melalui proses yang tidak disortir git reflog, git logdan salin & tempel.

Apakah ada yang lebih baik untuk mengatasi ini? Dan bagaimana jika saya terdiri lebih dari satu komit?

Sunting: Setelah sedikit memikirkan tentang ini, saya pikir yang saya cari adalah beberapa fungsi seperti git simpanan untuk pesan komit di mana perbaikan / ubah komit tidak sesuai.

bentolor
sumber
2
Jika semua yang Anda lakukan adalah git reset head~1, bukankah pesan commit lama Anda hanya menjadi entri ke-2 di reflog?
Ya - tapi bagaimana saya bisa menggunakan kembali pesan tanpa copy & paste (yang biasanya memerlukan
penghapusan indentasi
Sekarang, gitkbuka saja. Dengan cara itu Anda bahkan tidak perlu menggunakan reflog. Atau, gunakan rev-parse <branch>untuk mendapatkan hash Anda sebelum reset dan gunakan jawaban ibizaman.
cst1992

Jawaban:

144

Setelah git reset, satu baris ini dapat melakukannya:

git commit --reuse-message=HEAD@{1}

atau bahkan lebih pendek:

git commit -C HEAD@{1}

Anda dapat menggunakan opsi lain yang diberikan oleh @ user2718704 .

ibizaman
sumber
6
Lebih pendek:git commit -C@@{1}
Phu Ngo
2
Ini adalah penggunaan reflog yang fantastis
David Mann
22
Setelah penyetelan ulang, ORIG_HEAD disetel. Saya menemukan git commit --reuse-message=ORIG_HEADyang paling jelas.
Scott Jacobsen
45

Saat menjalankan perintah "git commit", Anda harus memeriksa opsi berikut,

Untuk menggunakan kembali,

--reuse-message=<commit>

Untuk mengedit saat digunakan kembali,

--reedit-message=<commit>

Untuk mengubah penulis,

--reset-author
pengguna2718704
sumber
1
Tandai ini sebagai solusi baru, karena ini memberikan jawaban yang paling komprehensif. Meskipun solusi ini masih belum sepenuhnya menyelesaikan masalah 'pengambilan' saya.
bentolor
9

Mengapa mengatur ulang jika Anda dapat meretas, memperbaiki, meretas, dan kemudian menjalankan saja git commit --amend --no-edit; dengan demikian, mempertahankan pesan komit asli Anda.

Untuk membuatnya bekerja untuk beberapa komit, cukup buat komit sementara dengan perubahan terbaru Anda dan kemudian gunakan rebase interaktif untuk menghentikan komit sebelumnya (berisi pesan komit yang baik) dengan komit sementara yang baru, pertahankan pesan komit dari komit lama.

mart1n
sumber
2
Saat melakukan rebase interaktif, Anda bahkan dapat menggunakan fixupinstruksi untuk mendeklarasikan bahwa komit selanjutnya adalah untuk memperbaiki komit sebelumnya dan secara otomatis akan menggunakan pesan komit dari aslinya membuang pesan dari komit perbaikan.
qqx
Misalnya jika saya ingin menggabungkan kembali permintaan tarik yang diperbarui secara paksa. Atau jika komit bukan yang terakhir dan tidak dapat dengan mudah diperbaiki berdasarkan HEAD dan lebih mudah untuk mengulangnya.
bentolor
@BenTebulin Nah, rebase interaktif memungkinkan Anda memodifikasi komit apa pun dalam rentang komit yang ditentukan. Tidak hanya komit HEAD yang harus dimodifikasi.
mart1n
@ mart1n Terima kasih telah memilih edit masuk rebase -i. Jangan pernah menggunakannya dalam konteks itu. Untuk kasus yang tersisa seperti menggabungkan kembali jawaban lain lebih sesuai dengan pertanyaan saya, jadi saya tandai sebagai jawaban.
bentolor
Intellij memiliki cakupan yang hanya beroperasi pada file yang belum dikomit. Berguna untuk mengatur ulang file ke uncommitted sehingga intellij dapat diinstruksikan untuk lint file, misalnya, dan kemudian mengkomit ulang file tersebut dengan pesan yang sama. amandemen tidak akan berfungsi untuk itu karena batasan cakupan intellij.
David Mann
5

Anda dapat mempertimbangkan git commit --reset-author -c <commit>, untuk menggunakan kembali pesan komit dengan pengeditan dan waktu saat ini.

Joe
sumber
Terima kasih - ini mendekati apa yang saya cari selama ini.
bentolor