Bagaimana cara mengubah pesan pertama git commit?

116

Saya memiliki pohon kerja yang berisi 3 komitmen:

➜ ~ myproject git: (master) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <[email protected]>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <[email protected]>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <[email protected]>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

Sekarang saya ingin rewordpesan commit pertama saya commit (6707a66)

➜ ~ myproject git: (master) git rebase -i 6707

(… Memasuki vim)

pick 5bccda6 Create .gitignore file
pick a99cce8 .gitignore edits

# Rebase 6707a66..a99cce8 onto 6707a66
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Dalam hal ini, saya ingin mengoreksi ( reworddalam bahasa git) pesan komit yang dimaksud:

Komitmen awal (dengan pesan yang menyesatkan)

… Untuk sesuatu yang sesuai.

Tidak mengherankan, upaya saya di atas tidak berhasil karena komit pertama jelas tidak memiliki komit orang tua . (Dan ketika Anda rebase, Anda perlu merujuk pada komit terlama berikutnya sebelum yang Anda inginkan reword, bukan?)

Inti dari pertanyaan saya, dengan demikian, dapatkah Anda mencapai ini dengan cara lain melakukan itu?

Henrik
sumber
Atau Anda bisa membiarkannya sepanjang waktu sebagai repositori kekhasan norak.
Christopher
4
kemungkinan duplikat Mengubah pesan dari komit pertama? (git)
Mark Longair
^ Sangat benar ... Saya pikir saya telah mencari dengan benar pertanyaan khusus ini, tetapi pertanyaan itu sama dengan pertanyaan saya. Ada banyak sekali upaya untuk menyempurnakan copywriting pertanyaan saya. :-P
Henrik
1
@hced: :) copywriting Anda tidak sia-sia - ini akan membantu orang lain menemukan solusi di masa depan, bahkan ditutup sebagai duplikat
Mark Longair
2
Siapapun yang menemukan pertanyaan ini dapat menemukan jawaban saya untuk Mengubah pesan dari komit pertama? (git) untuk membantu.

Jawaban:

215

Melakukan git rebase -i --root

(arahkan ke rootalih-alih menunjuk ke komit tertentu)

Dengan cara ini, komit pertama juga disertakan dan Anda bisa rewordmelakukannya seperti komit lainnya.

The --rootpilihan diperkenalkan pada Git v1.7.12(2012). Sebelumnya, satu-satunya pilihan adalah menggunakan filter-branchatau --amend, yang biasanya lebih sulit dilakukan.

Catatan: lihat juga pertanyaan dan jawaban serupa ini .

florisla.dll
sumber
12

Anda selalu dapat menggunakan git filter-branch --msg-filter:

git filter-branch --msg-filter \
  'test $GIT_COMMIT = '$(git rev-list --reverse master |head -n1)' &&
echo "Nice message" || cat' master
garpu0
sumber
1
fork0: Bagus sekali, terima kasih. Penasaran, apakah ini dianggap praktik yang "sah", karena tidak ada kata yang lebih baik. Maksud saya, apakah biasa / disarankan untuk melakukan seperti ini? Juga, dapatkah Anda melakukan ini berkali-kali jika ada pesan komit yang salah? Alasan untuk menanyakan itu adalah karena saya pertama kali melakukannya dengan komit SHA-1 yang salah, menyalin cuplikan Anda (milik Anda adalah komit terbaru sedangkan saya ingin mengubah yang pertama). Setelah menggunakan perintah sekali lagi, kali ini dengan SHA-1 yang benar (komit pertama; 6707a66), itu muncul pada saya.
Henrik
Yah, itu biasa :) Dan ya, Anda bisa mengulanginya. Jika Anda menambahkannya, -fitu akan dilanjutkan dan selalu menulis ulang komit dari cabang yang diberikan. Nilai referensi cabang dari pertama kali disimpan refs/original/master, sebelum Anda menjalankan perintah.
fork0
Tentu saja, Anda dapat menghapus (atau mengganti nama) referensi yang disimpan.
fork0
2
Saya memperbarui kode untuk memastikan kesalahan dengan id komit yang disalin tidak terjadi. Sekarang kodenya bahkan dapat disalin-tempel. Sebuah kata peringatan , meskipun: itu tidak bekerja dengan benar jika ada lebih dari satu komit awal (yaitu ketika Anda menggabungkan dua atau lebih cabang yang tidak terkait)
fork0
3
@hced: Anda harus menyadari bahwa menulis ulang setiap komit yang dianggap sebagai "riwayat yang dipublikasikan" biasanya merupakan ide yang buruk. Dalam kasus Anda, itu berarti Anda biasanya tidak boleh melakukan ini jika ada orang lain yang pernah mengerjakan sebuah commit yang memiliki root commit Anda sebagai leluhur.
Mark Longair
12

inti pcreux memiliki cara yang baik untuk menulis ulang komit pertama:

# You can't use rebase -i here since it takes the parent commit as argument.
# You can do the following though:
git checkout FIRST_COMMIT_SHA && git commit --amend && git rebase HEAD master
Douglas
sumber
3
Mulai git 1.7.12 , git rebase -i --rootadalah cara terbaik, seperti yang disarankan oleh florisla.
Douglas