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é.
_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.)
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.
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.
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 +.
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.
git commit --amend -m "your new message"
Si le commit que vous voulez corriger n’est pas le plus récent:
git rebase --interactive $parent_of_flawed_commit
Si vous souhaitez corriger plusieurs commits défectueux, transmettez le parent du plus ancien.
Un éditeur apparaîtra, avec une liste de tous les commits depuis celui que vous avez donné.
pick
par reword
(ou sur les anciennes versions de Git, par edit
) devant toutes les commits que vous souhaitez corriger.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:
git commit --amend
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?
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
.
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"
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 ;-)
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
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"
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.
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.
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
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
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
.
Vous avez deux options ici. Tu peux faire
git commit --amend
tant que c'est votre dernier commit.
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
.
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
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 3j
cw
r
EscZZ
):
vimtutor
si vous avez le tempsh
j
k
l
correspondent aux touches de mouvement ←↓↑→3j
se déplace vers le bas de 3 lignesi
pour entrer en mode insertion - le texte que vous tapez apparaîtra dans le fichierc
pour quitter le mode insertion et revenir au mode "normal"u
défairer
refairedd
, dw
, dl
pour supprimer une ligne, Word ou une lettre, respectivementcc
, cw
, cl
pour changer une ligne, Word ou une lettre, respectivement (identique à dd
i
)yy
, yw
, yl
copier ("yank") une ligne, Word ou une lettre, respectivementp
ou P
coller après ou avant la position actuelle, respectivement:w
Enter enregistrer (écrire) un fichier:q!
Enter quitter sans sauvegarder:wq
Enter ou ZZ
pour sauver et quitterSi 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.
J'utilise le Git GUI autant que je peux, et cela vous donne la possibilité de modifier le dernier commit:
De plus, git rebase -i Origin/master
est 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.
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.
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.
Pour les commits qui n'ont pas encore été poussés vers une télécommande:
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!
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>
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.
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é.
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.
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.
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!)
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^
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
......
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.
J'aime utiliser les éléments suivants:
git status
git add --all
git commit -am "message goes here about the change"
git pull <Origin master>
git Push <Origin master>
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é.