git: abandonner la validation au milieu de la saisie du message


131

Je suis en train de m'engager. J'ai tapé mon message de validation dans vim. Je me souviens maintenant que j'avais besoin de changer quelque chose. Je me rends compte qu'il existe d'autres options pour accomplir ce que je veux, mais je veux savoir s'il existe un moyen d'abandonner la validation tout en enregistrant le message de validation que j'ai tapé jusqu'à présent.

Réponses:


85

Oui. Écrivez le message de validation dans un autre fichier ( :w /some/other/path.txt). Quittez ensuite l'éditeur sans enregistrer ( :q!). Si vous avez précédemment enregistré le fichier dans son chemin d'origine, supprimez tout et écrivez d'abord le fichier vide (un message de validation vide annulera la validation).

Maintenant, lorsque vous êtes prêt à vous engager "pour de vrai", utilisez le fichier de message que vous avez enregistré dans le chemin alternatif.

Sinon, copiez le message de validation dans l'un des tampons de vim.

Il est intéressant de noter que vous n'avez vraiment pas à faire cela du tout : commit --amendvous permet de modifier le commit une fois qu'il a été fait, donc la solution simple est de produire le commit avec ce que vous avez et de le corriger avant de pousser. Vous pouvez même simplement terminer la validation dans son état cassé reset HEAD~(vous réinitialise à l'état dans lequel se trouvait votre copie de travail avant la validation), corriger votre copie de travail, puis commit -a -c HEAD@{1}utiliser l'ancien message de validation.


7
Remarque: quitter vim avec ": q!" n'annulera pas la validation s'il y a un message de conflit de fusion rempli automatiquement. Au lieu de cela, la validation continuera et le message ne listera pas les fichiers qui ont eu des conflits.
stephenbez

write the empty file (an empty commit message will abort the commit)une partie a fonctionné comme un charme, merci!
Саша Давиденко

182

Si votre éditeur peut quitter avec un code d'erreur, Git annulera la validation. Lorsque vous utilisez VIM, saisissez

:cq

pour quitter avec un code d'erreur différent de zéro et abandonner la validation.


5
C'est une bonne astuce pour abandonner un commit --amendcar vous auriez autrement à supprimer le message de validation existant et :wq.
Alex Jasmin

2
Joli tour! Cependant, la question était de savoir comment enregistrer le message de validation et non le supprimer.
Elijah Lynn

alors comment svn parvient-il à faire ça? que regarde-t-il à part le code de sortie?
Chaim Geretz

1
super quand vous faites un rebase interactif aka squashing commits
hellatan

m'a sauvé la vie quand j'ai fait un git commit --amendau lieu de git rebase --continuependant le rebase.
Weishi Zeng

68

Si vous avez ouvert vim pour écrire votre message de validation, supprimez simplement les lignes qui ne commencent pas par # et git annulera votre validation

Aborting commit due to empty commit message.

11
Ceci est particulièrement utile lorsque vous souhaitez abandonner un git commit --amend.
edsko

1
La question était de savoir comment annuler la validation mais enregistrer le message de validation. La suppression des lignes qui ne commencent pas par # supprime effectivement le message de validation, pas enregistre le message de validation. Je ne sais pas comment cela a autant de votes positifs.
Elijah Lynn

2
ggdGcoupera tout le contenu du message, puis la prochaine fois que vous exécuterez, vimvous pourrez simplement Ple texte que vous avez coupé précédemment.
oromoiluig

fonctionne en utilisant nano, ctrl + k toutes les lignes puis enregistrer et quitter sera abandonné
Juh_

9

Bien que vous puissiez abandonner la validation, une autre approche consiste à modifier la validation par la suite. Validez simplement votre travail actuel, puis effectuez les modifications supplémentaires que vous souhaitez git add, puis exécutez-les git commit --amend. Vous serez replacé dans l'éditeur de message de validation, et lorsque vous enregistrez, la validation sera modifiée pour inclure les modifications supplémentaires et votre nouveau message de validation.


7

Oui c'est possible. Afin de valider, votre éditeur DOIT écrire le message de validation dans le fichier .git/COMMIT_EDITMSGet quitter avec un code d'état 0.

Donc, si vous utilisez VI / VIM, vous voudrez peut-être faire ce qui suit ...

  1. Écrivez votre message de validation.
  2. Enregistrez le message de validation avec :w(par défaut, cela enregistrera le contenu actuel dans.git/COMMIT_EDITMSG )
  3. Quittez l'éditeur avec une erreur :cq
  4. ... faites ce que vous avez à faire ... même ajouter / supprimer des fichiers dans la zone de préparation.
  5. Continuez à modifier votre message de validation existant avec git commit -eF .git/COMMIT_MESSAGE

Le -F /path/to/fileremplira l'éditeur avec n'importe quel contenu donné de / chemin / vers / fichier. Cependant, par défaut, cela effectuerait instantanément la validation, à moins que vous ne fournissiez le -edrapeau en plus pour l' édition .


cela fonctionne, mais est moins préférable car 1) cela suppose que le CWD est l'endroit où se trouve le dossier .git 2) J'utilise git worktrees , et avec git worktrees, .git est en fait un fichier indiquant où se trouve le vrai dossier .git.
Alexander Bird

@AlexanderBird ce n'est pas vrai ... lorsque vous voulez récupérer l'ancien message de validation à l'étape 5), il vous suffit de spécifier un chemin relatif (disons que vous êtes dans le /foo/bar/répertoire, relatif à partir de la racine du projet) commegit commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek

@AlexanderBird cool, je n'ai pas encore remarqué avec la fonctionnalité de plusieurs arbres fonctionnels dans git. Thx pour l'indice! Je pense que le seul inconvénient est que vous devez garder un aperçu général dans votre tête, ce qui vous empêche de vous concentrer sur le code réel. Et juste pour reprendre le message de validation sur «là où j'ai laissé», c'est un peu lourd :)
Rudolf Tucek

1
@AlexanderBird alors au lieu de :wfaire :sav committmpetgit commit -eF committmp
Hashbrown

0

Je fais généralement mes commits en IntelliJutilisant les terminaux fournis. Malheureusement mes commits sont manuels:

git commit -m'my message' // etc

donc la seule chose que je pense être sûre de faire est de fermer la fenêtre du terminal! Mettez simplement votre texte en surbrillance si vous souhaitez l'enregistrer, puis copiez, puis fermez la fenêtre du terminal.


-2

La réponse @bdonlan est bonne pour cette question même, mais je vais signaler une situation dans laquelle vous voudrez peut-être une meilleure solution.

Supposons que vous souhaitiez ajouter des modifications au dernier commit. Alors, faites comme @bdolan l'a suggéré:

git add files
git commit --amend

Imaginez que lors de l'écriture du nouveau message, vous regrettez d'avoir ajouté ces fichiers à ce commit. Le problème est que vous êtes bloqué avec un message de validation déjà enregistré et que la sortie de l'éditeur (avec ou sans sauvegarde) ajoutera ces modifications au dernier commit. Revenir au point où vous en étiez avant ces actions vous oblige à fractionner le dernier commit - je parie que vous voulez l'éviter.

L'astuce consiste à enregistrer et à quitter l'éditeur alors qu'il n'a que des lignes commençant par #ou aucune ligne du tout. Lorsque vous quittez, vous serez accueilli avec le message:

Aborting commit due to empty commit message.

Et vous n'avez pas du tout changé le dernier commit.


Si je comprends que ce que vous dites est un problème, vous vous trompez; comme démontré ici: git commit; vim ....; git commit --amend; git reset HEAD@{1}. C'est-à-dire: si je veux «annuler» l'amendement, je n'ai pas à scinder l'engagement précédent. l'objet de validation qui était HEAD avant la modification est enregistré sous HEAD@{1}. De plus, zetta a déjà suggéré de supprimer toutes les lignes sans commentaires.
Alexander Bird
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.