web-dev-qa-db-fra.com

Editer le commit racine dans Git?

Il y a moyen de changer le message des commits ultérieurs:

git commit --amend                    # for the most recent commit
git rebase --interactive master~2     # but requires *parent*

Comment pouvez-vous changer le message de validation de la toute première validation (qui n'a pas de parent)?

295
13ren

En supposant que vous ayez un arbre de travail propre, vous pouvez procéder comme suit.

# checkout the root commit
git checkout <sha1-of-root>

# amend the commit
git commit --amend

# rebase all the other commits in master onto the amended root
git rebase --onto HEAD HEAD master
252
CB Bailey

A partir de la version Git 1.7.12 , vous pouvez maintenant utiliser

git rebase -i --root
512
ecdpalma

Pour développer réponse d'ecdpalma , vous pouvez maintenant utiliser le --root option pour indiquer à rebase que vous souhaitez réécrire la racine/premier commit:

git rebase --interactive --root

Ensuite, la validation root apparaît dans la liste TODO de la base, et vous pouvez choisir de la modifier ou de la reformuler:

reword <root commit sha> <original message>
pick <other commit sha> <message>
...

Ceci est l'explication de --root de la documentation de la base de données Git (souligné par moi):

Rebase tous les commits accessibles depuis <branch>, au lieu de les limiter avec un <upstream>. Ceci vous permet de redéfinir la base de la validation sur une branche.

61
user456814

Juste pour fournir une alternative aux réponses les mieux notées:

Si vous créez un référentiel et savez dès le départ que vous allez redéfinir la base de son "premier" véritable commit à l'avenir, vous pouvez éviter ce problème en créant un commit vide explicite au début:

git commit --allow-empty -m "Initial commit"

et alors seulement commencer à faire de "vrais" commits. Ensuite, vous pouvez facilement redéfinir la base de cette validation, par exemple git rebase -i HEAD^

12
jakub.g

Vous pouvez utiliser git filter-branch:

cd test
git init

touch initial
git add -A
git commit -m "Initial commit"

touch a
git add -A
git commit -m "a"

touch b
git add -A
git commit -m "b"

git log

-->
8e6b49e... b
945e92a... a
72fc158... Initial commit

git filter-branch --msg-filter \
"sed \"s|^Initial commit|New initial commit|g\"" -- --all

git log
-->
c5988ea... b
e0331fd... a
51995f1... New initial commit
4
Alexander Groß