Comment reformuler le tout premier message git commit?

116

J'ai un arbre de travail contenant 3 commmits:

➜ ~ monprojet git: (maître) 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)

Maintenant, je souhaite rewordle message de validation de mon premier commit (6707a66)

➜ ~ monprojet git: (maître) git rebase -i 6707

(… En entrant 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

Dans ce cas, je souhaite corriger ( reworddans le langage git) le message de commit en question:

Commit initial (avec un message trompeur)

… À quelque chose d'approprié.

Sans surprise, ma tentative ci-dessus n'a pas réussi car le premier commit n'a évidemment aucun commit parent . (Et quand vous rebase, vous devez référencer le prochain commit le plus ancien avant celui que vous souhaitez reword, non?)

L'essentiel de ma question, par conséquent, pouvez-vous y parvenir par tout autre moyen de le faire?

Henrik
la source
Ou vous pouvez simplement le laisser pour toujours comme une bizarrerie de
Christopher
4
duplicata possible de Changer le message du premier commit? (git)
Mark Longair
^ Très vrai ... Je pensais avoir bien cherché cette question particulière mais c'est la même que la mienne. Il y a énormément de perfectionnement de la rédaction de ma question. :-P
Henrik
1
@hced: :) votre rédaction n'est pas gaspillée - cela aidera d'autres personnes à trouver une solution à l'avenir, même si elle devait être fermée en double
Mark Longair
2
Quiconque rencontre cette question peut trouver ma réponse à Changer le message du premier commit? (git) pour être utile.

Réponses:

215

Faire git rebase -i --root

(pointez vers rootau lieu de pointer vers un commit spécifique)

De cette façon, le premier commit est également inclus et vous pouvez le faire rewordcomme n'importe quel autre commit.

L' --rootoption a été introduite dans Git v1.7.12(2012). Auparavant, la seule option était d'utiliser filter-branchou --amend, ce qui est généralement plus difficile à faire.

Remarque: voir également cette question et réponse similaires .

florisla
la source
12

Vous pouvez toujours utiliser 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
fourchette0
la source
1
fork0: C'est super, merci. Curieux, est-ce que cela doit être considéré comme une pratique «légitime», faute de meilleur mot. Je veux dire, est-il courant / recommandé de le faire comme ça? En outre, pouvez-vous faire cela maintes et maintes fois dans les cas de messages de validation défectueux? La raison pour laquelle j'ai posé cette question est que je l'ai d'abord fait avec le mauvais commit SHA-1, en copiant votre extrait (le vôtre était le dernier commit alors que je voulais changer le tout premier). Après avoir utilisé à nouveau la commande, cette fois avec le SHA-1 correct (premier commit; 6707a66), ça m'a grillé.
Henrik
Eh bien, c'est courant :) Et oui, vous pouvez le répéter. Si vous ajoutez simplement, -fil ira de l'avant et réécrira toujours les commits de la branche donnée. La valeur de référence de branche de la première fois a été enregistrée dans refs/original/master, avant que vous exécutiez la commande.
fourchette0
Bien sûr, vous pouvez simplement supprimer (ou renommer) la référence enregistrée.
fourchette0
2
J'ai mis à jour le code pour m'assurer que l'erreur avec l'identifiant de validation copié ne se produit pas. Maintenant, le code est même copiable. Un mot d'avertissement , cependant: cela ne fonctionne pas correctement s'il y a plus d'un commit initial (c'est-à-dire lorsque vous avez fusionné deux ou plusieurs branches non liées)
fork0
3
@hced: Vous devez être conscient que la réécriture de tout commit considéré comme "historique publié" est généralement une mauvaise idée. Dans votre cas, cela signifierait que vous ne devriez généralement pas faire cela si quelqu'un d'autre aurait déjà travaillé sur un commit qui avait votre commit root comme ancêtre.
Mark Longair
12

L'essentiel de pcreux a un bon moyen de reformuler le premier commit:

# 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
la source
3
Depuis git 1.7.12 , git rebase -i --rootc'est la voie à suivre, comme suggéré par florisla.
Douglas