web-dev-qa-db-fra.com

Comment modifier les messages de validation existants et non validés?

J'ai écrit la mauvaise chose dans un message de commit.

Comment puis-je changer le message? Le commit n'a pas encore été poussé.

7671
Laurie Young

Modification du dernier message de validation

_git commit --amend
_

ouvrira votre éditeur, vous permettant de modifier le message de validation de la dernière validation. De plus, vous pouvez définir le message de validation directement dans la ligne de commande avec:

_git commit --amend -m "New commit message"
_

… Mais cela peut rendre les messages de validation sur plusieurs lignes ou de petites corrections plus difficiles à saisir.

Assurez-vous de ne pas avoir effectué de changement de copie de travail avant de le faire, sinon ils seront également validés. ( Les modifications non mises en place ne seront pas validées.)

Changer le message d'un commit que vous avez déjà poussé dans votre branche distante

Si vous avez déjà poussé votre commit vers votre branche distante, alors vous devez forcer le push avec:

_git Push <remote> <branch> --force
# Or
git Push <remote> <branch> -f
_

Attention: le fait de forcer écrasera la branche distante par l'état de votre branche locale . S'il y a des commits sur la branche distante que vous n'avez pas dans votre branche locale, vous perdrez ces commits.

Attention: soyez prudent lorsque vous modifiez des commits que vous avez déjà partagés avec d'autres personnes. La modification des commits est essentiellement réécrit . qu’ils aient différents SHA ID, ce qui pose problème si d’autres personnes possèdent des copies de l’ancien commit que vous avez réécrit. Toute personne disposant d'une copie de l'ancien commit devra synchroniser son travail avec votre commit récemment ré-écrit, ce qui peut parfois s'avérer difficile. Veillez donc à vous coordonner avec les autres lorsque vous essayez de réécrire l'historique des validations partagées ou évitez simplement de réécrire les validations partagées. tout à fait.


Utiliser une base interactive

Une autre option consiste à utiliser une base interactive.
Ceci vous permet de modifier tout message que vous souhaitez mettre à jour, même s'il ne s'agit pas du dernier message.

Afin de faire une courge git, procédez comme suit:

_// X is the number of commits to the last commit you want to be able to edit
git rebase -i HEAD~X
_

Une fois que vous avez corrigé vos commits, choisissez le _e/r_ pour modifier le message.

enter image description here

Note importante à propos du rebase interactif

Lorsque vous utilisez le _git rebase -i HEAD~X_, il peut y avoir plus de que X commits. Git "collectera" tous les commits dans le dernier X commissions et s'il y avait une fusion quelque part entre cet intervalle, vous verrez tous les commits de sorte que le résultat sera X +.

Bon conseil:

Si vous devez le faire pour plus d'une branche et que vous risquez d'être confronté à des conflits lors de la modification du contenu, configurez git rerere et laissez git résoudre ces conflits automatiquement pour vous.


Documentation

15489
EfForEffort
git commit --amend -m "your new message"
2465
lfx_cool

Si le commit que vous voulez corriger n’est pas le plus récent:

  1. git rebase --interactive $parent_of_flawed_commit

    Si vous souhaitez corriger plusieurs commits défectueux, transmettez le parent du plus ancien.

  2. Un éditeur apparaîtra, avec une liste de tous les commits depuis celui que vous avez donné.

    1. Remplacez pick par reword (ou sur les anciennes versions de Git, par edit) devant toutes les commits que vous souhaitez corriger.
    2. Une fois que vous avez sauvegardé, Git rejouera les commits listés.

  3. Pour chaque commit que vous voulez reformuler , Git vous renverra dans votre éditeur. Pour chaque commit que vous voulez éditer , Git vous place dans le shell. Si vous êtes dans le shell:

    1. Changez le commit de la manière que vous voulez.
    2. git commit --amend
    3. git rebase --continue

La majeure partie de cette séquence vous sera expliquée par la sortie des différentes commandes au fur et à mesure. C’est très facile, vous n’avez pas besoin de le mémoriser - rappelez-vous simplement que git rebase --interactive vous permet de corriger les commits, peu importe leur ancienneté.


Notez que vous ne voudrez pas modifier les commits que vous avez déjà envoyés. Ou peut-être que vous le faites, mais dans ce cas, vous devrez prendre le plus grand soin de communiquer avec toutes les personnes qui ont pu retirer vos commits et faire le travail par-dessus. Comment puis-je récupérer/resynchroniser après que quelqu'un ait poussé une base ou une réinitialisation sur une branche publiée?

2342

Pour modifier le commit précédent, apportez les modifications souhaitées et mettez-les en scène, puis exécutez

git commit --amend

Cela ouvrira un fichier dans votre éditeur de texte représentant votre nouveau message de validation. Il commence par contenir le texte de votre ancien message de validation. Modifiez le message de validation à votre guise, puis enregistrez le fichier et quittez votre éditeur pour terminer.

Pour modifier le commit précédent et conserver le même message de journal, exécutez

git commit --amend -C HEAD

Pour corriger le commit précédent en le supprimant entièrement, exécutez

git reset --hard HEAD^

Si vous souhaitez modifier plusieurs messages de validation, exécutez

git rebase -i HEAD~commit_count

(Remplacer commit_count avec le nombre de commits que vous souhaitez modifier.) Cette commande lance votre éditeur. Marquez le premier commit (celui que vous voulez changer) comme "edit" au lieu de "pick", puis sauvegardez et quittez votre éditeur. Effectuez les modifications que vous souhaitez valider, puis exécutez

git commit --amend
git rebase --continue

Remarque: vous pouvez également "effectuer les modifications souhaitées" à partir de l'éditeur ouvert par git commit --amend.

766
Fatih

Comme déjà mentionné, git commit --amend est le moyen d'écraser le dernier commit. Une note: si vous voulez aussi écraser les fichiers, la commande serait

git commit -a --amend -m "My new commit message"
393
John

Vous pouvez également utiliser git _filter-branch_ pour cela.

_git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
_

Ce n'est pas aussi simple qu'un _git commit --amend_ trivial, mais c'est particulièrement utile si vous avez déjà des fusions après votre message de validation erroné.

Notez que ceci essaiera de réécrire CHAQUE Commit entre HEAD et le commit imparfait, vous devriez donc choisir votre commande _msg-filter_ très sage ;-)

352
Mark

Je préfère cette façon.

git commit --amend -c <commit ID>

Sinon, il y aura un nouveau commit avec un nouvel ID de commit

313
krevedko

Si vous utilisez l'outil graphique Git, il existe un bouton nommé modifier le dernier commit. Cliquez sur ce bouton pour afficher vos derniers fichiers et messages de validation. Éditez simplement ce message et vous pouvez le commettre avec un nouveau message de validation.

Ou utilisez cette commande depuis une console/un terminal:

git commit -a --amend -m "My new commit message"
310
Akhilraj N S

Vous pouvez utiliser Git rebasing . Par exemple, si vous souhaitez modifier à nouveau pour valider bbc643cd, exécutez

$ git rebase bbc643cd^ --interactive

Dans l'éditeur par défaut, modifiez 'pick' en 'edit' dans la ligne dont vous voulez modifier le commit. Apportez vos modifications puis mettez-les en scène avec

$ git add <filepattern>

Maintenant vous pouvez utiliser

$ git commit --amend

pour modifier le commit, et ensuite

$ git rebase --continue

pour revenir à la tête précédente commit.

283
Shoaib Ud-Din
  1. Si vous souhaitez uniquement modifier votre dernier message de validation, procédez comme suit:

    git commit --amend
    

    Cela vous laissera tomber dans votre texte et vous permettra de changer le dernier message de validation.

  2. Si vous souhaitez modifier les 3 derniers messages de validation ou l'un des messages de validation jusqu'à ce point, fournissez HEAD~3 à la commande git rebase -i:

    git rebase -i HEAD~3
    
276
Heena Hussain

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

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

  • -f appliquera l'exécution de l'opération. Cela est nécessaire si le répertoire temporaire est déjà présent ou s'il existe déjà des références stockées sous refs/original. Si ce n'est pas le cas, vous pouvez supprimer cet indicateur.

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

  • --all s'assurera que tous 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.

Disons que vous voulez récupérer votre maître et y accéder dans la branche old_master:

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

Utilisation

git commit --amend

Pour le comprendre en détail, un excellent post est 4. Réécriture de l'historique Git. Il est également question de quand ne pas utiliser git commit --amend.

224
skin

Modifier

Vous avez deux options ici. Tu peux faire

git commit --amend

tant que c'est votre dernier commit.

Rebase interactive

Sinon, si ce n'est pas votre dernier commit, vous pouvez faire une rebase interactive,

git rebase -i [branched_from] [hash before commit]

Ensuite, dans la base interactive, vous ajoutez simplement edit à ce commit. Quand cela se produit, faites un git commit --amend et modifiez le message de validation. Si vous voulez revenir avant ce point de validation, vous pouvez également utiliser git reflog et simplement supprimer cette validation. Ensuite, il vous suffit de refaire un git commit.

195
wallerjake

Si vous utilisez l'interface graphique de Git, vous pouvez modifier le dernier commit qui n'a pas été forcé avec:

Commit/Amend Last Commit
183
gulchrider

Si c'est votre dernier commit, il suffit de modifier le commit:

git commit --amend -o -m "New commit message"

(à l'aide de l'indicateur -o (--only) pour vous assurer de ne modifier que le message de validation)


S'il s'agit d'un commit enfoui, utilisez la redistribution interactive impressionnante :

git rebase -i @~9   # Show the last 9 commits in a text editor

Recherchez le commit souhaité, remplacez pick par r (reword), puis enregistrez et fermez le fichier. Terminé!



Didacticiel vim miniature (ou comment rebaser avec seulement 8 frappes de touche 3jcwrEscZZ):

  • Exécutez vimtutor si vous avez le temps
  • hjkl correspondent aux touches de mouvement 
  • Toutes les commandes peuvent être préfixées avec une "plage", par exemple. 3j se déplace vers le bas de 3 lignes
  • i pour entrer en mode insertion - le texte que vous tapez apparaîtra dans le fichier
  • Esc ou Ctrlc pour quitter le mode insertion et revenir au mode "normal"
  • u défaire
  • Ctrlr refaire
  • dddwdl pour supprimer une ligne, Word ou une lettre, respectivement
  • cccwcl pour changer une ligne, Word ou une lettre, respectivement (identique à ddi)
  • yyywyl copier ("yank") une ligne, Word ou une lettre, respectivement
  • p ou P coller après ou avant la position actuelle, respectivement
  • :wEnter enregistrer (écrire) un fichier
  • :q!Enter quitter sans sauvegarder
  • :wqEnter ou ZZ pour sauver et quitter

Si vous modifiez beaucoup le texte, passez à la disposition du clavier Dvorak, apprenez à saisir au clavier et apprenez vim. Cela en vaut-il la peine? Oui.



ProTip ™: N'ayez pas peur d'expérimenter avec des commandes "dangereuses" qui réécrivent l'historique * - Git ne supprime pas vos validations pendant 90 jours par défaut; vous pouvez les trouver dans le reflog:

$ git reset @~3   # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* Méfiez-vous des options telles que --hard et --force bien qu'elles puissent supprimer les données.
* De plus, ne réécrivez pas l'historique des branches sur lesquelles vous collaborez.

175
Zaz

J'utilise le Git GUI autant que je peux, et cela vous donne la possibilité de modifier le dernier commit:

Tick that box

De plus, git rebase -i Origin/masterest un beau mantra qui vous présentera toujours les commits que vous avez effectués sur le maître et vous donnera la possibilité de modifier, supprimer, réorganiser ou écraser. Pas besoin de mettre la main sur ce hash en premier.

165
Havard Graff

Wow, il y a donc beaucoup de façons de le faire.

Une autre méthode consiste à supprimer le dernier commit, tout en conservant ses modifications pour ne pas perdre votre travail. Vous pouvez ensuite faire un autre commit avec le message corrigé. Cela ressemblerait à ceci:

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

Je fais toujours cela si j'oublie d'ajouter un fichier ou de faire une modification.

Rappelez-vous pour spécifier --soft à la place de --hard, sinon vous perdez entièrement ce commit.

135
Radu Murzea

Pour ceux qui recherchent une interface graphique Windows/Mac pour aider à la modification de messages plus anciens (pas seulement le dernier message), je recommanderais SourceTree . Les étapes à suivre sont ci-dessous.

SourceTree interactive rebase

Pour les commits qui n'ont pas encore été poussés vers une télécommande:

  1. Assurez-vous que vous avez validé ou mis en cache toutes les modifications en cours (c’est-à-dire qu’aucun fichier n’est répertorié dans l’onglet "Statut du fichier") - cela ne fonctionnera pas.
  2. Dans l'onglet "Journal/Historique", faites un clic droit sur l'entrée avec une ligne adjacente dans le graphique en dessous du ou des commit (s) que vous souhaitez éditer. et sélectionnez "Rebaser les enfants de <ref commit> de manière interactive ..."
  3. Sélectionnez la ligne entière du message de validation que vous souhaitez modifier (, c.-à-d. Cliquez sur la colonne "Message" ).
  4. Cliquez sur le bouton "Modifier le message".
  5. Modifiez le message comme vous le souhaitez dans la boîte de dialogue qui s’affiche, puis cliquez sur OK.
  6. Répétez les étapes 3 et 4 si d'autres messages de validation doivent être modifiés.
  7. Cliquez sur OK: le changement de base commence. Si tout va bien, le résultat se termine par "Terminé avec succès". REMARQUE: Je l'ai récemment vu échouer avec Unable to create 'project_path/.git/index.lock': File exists. lorsque vous essayez de modifier plusieurs messages de validation en même temps. Vous ne savez pas exactement quel est le problème, ni s'il sera résolu dans une future version de SourceTree, mais si cela se produit, il est recommandé de les changer de base une à la fois (plus lentement, mais semble plus fiable).

... Ou ... pour les commits qui ont déjà été poussés:

Suivez les étapes décrites dans cette réponse , qui sont similaires à celles décrites ci-dessus, mais nécessitent l'exécution d'une commande supplémentaire à partir de la ligne de commande pour forcer le transfert de la branche. Lisez-la tout et appliquez la prudence nécessaire!

128
Steve Chambers

Si vous voulez juste éditer la dernière utilisation de commit:

git commit --amend

ou

git commit --amend -m 'one line message'

Mais si vous voulez éditer plusieurs commits à la suite, vous devriez utiliser le rebasage:

git rebase -i <hash of one commit before the wrong commit>

git rebase editing

Dans un fichier comme celui ci-dessus, écrivez dans Edit/e ou dans l’une des autres options, puis cliquez sur Enregistrer et quitter.

Maintenant, vous serez au premier faux commit. Apportez des modifications aux fichiers et ils seront automatiquement mis en scène pour vous. Type

git commit --amend

enregistrer et quitter et tapez

git rebase --continue 

pour passer à la sélection suivante jusqu'à la fin de toutes vos sélections.

Notez que ces choses changent tous vos hachages SHA après ce commit particulier.

124
Shubham Chaudhary

Si vous souhaitez uniquement modifier votre dernier message, vous devez utiliser l'indicateur --only ou son raccourci -o avec commit --amend:

git commit --amend -o -m "New commit message"

Cela garantit que vous n'améliorerez pas accidentellement votre commit avec des éléments mis en scène. Bien sûr, il est préférable d’avoir une bonne configuration $EDITOR. Ensuite, vous pouvez laisser l’option -m désactivée, et git pré-remplira le message de validation avec l’ancien. De cette façon, il peut être facilement édité.

123
David Ongaro

Mettez à jour votre dernier message de validation erroné avec le nouveau message de validation dans une ligne:

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

Ou essayez git reset comme ci-dessous:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# it will reset you last commit. Now, you
# can re-commit it with new commit message.

Utilisation de reset pour diviser les commits en commits plus petits

git reset peut vous aider à diviser un commit en plusieurs commits:

# reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (you can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# add and commit your files seperately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

Ici, vous avez réussi à diviser votre dernier commit en deux commits.

99
przbadu

Il y a beaucoup de réponses à cette question, mais aucune d’entre elles n’explique en détail comment modifier les anciens messages de commit à l’aide de VIM. J'étais coincé à essayer de le faire moi-même, alors je vais écrire ici en détail comment je l'ai fait, en particulier pour les personnes qui n'ont aucune expérience de VIM!

Je voulais changer mes cinq derniers commits que j'avais déjà envoyés au serveur. C'est assez dangereux car si quelqu'un d'autre en a déjà tiré un coup, vous pouvez tout gâcher en changeant les messages de commit. Cependant, lorsque vous travaillez sur votre propre petite branche et que vous êtes certain que personne ne l’a tiré, vous pouvez le changer comme suit:

Supposons que vous souhaitiez modifier vos cinq derniers commits, puis tapez ceci dans le terminal:

git rebase -i HEAD~5 * Où 5 est le nombre de messages de validation que vous souhaitez modifier. (donc si vous voulez changer le 10ème avant le dernier commit, vous tapez 10)

Cette commande vous fera entrer dans VIM où vous pourrez "éditer" votre historique de commit. Vous verrez vos 5 derniers commits au sommet comme ceci:

pick <commit hash> commit message

Au lieu de pick, vous devez écrire reword. Vous pouvez le faire dans VIM en tapant i, ce qui vous fait passer en mode INSERT. (Vous voyez que vous êtes en mode insertion avec le mot INSERT en bas) Pour les commits que vous souhaitez modifier, saisissez-le dans reword au lieu de pick

Ensuite, vous devez enregistrer et quitter cet écran. Pour ce faire, vous devez d'abord passer en "mode de commande" en appuyant sur le bouton échap. (vous pouvez vérifier que vous êtes en mode commande si le mot INSERT en bas a disparu) Vous pouvez ensuite taper une commande en tapant :, la commande pour enregistrer et quitter est wq. Donc, si vous tapez :wq vous êtes sur la bonne voie.

Ensuite, VIM passera en revue chaque message de validation que vous souhaitez reformuler. Vous pouvez ici modifier les messages de validation. Pour ce faire, vous passez en mode INSERT, changez le message de validation, passez en mode commande, puis enregistrez et quittez. Faites cela 5 fois et vous êtes sorti de VIM!

Ensuite, si vous avez déjà envoyé vos mauvais commits, vous devez git Push --force pour les écraser. Rappelez-vous que git Push --force est une chose assez dangereuse à faire, alors assurez-vous que personne n'a quitté le serveur depuis que vous avez envoyé vos erreurs de validation!

Maintenant, vous avez changé vos messages de commit!

(Comme vous le voyez, je ne connais pas très bien le VIM et si j'utilisais le mauvais jargon pour expliquer ce qui se passait, n'hésitez pas à me corriger!)

82
Marijn

Vous pouvez utiliser git-rebase-reword

Il est conçu pour éditer n'importe quel commit (pas seulement le dernier) de la même manière que commit --amend

$ git rebase-reword <commit-or-refname>

Il est nommé d'après l'action sur rebase interactive pour modifier un commit: "reword". Voir ce post et man -section interactive mode-

Exemples:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^
76
albfan

J'ai ajouté l'alias de reci, recm pour recommit (amend), je peux maintenant le faire avec git recm ou git recm -m.

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
76
Chu-Siang Lai

J'ai réalisé que j'avais poussé un commit avec une faute de frappe. Pour annuler, j'ai fait ce qui suit:

git commit --amend -m "T-1000, advanced prototype"
git Push --force

Attention: forcer vos modifications écrasera la branche distante par votre branche locale. Assurez-vous de ne pas écraser quoi que ce soit que vous souhaitez conserver. Faites également attention à ne pas forcer un commit modifié (réécrit) si quelqu'un d'autre partage la branche avec vous, car il devra réécrire son propre historique s'il dispose de l'ancienne copie du commit que vous venez de réécrire.

54
neoneye

J'aime utiliser les éléments suivants:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <Origin master>
  5. git Push <Origin master>
49
Kedar Adhikari

Si vous n'avez pas transmis le code à 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, procédez comme suit:

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

Si vous avez déjà envoyé le code avec le mauvais message et que vous devez faire attention lorsque vous modifiez le message. En d’autres termes, lorsque vous modifiez le message de validation et essayez à nouveau de le repousser, vous rencontrez des problèmes. Pour le rendre lisse, suivez ces étapes.

S'il vous plaît lire toute ma 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 Force Push, vous risquez de rencontrer 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 forcer la force Push :

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

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

43
Prabhakar