web-dev-qa-db-fra.com

Comment éditer un message de commit incorrect dans git (que j'ai poussé)?

Je souhaite modifier un message de validation plus en profondeur dans l’histoire et j’ai lancé de nombreux nouveaux commits.

Comment changer le message de commit? C'est possible?

149
Jimmy

Le message de Linus Torvalds peut répondre à votre question:

Modifier/modifier les anciens messages de validation

Réponse courte: vous ne pouvez pas (si poussé).


extrait (Linus fait référence à BitKeeper en tant que BK):

Note secondaire, juste par intérêt historique: à BK, vous pourriez.

Et si vous en avez l'habitude (comme moi), c'était vraiment très pratique. J'appliquerais un patch-bombe d'Andrew, remarquerais que quelque chose n'allait pas et le modifierais avant de le diffuser.

J'aurais pu faire la même chose avec git. Il aurait été assez facile de faire en sorte que le message de validation ne fasse pas partie du nom, tout en garantissant que l'historique ne soit pas altéré, et en autorisant la fonction de "correction des commentaires plus tard".

Mais je n'ai pas.

Une partie de celle-ci est purement "cohérence interne". Git est simplement un nettoyeur grâce au fait que tout est protégé par SHA1 et que tous les objets sont traités de la même façon, quel que soit leur type. Oui, il y a quatre types d'objets différents, et ils sont tous vraiment différents, et ils ne peuvent pas être utilisés de la même manière, mais en même temps, même si leur codage peut être différent sur le disque, conceptuellement ils fonctionnent tous exactement de la même façon.

Mais la cohérence interne n’est pas vraiment une excuse pour être inflexible, et il serait évidemment très flexible si nous pouvions simplement corriger les erreurs après qu’elles se produisent. Donc, ce n'est pas un argument très fort.

La raison réelle que git ne vous permet pas de changer le message de validation finit par être très simple: vous pouvez ainsi faire confiance aux messages. Si vous autorisez les personnes à les modifier par la suite, les messages ne sont en soi pas très fiables.


Pour être complet, vous pouvez réécrire votre historique de commit local afin de refléter ce que vous voulez, comme suggéré par sykora (avec certains rebase et réinitialiser - dur, halète!)

Cependant, une fois que vous avez publié votre historique révisé à nouveau (avec un git Push Origin +master:master, le + signe signe forçant le Push, même si cela ne donne pas lieu à un commit "fast-forward") ... you pourrait avoir quelques ennuis .

Extrait de cette autre SO question:

En fait, une fois, j'ai poussé avec --force dans le référentiel git.git et je me suis fait gronder par Linus BIG TIME. Cela créera beaucoup de problèmes pour les autres. Une réponse simple est "ne le fais pas".

125
VonC

Actuellement, un git replace pourrait faire l'affaire.

En détail: créer une branche de travail temporaire

git checkout -b temp

Réinitialiser au commit à remplacer

git reset --hard <sha1>

Modifier le commit avec le bon message

git commit --amend -m "<right message>"

Remplacer l'ancien commit par le nouveau

git replace <old commit sha1> <new commit sha1>

retournez à la succursale où vous étiez

git checkout <branch>

enlever la branche temporaire

git branch -D temp

Pousser

guess

terminé.

26
Johan

Vous pouvez utiliser git rebase -i _ (par rapport à la branche d'origine) 'i' pour interactif.

Remplacez pick à côté du commentaire de validation que vous souhaitez modifier par r (ou reword), enregistrez et quittez l'opération. Vous pourrez alors effectuer l'édition. .

git Push encore une fois et vous avez terminé!

17
Marcus

Supposons que vous ayez un arbre comme ceci:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]

Tout d'abord, checkout une branche temporaire:

git checkout -b temp

Sur temp branche, reset --hard à une validation dont vous souhaitez modifier le message (par exemple, cette validation est 946992):

git reset --hard 946992

Utilisez amend pour changer le message:

git commit --amend -m "<new_message>"

Après cela, l’arbre ressemblera à ceci:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
           \
            b886a0 [temp]

Ensuite, cherry-pick tout le commit qui est en avance sur 946992 de master à temp et les valider, utilisez amend si vous souhaitez également modifier leurs messages:

git cherry-pick 9143a9
git commit --amend -m "<new_message>
...
git cherry-pick 5a6057
git commit --amend -m "<new_message>

L'arbre ressemble maintenant à ceci:

dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
               \
                b886a0 - 41ab2c - 6c2a3s - 7c88c9 [temp]

Forcez maintenant la branche temp sur la télécommande:

git Push --force Origin temp:master

La dernière étape, supprimer la branche master sur local, git fetch Origin pour extraire la branche master du serveur, puis basculer sur la branche master et supprimer la branche temp.

Désormais, vos messages locaux et distants auront tous les messages mis à jour.

13
Huy Vo

Dans notre boutique, j’ai introduit la convention qui consiste à ajouter des balises annotées avec un nom reconnaissable aux commits contenant des messages incorrects et à utiliser l’annotation comme substitut.

Même si cela n’aide pas les utilisateurs de commandes occasionnelles "git log", il nous fournit un moyen de corriger les références de suivi des bogues incorrectes dans les commentaires, et tous mes outils de compilation et de diffusion comprennent la convention.

Ce n’est évidemment pas une réponse générique, mais c’est peut-être quelque chose que les gens peuvent adopter au sein de communautés spécifiques. Je suis sûr que si cela est utilisé à plus grande échelle, une sorte de support en porcelaine pourrait apparaître, éventuellement ...

5
Christian Goetze

(De http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c )

Comment changer s'engage plus profondément dans l'histoire

Étant donné que l'historique dans Git est immuable, la correction de tout, à l'exception de la dernière validation (validation qui n'est pas la tête de branche), nécessite que l'historique soit réécrit à partir de la validation et de la transmission modifiées.

Vous pouvez utiliser StGIT pour cela, initialiser la branche si nécessaire, annuler l'engagement jusqu'à la validation que vous souhaitez modifier, y accéder si nécessaire, modifier, puis actualiser le correctif (avec l'option -e si vous souhaitez corriger le message de validation), puis Push tout et stg commettent.

Ou vous pouvez utiliser rebase pour le faire. Créez une nouvelle branche temporaire, rembobinez-la dans le commit que vous souhaitez modifier à l'aide de git reset --hard, changez-la (il s'agirait du sommet de la tête), puis rebassez la branche par-dessus le commit modifié, à l'aide de git rebase --onto.

Vous pouvez également utiliser git rebase --interactive, qui permet diverses modifications telles que la réorganisation des correctifs, la réduction, etc.

Je pense que cela devrait répondre à votre question. Cependant, notez que si vous envoyez du code dans un référentiel distant et que des personnes en ont extrait le contenu, cela va gâcher leur historique de code, comme ainsi que le travail qu'ils ont fait. Alors faites-le soigneusement.

2
sykora