Je veux modifier un message de commit plus profondément dans l'histoire et j'ai poussé de nombreux nouveaux commits.
Comment modifier le message de validation? C'est possible?
Je veux modifier un message de commit plus profondément dans l'histoire et j'ai poussé de nombreux nouveaux commits.
Comment modifier le message de validation? C'est possible?
Réponses:
Le message de Linus Torvalds peut répondre à votre question:
Modifier / éditer les anciens messages de validation
Réponse courte: vous ne pouvez pas (si vous êtes poussé).
extrait (Linus désigne BitKeeper comme BK):
Note latérale, juste par intérêt historique: en BK, vous pourriez.
Et si vous y êtes habitué (comme moi), c'était vraiment très pratique. J'appliquais une bombe patch d'Andrew, je remarquais que quelque chose n'allait pas et je la modifais simplement avant de la sortir.
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 n'a pas été touché, et en autorisant la chose "réparer les commentaires plus tard".
Mais je ne l'ai pas fait.
Une partie de celui-ci est purement "cohérence interne". Git est simplement un système plus propre grâce au fait que tout est protégé par SHA1 et que tous les objets sont traités de la même manière, quel que soit le type d'objet. Oui, il y a quatre différents types d'objets, et ils sont tous très 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, sur le plan conceptuel ils fonctionnent tous exactement le même.
Mais la cohérence interne n'est pas vraiment une excuse pour être inflexible, et il serait clairement très flexible si nous pouvions simplement réparer les erreurs après qu'elles se produisent. Ce n'est donc pas un argument très fort.
La vraie raison pour laquelle git ne vous permet pas de modifier le message de validation finit par être très simple: de cette façon, vous pouvez faire confiance aux messages. Si vous autorisez les gens à les changer par la suite, les messages ne sont pas très fiables par nature.
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 un rebase et une réinitialisation - hard, gasp!)
Cependant, une fois que vous publiez votre histoire révisée à nouveau (avec git push origin +master:master
, le +
signe forçant la poussée à se produire, même si elle ne donne pas lieu à une validation « avance rapide ») ... vous pourriez obtenir des ennuis .
Extrait de cette autre question SO:
En fait, une fois, j'ai poussé avec --force vers le référentiel git.git et j'ai été grondé par Linus BIG TIME. Cela créera beaucoup de problèmes pour les autres. Une réponse simple est "ne le faites pas".
Actuellement, un remplacement git pourrait faire l'affaire.
En détail: créer une branche de travail temporaire
git checkout -b temp
Réinitialiser le commit à remplacer
git reset --hard <sha1>
Modifier le commit avec le bon message
git commit --amend -m "<right message>"
Remplacez l'ancien commit par le nouveau
git replace <old commit sha1> <new commit sha1>
retourne à la succursale où tu étais
git checkout <branch>
supprimer la branche temporaire
git branch -D temp
pousser
guess
terminé.
Vous pouvez utiliser git rebase -i
(par rapport à la branche à partir de laquelle vous avez créé une branche) «i» pour interactif.
Remplacez le pick
suivant du commentaire de validation que vous souhaitez modifier par r
(ou reword
), enregistrez et quittez et, ce faisant, vous pourrez effectuer la modification.
git push
encore une fois et vous avez terminé!
-p
argument rebase
dont les p
réserves fusionnent.
Supposons que vous ayez un arbre comme celui-ci:
dd2e86 - 946992 - 9143a9 - a6fd86 - 5a6057 [master]
Tout d'abord, checkout
une branche temporaire:
git checkout -b temp
Sur la temp
branche, reset --hard
à un commit dont vous voulez changer son message (par exemple, ce commit 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 commettras qui est en avance sur 946992
de master
la temp
et les commettras, utilisez amend
si vous voulez changer leurs messages ainsi:
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]
Maintenant, forcez le transfert de la branche temp vers la télécommande:
git push --force origin temp:master
La dernière étape, supprimer la branche master
en local, git fetch origin
extraire la branche master
du serveur, puis passer à la branche master
et supprimer la branche temp
.
Désormais, tous les messages seront mis à jour sur votre site local et distant.
Dans notre boutique, j'ai introduit la convention d'ajouter des balises annotées nommées de manière reconnaissable aux commits avec des messages incorrects, et d'utiliser l'annotation comme remplacement.
Même si cela n'aide pas les gens qui exécutent des commandes "git log" occasionnelles, cela nous fournit un moyen de corriger les références de bug tracker incorrectes dans les commentaires, et tous mes outils de construction et de publication 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 ...
(Depuis http://git.or.cz/gitwiki/GitTips#head-9f87cd21bcdf081a61c29985604ff4be35a5e6c0 )
Comment changer s'engage plus profondément dans l'histoire
Étant donné que l'historique dans Git est immuable, corriger tout autre commit que le commit le plus récent (commit qui n'est pas en tête de branche) nécessite que l'historique soit réécrit à partir du commit modifié et en avant.
Vous pouvez utiliser StGIT pour cela, initialiser la branche si nécessaire, désengager jusqu'au commit que vous voulez changer, y accéder si nécessaire, faire un changement puis actualiser le patch (avec l'option -e si vous voulez corriger le message de commit), puis pousser tout et stg s'engagent.
Ou vous pouvez utiliser rebase pour le faire. Créez une nouvelle branche temporaire, rembobinez-la au commit que vous voulez changer en utilisant git reset --hard, changez ce commit (ce serait en haut de l'en-tête actuel), puis rebasez la branche en haut du commit modifié, en utilisant git rebase --onto.
Ou vous pouvez utiliser git rebase --interactive, qui permet diverses modifications telles que la réorganisation des patchs, la réduction, ...
Je pense que cela devrait répondre à votre question. Cependant, notez que si vous avez poussé du code vers un référentiel distant et que des personnes l'ont extrait, cela va gâcher leur historique de code, ainsi que le travail qu'ils ont effectué. Alors faites-le soigneusement.