Git: modifier uniquement les messages des validations précédentes

12

Pour des raisons paresseuses, j'ai poussé un tas de commits avec des messages par défaut et maintenant c'est devenu lourd, car je ne sais pas vraiment ce que j'ai changé dans chaque commit.

Comment modifier uniquement les messages des validations précédentes et (si possible) conserver l'arborescence des validations?

Tuyen Pham
la source
10
Méfiez-vous de l'évolution de l'histoire publique!
D. Ben Knoble
2
je crains que les réponses ici ne vous donnent des avertissements assez désastreux. cela va créer un énorme gâchis si quelqu'un d'autre a tiré votre histoire entre-temps - tout le moreso s'ils ont commis de nouveaux travaux en plus!
Évoli
Je vais l'utiliser avec raison, j'ai un cas plus simple ici, je suis le seul à utiliser ce dépôt.
Tuyen Pham
3
Info: Ceci est déjà demandé (peut-être plusieurs fois) sur Stack Overflow .
user202729

Réponses:

20

Pour modifier les messages de validation d'une série de validations, je lance

git rebase -i firstsha

firstshaest un identifiant pour le commit parent du premier commit que je veux éditer. (Vous pouvez utiliser n'importe quelle référence valide ici, donc git rebase -i HEAD~4affichera les quatre derniers commits.)

Dans l'éditeur qui s'ouvre, changez toutes les entrées «pick» en «reword» sur les commits que vous souhaitez modifier, puis fermez l'éditeur; il vous sera alors demandé de saisir des messages de validation pour tous les validations que vous avez choisies.

Notez que cela va changer le commit arbre, parce que les hash des commits changeront. Vous devrez forcer votre nouvel arbre ou le pousser vers une nouvelle branche. Cela gâchera également les fusions, évitez donc de modifier les validations de fusion.

Pour modifier rapidement uniquement le dernier commit, exécutez

git commit --amend

(mais méfiez-vous de tout ce qui est organisé pour la validation)

Stephen Kitt
la source
Comment cela affecterait-il l'arbre de validation, créera-t-il une ligne verticale intermédiaire dans l'arbre de validation? Je n'avais qu'une seule arborescence de validation de ligne verticale maintenant, et plus de 100 messages doivent être modifiés.
Tuyen Pham
3
Il ne créera pas de nouvelle «ligne» dans votre arbre de commit, il changera tous les commits. Si votre historique est actuellement linéaire, il le restera.
Stephen Kitt
Ça dépend. L'utilisez-vous par vous-même et ne poussez pas vers un serveur? Alors non, une seule "ligne". Mais sinon, il pourrait y en avoir deux, et sur la base de vos réponses aux deux premières, nous pouvons vous aider à vous débarrasser de l'ancienne «ligne».
Captain Man
1
Rebase a un indicateur pour gérer les fusions (je pense que c'est preserve-merges)
D. Ben Knoble
6

Ce que vous cherchez, c'est git rebase.

Si vous souhaitez uniquement modifier le git commitmessage précédent , il vous suffit d'utiliser les éléments suivants:

git commit --amend

Et apportez les modifications souhaitées au commit précédent, puis enregistrez les modifications.

Cependant, si vous devez modifier des commits plus anciens, vous devez les utiliser rebase.

git rebase -i HEAD~N 

où N est égal au nombre de validations dans lesquelles vous souhaitez revenir, par exemple 2 ou 12 ou 6, etc. etc.

Ici, vous devriez obtenir un éditeur de texte avec vos validations. Modifiez l'option de pickà rewordpour modifier le message.

Une fois que vous avez identifié tous les commits que vous souhaitez modifier et que vous avez correctement modifié leurs options, enregistrez et fermez l'éditeur. Apportez ensuite les modifications à chaque message de validation. Une fois que vous êtes satisfait, vous pouvez exécuter:

git push --force

Et vous devriez avoir conservé votre historique git, bien qu'avec des valeurs de hachage différentes, car vous avez apporté les modifications nécessaires que vous souhaitez. Voici quelques liens supplémentaires que vous devriez consulter:

7.6 Outils Git - Historique de réécriture
Aide GitHub - Modification d'un message de
validation StackOverflow - Question sur la modification des anciens messages de validation

kemotep
la source
Si vous «reformulez», vous n'avez pas besoin de « commit --amend», à moins que vous ne gâchiez le processus de validation d'une manière ou d'une autre.
Stephen Kitt
Merci, voici les étapes que je vais faire si je comprends bien de votre message: 1. faites git rebase -i firstshacela firstshaest le hachage du commit parent du commit que je voudrais changer le message, puis dans l'éditeur, changer picken reword, enternouveau message, puis émettre git rebase --continueet faire git push --force?
Tuyen Pham
@StephenKitt, je viens de remarquer votre réponse, je faisais la mienne en soumettant la vôtre. Je vais suivre vos conseils et chercher à apporter ces modifications. S'il est plus approprié, je peux fusionner ma réponse dans la vôtre en ajoutant des liens vers la vôtre si vous pensez que cela conviendrait mieux à cette question que d'avoir plusieurs réponses similaires.
kemotep
@TuyenPham vous avez seulement à faire git rebase -i HEAD~Navec N étant le nombre de validations que vous souhaitez retourner. Modifiez chaque option de validation dont vous souhaitez modifier le message de pickà reword, enregistrez ce fichier, apportez les modifications à chacun de ces fichiers de validation et enregistrez-les. Une fois que vous êtes sûr d'avoir terminé, vous n'avez besoin que de git push --force [Name of git branch you are were working on]. Vous pouvez toujours revenir en arrière et recommencer ou le faire par étapes.
kemotep