J'ai écrit la mauvaise chose dans un message de validation.
Comment puis-je changer le message? Le commit n'a pas encore été poussé.
git
git-commit
git-rewrite-history
amend
Laurie Young
la source
la source
Réponses:
Modification du message de validation le plus récent
ouvrira votre éditeur, vous permettant de modifier le message de validation du commit le plus récent. De plus, vous pouvez définir le message de validation directement dans la ligne de commande avec:
… Cependant, cela peut rendre les messages de validation sur plusieurs lignes ou les petites corrections plus difficiles à saisir.
Assurez - vous que vous ne disposez pas des modifications de la copie de travail mis en scène avant de le faire ou ils seront engagés aussi. ( Les modifications non planifiées ne seront pas validées.)
Modification du message d'un commit que vous avez déjà transmis à votre branche distante
Si vous avez déjà poussé votre commit vers votre branche distante, alors - après avoir modifié votre commit localement (comme décrit ci-dessus) - vous devrez également forcer le push avec:
Avertissement: la poussée forcée écrasera la branche distante avec l'état de votre branche locale . S'il y a des commits sur la branche à distance que vous n'avez pas dans votre branche locale, vous allez perdre ces commits.
Avertissement: soyez prudent lorsque vous modifiez des commits que vous avez déjà partagés avec d'autres personnes. La modification des validations les réécrit essentiellement pour avoir des ID SHA différents , ce qui pose un problème si d'autres personnes ont des copies de l'ancienne validation que vous avez réécrite. Quiconque possède une copie de l'ancien commit devra synchroniser son travail avec votre commit nouvellement réécrit, ce qui peut parfois être difficile, alors assurez-vous de vous coordonner avec les autres lorsque vous essayez de réécrire l'historique des commit partagés, ou évitez simplement de réécrire les commits partagés tout à fait.
Effectuer un rebase interactif
Une autre option consiste à utiliser un rebase interactif. Cela 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 un squash Git, procédez comme suit:
Une fois que vous écrasez vos commits - choisissez le
e/r
pour éditer le message:Remarque importante sur le rebasage interactif
Lorsque vous utilisez,
git rebase -i HEAD~n
il peut y avoir plus de n validations. Git "collectera" toutes les validations dans les n dernières validations, et s'il y avait une fusion quelque part entre cette plage, vous verrez également toutes les validations, donc le résultat sera n +.Bon conseil:
Si vous devez le faire pour plus d'une seule branche et que vous pouvez rencontrer des conflits lors de la modification du contenu, configurez
git rerere
et laissez Git résoudre ces conflits automatiquement pour vous.Documentation
Page de manuel de git-commit (1)
Page de manuel de git-rebase (1)
Page de manuel de git-push (1)
la source
git commit --amend
n'est pas aussi puissant quegit rebase -i
.git commit --amend
peut réparer le maître (un?) Commettre.git push -f origin branchname
git push -f
un peu dangereux si d'autres personnes utilisent le même référentiel?git commit --amend -c HEAD
. Cela ouvrira l'éditeur pré-rempli avec votre ancien message de validation, vous pourrez donc le modifier.la source
Si le commit que vous souhaitez corriger n'est pas le plus récent:
git rebase --interactive $parent_of_flawed_commit
Si vous souhaitez corriger plusieurs validations défectueuses, passez le parent du plus ancien d'entre eux.
Un éditeur apparaîtra, avec une liste de tous les commits depuis celui que vous avez donné.
pick
àreword
(ou sur les anciennes versions de Git, àedit
) devant tous les commits que vous souhaitez corriger.Pour chaque commit que vous souhaitez reformuler , Git vous renverra dans votre éditeur. Pour chaque commit que vous souhaitez modifier , Git vous dépose dans le shell. Si vous êtes dans le shell:
git commit --amend
git rebase --continue
La plupart 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 cela
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à poussés. Ou peut-être que vous le faites, mais dans ce cas, vous devrez prendre grand soin de communiquer avec tous ceux qui peuvent avoir tiré vos engagements et effectué un travail par-dessus eux. Comment récupérer / resynchroniser après que quelqu'un a poussé un rebase ou une réinitialisation dans une branche publiée?
la source
reword
à la place depick
pour modifier le message du journal.$parent_of_flawed_commit
est équivalent à$flawed_commit^
.-p
(--preserve-merges
) s'il y a eu une fusion après la validation défectueuse.Pour modifier le commit précédent, effectuez les modifications souhaitées et effectuez ces modifications, puis exécutez
Cela ouvrira un fichier dans votre éditeur de texte représentant votre nouveau message de validation. Il commence avec le texte de votre ancien message de validation. Modifiez le message de validation comme vous le souhaitez, 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
Pour corriger le commit précédent en le supprimant entièrement, exécutez
Si vous souhaitez modifier plusieurs messages de validation, exécutez
(Remplacez commit_count par le nombre de validations 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 enregistrez et quittez votre éditeur. Apportez la modification que vous souhaitez valider, puis exécutez
Remarque: Vous pouvez également "Apporter la modification souhaitée" à partir de l'éditeur ouvert par
git commit --amend
la source
git rebase -i HEAD~commit_count
vous permettra également de modifier les messages de validation du nombre de validations que vous choisissez. Il suffit de marquer les commits choisis comme "reformuler" au lieu de "choisir".git reset --hard
annule les modifications non validées. Veuillez remplacer--hard
par--soft
.git reset --hard
est une commande parfaitement légitime, mais elle est trompeuse compte tenu de la question. Vous utilisez--hard
si vous avez validé les modifications que vous souhaitez supprimer, pas si vous avez fait une faute de frappe dans le message de validation!Comme déjà mentionné,
git commit --amend
est le moyen d'écraser le dernier commit. Une remarque: si vous souhaitez également écraser les fichiers , la commande seraitla source
git add file.ext
alors justegit commit --amend
Vous pouvez également l'utiliser
git filter-branch
pour cela.Ce n'est pas aussi facile qu'un trivial
git commit --amend
, mais c'est particulièrement utile, si vous avez déjà quelques fusions après votre message de validation erroné.Notez que cela va essayer de réécrire chaque commit entre
HEAD
et le commit défectueux, vous devez donc choisir votremsg-filter
commande très judicieusement ;-)la source
$flawed_commit^..HEAD
, non$flawed_commit..HEAD
. comme indiqué par la page de manuel: « La commande ne réécrira que les références positives mentionnées dans la ligne de commande (par exemple si vous passez a..b, seul b sera réécrit). »Je préfère cette façon:
Sinon, il y aura une nouvelle validation avec un nouvel ID de validation.
la source
-c
fait quelques choses. Il utilise l'ancien message par défaut, mais il copie également les informations sur la paternité (personne et heure).-C
fait la même chose sauf qu'il ne vous demande pas de modifier le message.fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Si vous utilisez l'outil Git GUI, il existe un bouton nommé Modifier le dernier commit . Cliquez sur ce bouton, puis il affichera vos derniers fichiers de validation et message. Modifiez simplement ce message et vous pouvez le valider avec un nouveau message de validation.
Ou utilisez cette commande depuis une console / un terminal:
la source
Vous pouvez utiliser le rebasage Git . Par exemple, si vous souhaitez modifier à nouveau pour valider bbc643cd, exécutez
Dans l'éditeur par défaut, modifiez «choisir» pour «modifier» dans la ligne dont vous souhaitez modifier la validation. Apportez vos modifications, puis mettez-les en scène avec
Vous pouvez maintenant utiliser
pour modifier le commit, et après cela
pour revenir au commit de tête précédent.
la source
git commit --amend
pris effet, vous pouvez l'utilisergit show
et il affichera le nouveau message.Si vous souhaitez uniquement modifier votre dernier message de validation, procédez comme suit:
Cela vous déposera dans votre éditeur de texte et vous permettra de modifier le dernier message de validation.
Si vous souhaitez modifier les trois derniers messages de validation, ou l'un des messages de validation jusqu'à ce point, fournissez
HEAD~3
à lagit rebase -i
commande:la source
git commit --amend
, et il dit aussi que vous pouvez utilisergit rebase -i HEAD~commit_count
, tout ce que vous avez été prise en3
pourcommit_count
.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 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. Cela 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 sousrefs/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 toutes les branches et balises sont réécrites.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 maître et y accéder en succursale
old_master
:la source
git commit --amend
pour corriger des commentaires ou ajouter des fichiers que j'ai oublié àgit add
, mais jamais avant que jegit push
n'Éd. J'utilise égalementgit filter-branch
quand je veux totalement gâcher l'historique des versions, mais l'OP ne le veut pas, donc cette réponse a besoin d'un gros avertissement de santé - n'essayez pas cela à la maison, peeps !!Utilisation
Pour le comprendre en détail, un excellent article est 4. Rewriting Git History . Il indique également quand ne pas l'utiliser
git commit --amend
.la source
git commit --amend
réponse avait déjà été donnée (plusieurs fois) avant que vous écriviez la vôtre. Pourquoi l'avez-vous posté à nouveau? Si vous vouliez ajouter un lien vers "Rewriting Git History", vous auriez pu modifier l'une des réponses existantes ou laisser un commentaire.Modifier
Vous avez quelques options ici. Tu peux faire
tant que c'est votre dernier commit.
Rebase interactive
Sinon, si ce n'est pas votre dernier commit, vous pouvez faire un rebase interactif,
Ensuite, à l'intérieur du rebase interactif, vous ajoutez simplement la modification à ce commit. Quand il apparaît, faites un
git commit --amend
et modifiez le message de validation. Si vous souhaitez annuler avant ce point de validation, vous pouvez également utilisergit reflog
et simplement supprimer cette validation. Ensuite, vous faites àgit commit
nouveau.la source
Si c'est votre dernier commit, modifiez simplement le commit:
(Utilisation de l' indicateur
-o
(--only
) pour vous assurer de ne modifier que le message de validation)S'il s'agit d'un commit enterré, utilisez la redéfinition interactive impressionnante :
Recherchez le commit que vous souhaitez, passez
pick
àr
(reword
), puis enregistrez et fermez le fichier. Terminé!Tutoriel Miniature Vim (ou comment rebaser avec seulement 8 touches
3j
cw
r
EscZZ
):vimtutor
si vous avez le tempsh
j
k
l
correspondent aux touches de mouvement ←↓↑→3j
descend de trois 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
Supprimer une ligne, un mot ou une lettre, respectivementcc
,cw
,cl
, Respectivement changer une ligne, un mot ou lettre (commedd
i
)yy
,yw
,yl
Copier ( « Yank ») une ligne, un mot ou une lettre, respectivementp
ouP
pour coller respectivement après ou avant la position actuelle:w
Enter enregistrer (écrire) un fichier:q!
Enter quitter sans enregistrer:wq
EnterouZZ
pour enregistrer et quitterSi vous modifiez beaucoup de texte, passez à la disposition du clavier Dvorak , apprenez à taper 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:
* Méfiez-vous des options comme
--hard
et--force
bien - ils peuvent éliminer les données. * De plus, ne réécrivez pas l'historique sur les branches sur lesquelles vous collaborez.la source
nano
? Nous parlons de modifications insignifiantes qui doivent être apportées à un fichier texte, pas de codage hardcore qui générerait une guerre de flamme sur le "meilleur" éditeur de texte.ddjjpZZ
déplace un commit 2 vers le bas. La connaissance de base de Vim n'a rien d'arcane; il faut 10 minutes pour devenir plus à l'aise avec Vim qu'avec nano.Si vous utilisez l'interface graphique Git, vous pouvez modifier le dernier commit qui n'a pas été poussé avec:
la source
J'utilise autant que possible l' interface graphique de Git , et cela vous donne la possibilité de modifier le dernier commit:
En outre,
git rebase -i origin/master
c'est un joli mantra qui vous présentera toujours les commits que vous avez effectués sur Master, et vous donnera la possibilité de modifier, supprimer, réorganiser ou écraser. Pas besoin de mettre la main sur ce hachage en premier.la source
Wow, il y a donc beaucoup de façons de le faire.
Une autre façon de procéder consiste à supprimer le dernier commit, mais à conserver ses modifications afin de ne pas perdre votre travail. Vous pouvez ensuite faire un autre commit avec le message corrigé. Cela ressemblerait à quelque chose comme ceci:
Je fais toujours cela si j'oublie d'ajouter un fichier ou de faire un changement.
N'oubliez pas de spécifier
--soft
au lieu de--hard
, sinon vous perdez entièrement ce commit.la source
git commit --amend
sauf qu'il s'agit d'un processus en 2 étapes.--amend
conservera les informations sur l'auteur, mais la question ne demande que de modifier le message.Pour tous ceux qui recherchent une interface graphique Windows / Mac pour aider à modifier les messages plus anciens (c'est-à-dire pas seulement le dernier message), je recommanderais Sourcetree . Les étapes à suivre sont ci-dessous.
Pour les validations qui n'ont pas encore été transmises à une télécommande:
Unable to create 'project_path/.git/index.lock': File exists.
lors de la tentative de modification de plusieurs messages de validation en même temps. Je ne sais pas exactement quel est le problème, ni s'il sera résolu dans une future version de Sourcetree, mais si cela se produit, je recommanderais de les rebaser un par un (plus lent mais semble plus fiable).... Ou ... pour les commits qui ont déjà été poussés:
Suivez les étapes de cette réponse , qui sont similaires à celles ci-dessus, mais nécessitent qu'une autre commande soit exécutée à partir de la ligne de commande (
git push origin <branch> -f
) pour forcer le branchement. Je recommanderais de tout lire et d'appliquer la prudence nécessaire!la source
Si vous souhaitez simplement modifier le dernier commit, utilisez:
ou
Mais si vous souhaitez modifier plusieurs validations d'affilée, vous devriez plutôt utiliser le rebasage:
Dans un fichier, comme celui ci-dessus, écrivez
edit/e
ou l'une des autres options, puis appuyez sur Enregistrer et quitter.Vous serez maintenant au premier mauvais commit. Apportez des modifications dans les fichiers et ils seront automatiquement mis en scène pour vous. Type
Enregistrez et quittez cela et tapez
pour passer à la sélection suivante jusqu'à ce que vous ayez terminé toutes vos sélections.
Notez que ces choses changent tous vos hachages SHA après ce commit particulier.
la source
Si vous souhaitez uniquement modifier votre dernier message, vous devez utiliser l'
--only
indicateur ou son raccourci-o
aveccommit --amend
:Cela garantit que vous n'améliorez pas accidentellement votre validation avec des éléments mis en scène. Bien sûr, il est préférable d'avoir une
$EDITOR
configuration appropriée . Ensuite, vous pouvez laisser l'-m
option désactivée, et Git pré-remplira le message de validation avec l'ancien. De cette façon, il peut être facilement édité.la source
git commit --amend
. La question était très précise, donc plus longue! = Mieux. La mention décisive du-o
drapeau serait probablement enfouie dans le reste des informations. Je ne suis pas non plus à l'aise de modifier une réponse qui a déjà tant de votes.--only
option avec--amend
est disponible depuis git 1.3.0, elle ne fonctionnait pas correctement jusqu'à ce qu'elle soit corrigée dans 1.7.11.3 ( ea2d4ed35902ce15959965ab86d80527731a177c ). Ainsi , le dos de bonne réponse en 2008 aurait probablement été quelque chose comme:git stash; git commit --amend; git stash pop
.Mettez à jour votre dernier message de validation incorrect avec le nouveau message de validation sur une seule ligne:
Ou essayez Git reset comme ci-dessous:
Utilisation de la réinitialisation pour diviser les commits en petits commits
git reset
peut également vous aider à diviser un commit en plusieurs commit:Ici, vous avez réussi à diviser votre dernier commit en deux commits.
la source
git commit --amend
, exactement comme il est dit dans la réponse la plus votée . En outre,git reset --soft HEAD^
fonctionne de manière identique à la réinitialisation logicielle dans cette réponse précédente , car ils sont tous les deux réinitialisés au premier commit parent.git reset
la solution juste pour donner une idée de diviser un message de validation en plusieurs messages de validation. Parce que, j'ai rencontré ce problème quand, je commençais à utilisergit
. Parfois, cela peut être très utile. :)Sur cette question, il existe de nombreuses réponses, mais aucune d'entre elles n'explique en détail comment modifier les anciens messages de validation à l'aide de Vim . J'étais coincé à essayer de le faire moi-même, alors ici, je vais écrire en détail comment j'ai fait cela, en particulier pour les personnes qui n'ont aucune expérience à Vim!
Je voulais modifier mes cinq derniers commits que j'ai déjà envoyés au serveur. C'est assez «dangereux» car si quelqu'un d'autre s'en est déjà tiré, vous pouvez gâcher les choses en modifiant les messages de validation. Cependant, lorsque vous travaillez sur votre propre petite branche et que vous êtes sûr que personne ne l'a tirée, vous pouvez la changer comme ceci:
Imaginons que vous souhaitiez modifier vos cinq derniers commits, puis saisissez ceci dans le terminal:
* Où 5 est le nombre de messages de commit que vous voulez changer (donc si vous voulez changer le 10ème au dernier commit, vous tapez 10).
Cette commande vous amènera dans Vim où vous pourrez «modifier» votre historique de commit. Vous verrez vos cinq derniers commits en haut comme ceci:
Au lieu de
pick
vous devez écrirereword
. Vous pouvez le faire dans Vim en tapanti
. Cela vous fait passer en mode insertion . (Vous voyez que vous êtes en mode d'insertion par le mot INSERT en bas.) Pour les commits que vous souhaitez modifier, tapez à lareword
place depick
.Ensuite, vous devez enregistrer et quitter cet écran. Pour ce faire, Escpassez d'abord en «mode commande» en appuyant sur le bouton (vous pouvez vérifier que vous êtes en mode commande si le mot INSERT en bas a disparu). Ensuite, vous pouvez taper une commande en tapant
:
. La commande pour enregistrer et quitter estwq
. Donc, si vous tapez,:wq
vous êtes sur la bonne voie.Ensuite, Vim examinera chaque message de validation que vous souhaitez reformuler, et ici vous pouvez réellement modifier les messages de validation. Pour ce faire, passez en mode insertion, modifiez le message de validation, passez en mode commande, puis enregistrez et quittez. Faites-le cinq fois et vous êtes hors de Vim!
Ensuite, si vous avez déjà poussé vos mauvais commits, vous devez les
git push --force
écraser. N'oubliez pas quegit push --force
c'est une chose assez dangereuse à faire, alors assurez-vous que personne ne s'est retiré du serveur puisque vous avez poussé vos mauvais commits!Vous avez maintenant changé vos messages de validation!
(Comme vous le voyez, je ne suis pas très expérimenté à Vim, donc si j'ai utilisé le mauvais 'jargon' pour expliquer ce qui se passe, n'hésitez pas à me corriger!)
la source
<nitpick>
Il n'y a pas de "threads" sur Stack Overflow, car ce n'est pas un forum de discussion, il n'y a que des "questions", des "réponses" et des "publications".</nitpick>
. De plus, toutes les versions de Vim ne sont pas identiques, toutes ne vous permettront pas de supprimer des caractères en mode d'insertion (cela a du sens en quelque sorte, non?). Si vous voulez toujours pouvoir supprimer des caractères dans Vim,X
etx
que vous ferez cela (les petitsx
supprime les caractères devant le curseur,X
seront supprimés derrière). Si vous faites des erreurs, vous pouvez utiliser àu
plusieurs reprises pour annuler. Enfin,r
est un raccourci pourreword
dans l'éditeur de rebase interactif.cw
tapé à son début (bien que la question ne concerne pas vim, je suis d'accord).nano
ou mcedit de Midnight Commander.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
Il est nommé d'après l'action sur rebase interactive pour modifier un commit: "reword". Voir cet article et man -section mode interactif-
Exemples:
la source
g c; g rb -i @~9
(commit et rebase), déplacer le nouveau commit là où je le veux, changercommit
enf
(fixup
) et sauvegarder. Si vous vouliez quelque chose de plus rapide que cela, vous pourriez aliasgit commit --fixup=<commit>; git rebase -i --autosquash <commit>^
J'ai ajouté les alias
reci
etrecm
pourrecommit (amend)
cela. Maintenant je peux le faire avecgit recm
ougit recm -m
:la source
J'ai réalisé que j'avais poussé un commit avec une faute de frappe dedans. Pour annuler, j'ai fait ce qui suit:
Avertissement: pousser de force vos modifications écrasera la branche distante avec votre branche locale. Assurez-vous que vous n'écraserez pas tout ce que vous souhaitez conserver. Soyez également prudent lorsque vous forcez à pousser un commit modifié (réécrit) si quelqu'un d'autre partage la branche avec vous, car il devra réécrire sa propre histoire s'il a l'ancienne copie du commit que vous venez de réécrire.
la source
J'aime utiliser ce qui suit:
git status
git add --all
git commit -am "message goes here about the change"
git pull <origin master>
git push <origin master>
la source
Si vous n'avez 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.
Si vous travaillez sur une branche spécifique, procédez comme suit:
Si vous avez déjà poussé le code avec le mauvais message et que vous devez être prudent lorsque vous modifiez le message. Autrement dit, 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 ma réponse avant de le faire.
Remarque importante: lorsque vous utilisez directement la poussée forcée, vous pouvez 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 le push de force :
Il s'agit de la meilleure pratique lors de la modification du message de validation, s'il a déjà été poussé.
la source