web-dev-qa-db-fra.com

Validation accidentelle: modifier le message de validation git

Dans mon référentiel local, j'ai un commit avec un message de commit incorrect.

J'ai déjà publié le message de validation incorrect avec git Push.

Maintenant, le dépôt distant (qui est hébergé par GitHub) a également le message de validation incorrect.

J'ai déjà essayé git commit --amend, mais a constaté que cela ne fonctionnera pas pour moi dans cette situation car j'ai effectué des validations supplémentaires depuis la mauvaise.

Comment résoudriez-vous cette situation?

65
jonny

Solution la plus simple (mais veuillez lire toute cette réponse avant de faire cela):

  1. git rebase -i <hash-of-commit-preceding-the-incorrect-one>
  2. Dans l'éditeur qui s'ouvre, remplacez pick par reword sur la ligne pour la validation incorrecte.
  3. Enregistrez le fichier et fermez l'éditeur.
  4. L'éditeur s'ouvrira à nouveau avec le message de validation incorrect. Répare le.
  5. Enregistrez le fichier et fermez l'éditeur.
  6. git Push --force pour mettre à jour GitHub.

Cela signifie que vous publierez une version modifiée d'un référentiel précédemment publié. Si quelqu'un a tiré ou récupéré de votre référentiel entre le moment où vous avez fait l'erreur avec le message de validation incorrect et le moment où vous l'avez corrigé, il rencontrera des difficultés plus tard. Assurez-vous donc que vous pouvez accepter cette conséquence avant d'essayer.

94
Dan Moulding

Plutôt que de suivre l'intégralité de la route de rebase pour un commit:

git reset --soft head~
git commit -m "The message you wanted to use"
git Push -f

Vous pouvez voir les options dans la page de manuel git-reset .

Pour un projet sur lequel vous seul travaillez, l'historique modifié ne devrait pas poser de problème.

34
Abizern

Si vous devez modifier un ancien message de validation sur plusieurs branches (c'est-à-dire que la validation avec le message erroné est présente dans plusieurs branches), vous pouvez utiliser

git filter-branch -f --msg-filter 'sed "s/<old message>/<new message>/g"' -- --all

pour remplacer le message de validation.

Git créera un répertoire temporaire pour la réécriture et sauvegardera également les anciennes références dans refs/original /.

-f imposera l'exécution de l'opération. Ceci est nécessaire si le répertoire temporaire est déjà présent ou s'il y a déjà des références stockées sous refs/original. Si ce n'est pas le cas, vous pouvez supprimer ce drapeau.

-- sépare les options de branche de filtre des options de révision

--all s'assurera que tous les branches et tags sont réécrits.

En raison de la sauvegarde de vos anciennes références, vous pouvez facilement revenir à l'état avant d'exécuter la commande.

Dites, vous voulez récupérer votre master et y accéder dans la branche old_master:

git checkout -b old_master refs/original/refs/heads/master

Une fois que vous êtes satisfait de vos modifications, utilisez git Push -f pour envoyer les modifications à votre référentiel public.

Notez que vous devez en informer vos collaborateurs car tous les hachages des commits commençant par le premier modifié ont été modifiés.

6
sebers

Si vous n'êtes pas poussé le code vers votre branche distante (Github/Bitbucket), vous pouvez modifier le message de validation sur la ligne de commande comme ci-dessous.

 git commit --amend -m "Your new message"

Si vous travaillez sur une branche spécifique, faites-le.

git commit --amend -m "BRANCH-NAME: new message"

Si vous avez déjà poussé le code avec un mauvais message, vous devez être prudent lorsque vous modifiez le message. C'est-à-dire qu'après avoir modifié le message de validation et essayé de le pousser à nouveau, vous vous retrouvez avec des problèmes. Pour le rendre lisse, suivez ces étapes. Veuillez lire l'intégralité de la réponse avant de le faire

git commit --amend -m "BRANCH-NAME : your new message"

git Push -f Origin BRANCH-NAME                # Not a best practice. Read below why?

Remarque importante: Lorsque vous utilisez directement la poussée forcée, vous pourriez vous retrouver avec des problèmes de code que d'autres développeurs travaillent sur la même branche. Donc, pour éviter ces conflits, vous devez extraire le code de votre branche avant de faire force Push

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull Origin BRANCH-NAME
 git Push -f Origin BRANCH-NAME

Il s'agit de la meilleure pratique lors de la modification du message de validation, s'il a déjà été poussé.

2
Prabhakar