web-dev-qa-db-fra.com

Changer l'ancien message de commit sur Git

J'essayais d'éditer un ancien message de commit comme expliqué ici .

Le problème, c’est que maintenant, lorsque j’essaie de lancer rebase -i HEAD~5 ça dit interactive rebase already started.

Alors j'essaye: git rebase --continue mais j'ai eu cette erreur:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Des idées?

123
Pablo Fernandez

Ça dit:

Lorsque vous enregistrez et quittez l'éditeur, il vous ramène à la dernière validation de cette liste et vous laisse tomber sur la ligne de commande avec le message suivant:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

Cela ne signifie pas:

taper à nouveau git rebase -i HEAD~3

Essayez de pas en tapant git rebase -i HEAD~3 lorsque vous quittez l'éditeur, et cela devrait fonctionner correctement.
(sinon, dans votre situation particulière, un git rebase -i --abort _ peut être nécessaire pour tout réinitialiser et vous permettre d'essayer à nouveau)


Comme Dave Vogt mentionne dans les commentaires, git rebase --continue est utilisé pour passer à la tâche suivante du processus de rebasage, après avoir modifié le premier commit.

Aussi, Gregg Lind mentionne dans sa réponse la reword commande de git rebase:

En remplaçant la commande "pick" par la commande "edit", vous pouvez dire à git rebase pour arrêter après avoir appliqué cette validation, afin que vous puissiez éditer les fichiers et/ou le message de validation, modifier la validation et continuer à changer de base.

Si vous souhaitez simplement modifier le message de validation d'une validation, remplacez la commande "pick" par la commande "reword" , depuis Git1.6.6 (janvier 2010) .

Il fait la même chose que 'edit' lors d'une rebase interactive, sauf que ne vous permet que de modifier le message de validation sans rendre le contrôle au shell . Ceci est extrêmement utile.
Actuellement, si vous voulez nettoyer vos messages de commit, vous devez:

$ git rebase -i next

Définissez ensuite tous les commits sur ‘edit’. Puis sur chacun:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

Utiliser ‘reword’ au lieu de ‘edit’ vous permet de sauter le git-commit et git-rebase appelle .

110
VonC

FWIW, git rebase interactive a maintenant une option de "reformulation", ce qui rend cela beaucoup moins douloureux!

49
Gregg Lind

Comme Gregg Lind l’a suggéré, vous pouvez utiliser le reformulation pour ne demander que le message de validation (et laisser la validation intacte dans le cas contraire):

git rebase -i HEAD~n

Ici, n est la liste des n derniers commits.

Par exemple, si vous utilisez git rebase -i HEAD~4, vous pouvez voir quelque chose comme ceci:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Maintenant, remplacez choisissez par reformulez pour les commits pour lesquels vous souhaitez modifier les messages. de:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Quittez l'éditeur après avoir sauvegardé le fichier. Ensuite, vous serez invité à éditer les messages des commits que vous avez marqués en reformulant , dans un fichier par message. Notez qu'il aurait été beaucoup plus simple de simplement modifier les messages de validation lorsque vous avez remplacé pick par reword, mais cela n'a aucun effet.

En savoir plus sur la page de GitHub pour Changer un message de validation .

35
Punit Vara

Je voulais juste fournir une option différente pour cela. Dans mon cas, je travaille habituellement sur mes branches individuelles, puis fusionnent pour devenir maîtres, et les engagements individuels que je fais envers ma section locale ne sont pas si importants que cela.

En raison d'un crochet git qui vérifie le numéro de ticket approprié sur Jira mais était sensible à la casse, j'ai été empêché de pousser mon code. De plus, le commit a été fait il y a longtemps et je ne voulais pas compter le nombre de commits pour revenir sur la base.

Donc, ce que j'ai fait était de créer une nouvelle branche à partir du dernier maître et de supprimer tous les commits de branche problématique en un seul commit sur une nouvelle branche. C'était plus facile pour moi et je pense que c'est une bonne idée de l'avoir ici comme référence future.

Du dernier maître:

git checkout -b new-branch

Ensuite

git checkout new-branch
git merge --squash problem-branch
git commit -m "new message" 

Référence: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch

3
WebDever

Voici un très beau résumé qui couvre tous les cas possibles: https://Gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4

Vue d'ensemble:

git rebase -i HEAD~X
# X is the number of commits to go back
# Move to the line of your commit, change pick into edit,
# then change your commit message:
git commit --amend
# Finish the rebase with:
git rebase --continue
2
Mahmoud Zalt