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

Sebagai pengguna Git, saya sering menghadapi situasi ini, bahwa saya perlu mengerjakan ulang satu atau lebih komitmen dengan cara yang tidak sesuai dengan --amend atau 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 menanggapi pesan komit yang masuk akal dengan cukup serius. Mereka biasanya berisi teks yang lebih besar dengan referensi & pembenaran untuk perubahan tersebut. Sampai saat ini, saya cukup kesal dengan proses panjang untuk memulihkan pesan komit lama saya melalui proses git reflog, git logdan salin & tempel yang tidak disortir.

Apakah ada cara yang lebih baik untuk mengatasi hal ini? Dan bagaimana jadinya, jika komitmen saya lebih dari satu?

Edit: Setelah sedikit memikirkan hal ini, saya pikir yang saya cari adalah beberapa fungsi seperti git stash untuk pesan komit di mana perbaikan/perubahan komit tidak sesuai.


person bentolor    schedule 31.05.2013    source sumber
comment
Jika yang Anda lakukan hanyalah git reset head~1, bukankah pesan komit lama Anda hanya akan menjadi entri ke-2 di reflog?   -  person    schedule 31.05.2013
comment
Ya - tetapi bagaimana saya dapat menggunakan kembali pesan tersebut tanpa menyalin & menempel (yang biasanya memerlukan penghapusan indentasi secara manual)   -  person bentolor    schedule 02.06.2013
comment
Saat ini, cukup buka gitk. Dengan begitu Anda bahkan tidak perlu menggunakan reflog. Alternatifnya, gunakan rev-parse <branch> untuk mendapatkan hash Anda sebelum reset dan gunakan jawaban dari ibizaman.   -  person cst1992    schedule 18.11.2016


Jawaban (4)


Setelah git reset, kalimat satu 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.

person ibizaman    schedule 19.09.2014
comment
Lebih pendek: git commit -C@@{1} - person Phu Ngo; 24.07.2018
comment
Ini adalah penggunaan reflog yang luar biasa - person David Mann; 11.09.2018
comment
Setelah reset, ORIG_HEAD disetel. Menurut saya git commit --reuse-message=ORIG_HEAD adalah yang paling jelas. - person Scott Jacobsen; 11.04.2019

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
person user2718704    schedule 26.08.2013
comment
Menandai ini sebagai solusi baru, karena ini memberikan jawaban paling komprehensif. Meskipun solusi ini masih belum sepenuhnya menyelesaikan masalah 'pengambilan' saya. - person bentolor; 27.08.2013

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

Untuk membuatnya berfungsi 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.

person mart1n    schedule 31.05.2013
comment
Saat melakukan rebase interaktif, Anda bahkan dapat menggunakan instruksi fixup untuk mendeklarasikan bahwa komit selanjutnya adalah memperbaiki komit sebelumnya dan secara otomatis akan menggunakan pesan komit dari komit asli yang membuang pesan dari komit perbaikan. - person qqx; 31.05.2013
comment
Misalnya jika saya ingin menggabungkan kembali permintaan tarik yang diperbarui secara paksa. Atau jika komitnya bukan yang terakhir dan tidak dapat diperbaiki dengan mudah berdasarkan HEAD dan lebih mudah untuk mengulanginya. - person bentolor; 02.06.2013
comment
@BenTebulin Ya, rebase interaktif memungkinkan Anda mengubah komit apa pun dalam rentang komit yang ditentukan. Bukan hanya komitmen HEAD yang harus diubah. - person mart1n; 02.06.2013
comment
@mart1n Terima kasih telah memilih edit di rebase -i. Tidak pernah menggunakannya dalam konteks itu. Untuk kasus-kasus lain seperti penggabungan kembali, jawaban lain lebih sesuai dengan pertanyaan saya, jadi saya tandai yang itu sebagai jawaban. - person bentolor; 02.06.2013
comment
Intellij memiliki cakupan yang hanya beroperasi pada file yang belum dikomit. Berguna untuk mengatur ulang file menjadi tidak dikomit sehingga intellij dapat diinstruksikan untuk memasukkan file tersebut, misalnya, dan kemudian mengkomit ulang file tersebut dengan pesan yang sama. amandemen tidak akan berhasil karena keterbatasan cakupan intellij. - person David Mann; 11.09.2018

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

person Joe    schedule 02.06.2013
comment
Terima kasih - ini mendekati apa yang saya cari. - person bentolor; 02.06.2013