İlk git commit mesajını nasıl yeniden ifade ederim?


116

3 komisyon içeren bir çalışma ağacım var:

➜ ~ projem git: (ana) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <my@mail.com>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <my@mail.com>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

Şimdi ilk taahhüdümünreword commit mesajını diliyorum (6707a66)

➜ ~ projem git: (ana) git rebase -i 6707

(… Vim giriliyor)

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

Bu durumda, söz rewordkonusu commit mesajını ( git dilinde) düzeltmek istiyorum :

İlk taahhüt (yanıltıcı bir mesajla)

… Uygun bir şeye.

Şaşırtıcı olmayan bir şekilde, yukarıdaki girişimim başarılı olamadı, çünkü ilk taahhüt açıkça herhangi bir ebeveyn taahhüdü içermiyor . (Eğer zaman rebase, sen başvurmak gerekir sonraki en eski işlemek önce sen isteyen birine reworddoğru,?)

Sorumun özü, bu nedenle, bunu başka bir yöntemle başarabilir misiniz?


Ya da her zaman bir depo tawdry tuhaflığı
Christopher


^ Çok doğru ... Bu soruyu doğru bir şekilde araştırdığımı sanıyordum ama bu benimkiyle aynı. Sorumun metin yazarlığını mükemmelleştiren çok şey var. :-P
Henrik

1
@hced: :) Metin yazarlığınız boşa gitmez - diğer insanların gelecekte bir çözüm bulmalarına yardımcı olur, kopya olarak kapatılacak olsa bile
Mark Longair

2
Bulabilir bu soruya denk gelen herkes benim cevap için ilk taahhüt mesajını değiştirme? (git) yardımcı olmak için.

Yanıtlar:


215

Yapmak git rebase -i --root

( rootbelirli bir kaydetme yerine işaret edin)

Bu şekilde, ilk commit de dahil edilir ve bunu reworddiğer herhangi bir commit gibi yapabilirsiniz .

--rootSeçenek Git'te tanıtıldı v1.7.12(2012). O zamandan önce tek seçenek filter-branchveya kullanmaktı --amend, ki bu genellikle daha zordu.

Not: Bu benzer soru ve yanıta da bakın .


12

Her zaman kullanabilirsiniz 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

1
fork0: Bu harika, teşekkürler. Meraklı, bu daha iyi bir kelime olmadığı için "meşru" uygulama olarak görülmeli mi? Demek istediğim, böyle yapmak yaygın mı / tavsiye ediliyor mu? Ayrıca hatalı commit mesajlarının olduğu durumlarda bunu tekrar tekrar yapabilir misiniz? Bunu sormamın nedeni, ilk olarak bunu yanlış SHA-1 işlemiyle yaptığım, snippet'inizi kopyaladığım içindir (sizinki en son işlemdi, oysa ben ilkini değiştirmek istedim). Komutu bir kez daha kullandıktan sonra, bu sefer doğru SHA-1 (ilk commit; 6707a66) ile bana kustu.
Henrik

Pekala, bu yaygındır :) Ve evet, tekrar edebilirsiniz. Yalnızca eklerseniz -f, devam eder ve her zaman verilen şubenin taahhütlerini yeniden yazar. refs/original/masterKomutu çalıştırmadan önce , ilk seferdeki dal referans değeri kaydedildi .
fork0

Elbette, kaydedilen referansı kaldırabilir (veya yeniden adlandırabilirsiniz).
fork0

2
Kopyalanan kaydetme kimliğiyle ilgili hatanın olmamasını sağlamak için kodu güncelledim. Artık kod kopyalanabilir bile. Bununla birlikte, bir uyarı kelimesi : Birden fazla ilk kaydetme varsa (yani, iki veya daha fazla ilgisiz dalı birleştirdiğinizde) doğru
çalışmaz

3
@hced: "Yayınlanmış geçmiş" olarak kabul edilen herhangi bir kaydı yeniden yazmanın genellikle kötü bir fikir olduğunu bilmelisiniz. Sizin durumunuzda, bu, bir başkası sizin bir atanız olarak kök taahhüdünüze sahip bir taahhüt üzerinde çalışıyorsa, genellikle bunu yapmamanız gerektiği anlamına gelir.
Mark Longair

12

pcreux'un özü , ilk commit'i yeniden ifade etmenin iyi bir yoluna sahiptir:

# 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

3
İtibariyle Git 1.7.12 , git rebase -i --rootflorisla önerdiği gibi, gitmek yoludur.
Douglas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.