Ubah pesan komit lama di Git

136

Saya mencoba mengedit pesan komit lama seperti yang dijelaskan di sini .

Masalahnya adalah sekarang, ketika saya mencoba menjalankannya rebase -i HEAD~5dikatakan interactive rebase already started.

Jadi saya coba: git rebase --continuetetapi ada kesalahan ini:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Ada ide?

Pablo Fernandez
sumber

Jawaban:

125

Ia mengatakan:

Saat Anda menyimpan dan keluar dari editor, itu akan memundurkan Anda kembali ke komit terakhir dalam daftar itu dan menjatuhkan Anda pada baris perintah dengan pesan berikut:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

Itu tidak berarti:

ketik lagi git rebase -i HEAD~3

Cobalah untuk tidak mengetik git rebase -i HEAD~3ketika keluar dari editor, dan itu akan berfungsi dengan baik.
(Jika tidak, dalam situasi khusus Anda, git rebase -i --abortmungkin diperlukan untuk mengatur ulang semuanya dan memungkinkan Anda untuk mencoba lagi)


Seperti yang disebutkan oleh Dave Vogt dalam komentar, git rebase --continueadalah untuk pergi ke tugas berikutnya dalam proses rebasing, setelah Anda mengubah komit pertama .

Juga, Gregg Lind menyebutkan dalam jawabannya pada rewordperintahgit rebase :

Dengan mengganti perintah "pilih" dengan perintah "edit", Anda dapat meminta git rebaseberhenti setelah menerapkan komit itu, sehingga Anda dapat mengedit file dan / atau pesan komit, mengubah komit, dan melanjutkan rebasing.

Jika Anda hanya ingin mengedit pesan komit untuk komit, ganti perintah " pick" dengan perintah " reword" , sejak Git1.6.6 (Januari 2010) .

Itu melakukan hal yang sama ' edit' lakukan selama rebase interaktif, kecuali itu hanya memungkinkan Anda mengedit pesan komit tanpa mengembalikan kontrol ke shell . Ini sangat berguna.
Saat ini jika Anda ingin membersihkan pesan komit, Anda harus:

$ git rebase -i next

Kemudian atur semua komit ke 'edit'. Kemudian pada masing-masing:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

Menggunakan ' reword' bukannya ' edit' memungkinkan Anda melewatkan git-commitdan git-rebasemenelepon .

VONC
sumber
2
Juga, git rebase --continuelanjutkan ke tugas berikutnya dalam proses rebasing, setelah Anda mengubah komit pertama.
Dave Vogt
1
Menambahkan tautan ke artikel wiki github untuk mengubah pesan komit
Joy
60

Seperti yang disarankan Gregg Lind, Anda dapat menggunakan reword untuk diminta untuk hanya mengubah pesan komit (dan membiarkan komit tetap utuh):

git rebase -i HEAD~n

Di sini, nadalah daftar dari n komitmen terakhir.

Misalnya, jika Anda menggunakan git rebase -i HEAD~4, Anda mungkin melihat sesuatu seperti ini:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Sekarang ganti pick dengan reword untuk komit yang ingin Anda edit pesan:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Keluar dari editor setelah menyimpan file, dan selanjutnya Anda akan diminta untuk mengedit pesan untuk komit yang telah Anda tandai reword , dalam satu file per pesan. Perhatikan bahwa itu sudah jauh lebih mudah untuk hanya mengedit komit pesan ketika Anda diganti pickdengan reword, tetapi melakukan hal itu tidak berpengaruh.

Pelajari lebih lanjut di halaman GitHub untuk Mengubah pesan komit .

Punit Vara
sumber
Sangat dijelaskan. Terima kasih: D
Shubham Jain
Terima kasih @ShubhamJain Senang bahwa jawaban saya bermanfaat
Punit Vara
Saya melakukan itu, dan kemudian melakukan dari cabang lain muncul di cabang saya
Reza
@ Reza Anda mungkin telah mengacaukan sesuatu. Coba ini di beberapa repo lainnya. Solusi ini berfungsi dengan baik
Punit Vara
54

FWIW, git rebase interaktif sekarang memiliki opsi "reword", yang membuat ini jauh lebih menyakitkan!

Gregg Lind
sumber
3
Saat menggunakan reword, mengapa git tidak membiarkan Anda mengedit pesan komit di file itu dengan daftar commit? Sebaliknya itu akan meluncurkan editor dengan satu file pesan komit per rewordbaris. Ini tidak perlu. Bahkan jika tindakan lain selain pickatau rewordmemerlukan meluncurkan perintah eksternal, rewordtidak akan mengharuskan itu.
Dan Dascalescu
9

Hanya ingin memberikan opsi berbeda untuk ini. Dalam kasus saya, saya biasanya bekerja pada cabang individu saya kemudian bergabung untuk menguasai, dan individu yang saya lakukan untuk lokal saya tidak begitu penting.

Karena kait git yang memeriksa nomor tiket yang sesuai pada Jira tetapi case-sensitive, saya dicegah untuk mendorong kode saya. Juga, komit sudah dilakukan sejak lama dan saya tidak ingin menghitung berapa banyak komit untuk kembali pada rebase.

Jadi apa yang saya lakukan adalah membuat cabang baru dari master terbaru dan squash semua komit dari cabang bermasalah menjadi satu komit di cabang baru. Itu lebih mudah bagi saya dan saya pikir itu ide yang baik untuk memilikinya di sini sebagai referensi di masa depan.

Dari master terbaru:

git checkout -b new-branch

Kemudian

git merge --squash problem-branch
git commit -m "new message" 

Referece: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch

WebDever
sumber
1
Jawaban Anda benar-benar menyelamatkan hari saya :). Saya berjuang dengan rebase -iseperti sekitar 2 jam dan tidak berhasil. Komit saya ada di belakang 18 komit, jadi bisa Anda bayangkan. Ini adalah cara yang lebih sederhana dan praktis yang dapat saya temukan tanpa perlu menggunakan rebase. Terima kasih teman!
Carlos Parra
6

Berikut adalah inti yang sangat bagus yang mencakup semua kasus yang mungkin: https://gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4

Gambaran:

git rebase -i HEAD~X
# X is the number of commits to go back
# Move to the line of your commit, change pick into edit,
# then change your commit message:
git commit --amend
# Finish the rebase with:
git rebase --continue
Mahmoud Zalt
sumber