Git: Comment réutiliser / conserver les messages de validation après 'git reset'?

104

En tant qu'utilisateur Git, je rencontre régulièrement la situation, que j'ai besoin de retravailler un ou plusieurs commits d'une manière qui ne rentre pas dans --amendou rebase -iavec des commits de correction. En général, je ferais quelque chose comme

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Je prends au sérieux les messages de commit composés et sensés. Ils contiennent généralement un texte plus grand avec des références et des justifications pour le changement. Jusqu'à présent, je suis tout à fait ennuyé le long processus pour récupérer mon ancien commettras message via un unsorted git reflog, git loget copier et coller processus.

Y a-t-il mieux pour s'attaquer à cela? Et comment serait-il, si mon comprend plus d'un commit?

Edit: Après avoir réfléchi un peu à cela, je pense que ce que je recherche, c'est une fonctionnalité de type git stash pour les messages de commit où la correction / modification des commits n'est pas appropriée.

bentolor
la source
2
Si tout ce que vous faisiez était git reset head~1, votre ancien message de validation ne serait-il pas simplement la deuxième entrée du reflog?
Oui - mais comment pourrais-je réutiliser le message sans copier-coller (ce qui nécessite généralement une suppression manuelle)
bentolor
De nos jours, il suffit d' gitkouvrir. De cette façon, vous n'aurez même pas à utiliser le reflog. Sinon, utilisez rev-parse <branch>pour obtenir votre hachage avant la réinitialisation et utilisez la réponse d'ibizaman.
cst1992

Réponses:

144

Après un git reset, ce one-liner peut le faire:

git commit --reuse-message=HEAD@{1}

ou même plus court:

git commit -C HEAD@{1}

Vous pouvez utiliser les autres options proposées par @ user2718704 .

ibizaman
la source
6
Plus court:git commit -C@@{1}
Phu Ngo
2
Ceci est une utilisation fantastique du reflog
David Mann
22
Après une réinitialisation, ORIG_HEAD est défini. Je trouve que git commit --reuse-message=ORIG_HEADc'est le plus clair.
Scott Jacobsen
45

Lors de l'exécution de la commande "git commit", vous devez vérifier les options suivantes,

Réutilliser,

--reuse-message=<commit>

Pour modifier lors de la réutilisation,

--reedit-message=<commit>

Pour changer d'auteur,

--reset-author
user2718704
la source
1
Marqué ceci comme la nouvelle solution, car cela a fourni la réponse la plus complète. Bien que cette solution ne résout toujours pas complètement mes problèmes de «récupération».
bentolor
9

Pourquoi réinitialiser si vous pouvez pirater, réparer, pirater puis simplement exécuter git commit --amend --no-edit; ainsi, en conservant votre message de validation d'origine.

Pour que cela fonctionne pour plusieurs commits, créez simplement un commit temporaire avec vos dernières modifications, puis utilisez un rebase interactif pour écraser le commit précédent (contenant le bon message de commit) avec le nouveau message temporaire, en conservant le message de commit de l'ancien commit.

mart1n
la source
2
Lorsque vous effectuez un rebase interactif, vous pouvez même utiliser l' fixupinstruction pour déclarer que le dernier commit est de corriger le commit précédent et il utilisera automatiquement le message de commit de l'original en supprimant le message du commit de correction.
qqx
Par exemple, si je veux fusionner à nouveau des pull-requests mis à jour de force. Ou si le commit n'est pas le dernier et ne peut pas être facilement corrigé en fonction de HEAD et il est plus facile de les refaire.
bentolor
@BenTebulin Eh bien, le rebase interactif vous permet de modifier n'importe quel commit dans une plage de commits spécifiés. Ce n'est pas strictement le commit HEAD qui doit être modifié.
mart1n
@ mart1n Merci pour singulariser modifier en rebase -i. Jamais utilisé dans ce contexte. Pour les cas restants, comme la fusion à nouveau, l'autre réponse est plus appropriée à ma question, j'ai donc marqué celle-ci comme réponse.
bentolor
Intellij a des étendues qui ne fonctionnent que sur les fichiers qui n'ont pas encore été validés. Il est utile de réinitialiser les fichiers sur non validés afin qu'intellij puisse être chargé de lint les fichiers, par exemple, puis de re-valider ces fichiers avec le même message. modifier ne fonctionnera pas pour cela en raison des limites de la portée d'intellij.
David Mann
5

Vous pourriez envisager git commit --reset-author -c <commit>de réutiliser le message de validation avec l'édition et l'heure actuelle.

Joe
la source
Merci - cela est assez proche de ce que je recherchais.
bentolor