git: aborta commit no meio da digitação da mensagem

131

Estou no meio de cometer. Eu digitei minha mensagem de confirmação no vim. Agora me lembrei de que precisava mudar alguma coisa. Percebo que existem outras opções para realizar o que quero, mas quero saber se há uma maneira de abortar o commit, mas ainda assim salvar a mensagem de commit que eu digitei até agora.

Alexander Bird
fonte

Respostas:

85

Sim. Escreva a mensagem de confirmação em um arquivo diferente ( :w /some/other/path.txt). Então saia do editor sem salvar ( :q!). Se você já salvou o arquivo no caminho original, exclua tudo e escreva o arquivo vazio primeiro (uma mensagem de confirmação vazia abortará a confirmação).

Agora, quando estiver pronto para confirmar "por reais", use o arquivo de mensagens que você salvou no caminho alternativo.

Como alternativa, copie a mensagem de confirmação em um dos buffers do vim.

Vale a pena notar que você realmente não precisa fazer isso : commit --amendpermite alterar o commit depois que ele é feito, portanto a solução mais fácil é produzir o commit com o que você tem e corrigi-lo antes de pressionar. Você pode até terminar o commit no estado quebrado reset HEAD~(redefine você para o estado em que sua cópia de trabalho estava antes do commit), corrigir sua cópia de trabalho e commit -a -c HEAD@{1}usar a antiga mensagem de commit.

Borealid
fonte
7
Nota: Sair do vim usando ": q!" não abortará a confirmação se houver uma mensagem de conflito de mesclagem preenchida automaticamente. Em vez disso, a confirmação continuará e a mensagem não listará quais arquivos tiveram conflitos.
2131616
write the empty file (an empty commit message will abort the commit)parte funcionou como um encanto, obrigado!
Саша Давиденко
182

Se o seu editor puder sair com um código de erro - o Git abortará a confirmação. Ao usar o VIM, digite

:cq

para sair com um código de erro diferente de zero e abortar a confirmação.

nimrodm
fonte
5
Este é um bom truque para interromper a, commit --amendpois caso contrário você teria que excluir a mensagem de confirmação e :wq.
Alex Jasmin
2
Bom truque! No entanto, a questão era como salvar a mensagem de confirmação, não excluí-la.
Elias Lynn
então como o svn consegue fazer isso? o que ele vê além do código de saída?
Chaim Geretz
1
grande quando você está fazendo um rebase interativo aka commits esmagando
hellatan
salvei minha vida quando fiz um em git commit --amendvez de git rebase --continuedurante o rebase.
Weishi Zeng
68

Se você abriu o vim para escrever sua mensagem de confirmação, exclua as linhas que não começam com # e o git abortará sua confirmação

Aborting commit due to empty commit message.
zetta
fonte
11
Isso é particularmente útil quando você deseja abortar um commit do git --amend.
Edsko
1
A questão era como abortar a confirmação, mas salvar a mensagem de confirmação. Excluir linhas que não começam com # exclui efetivamente a mensagem de confirmação, não salva a mensagem de confirmação. Não tenho certeza de como isso tem tantos votos positivos.
Elias Lynn
2
ggdGcortará todo o conteúdo da mensagem e, da próxima vez que você executar, vimpoderá apenas Po texto que você cortou anteriormente.
precisa saber é o seguinte
funciona usando nano, ctrl + k todas as linhas, em seguida, salvar e sair será abortado
Juh_ 18/06
9

Enquanto você pode abortar a confirmação, outra abordagem é alterar a confirmação posteriormente. Simplesmente confirme seu trabalho atual, faça as alterações adicionais desejadas git adde execute git commit --amend. Você será colocado de volta no editor de mensagens de confirmação e, quando salvar, a confirmação será alterada para incluir as alterações adicionais e sua nova mensagem de confirmação.

bdonlan
fonte
7

Sim é possivel. Para confirmar, seu editor DEVE escrever a mensagem de confirmação no arquivo .git/COMMIT_EDITMSGe sair com um código de status 0.

Portanto, se você estiver usando VI / VIM, faça o seguinte ...

  1. Escreva sua mensagem de confirmação.
  2. Salve a mensagem de confirmação com :w(por padrão, isso salvará o conteúdo atual em .git/COMMIT_EDITMSG)
  3. Saia do editor com um erro :cq
  4. ... faça o que você precisa fazer ... até adicione / remova arquivos na área de armazenamento temporário.
  5. Continue editando sua mensagem de confirmação existente com git commit -eF .git/COMMIT_MESSAGE

O -F /path/to/filepreencherá o editor com um determinado conteúdo de / path / to file /. No entanto, por padrão, isso executaria instantaneamente a confirmação, a menos que você forneça o -esinalizador adicionalmente para edição .

Rudolf Tucek
fonte
isso funciona, mas é menos preferível porque 1) assume que o CWD é onde está a pasta .git 2) Eu uso as workstes git e, com as workstes git, .git é na verdade um arquivo que indica onde está a pasta .git real.
Alexander Bird
@AlexanderBird isso não é verdade ... quando você deseja pegar a antiga mensagem de confirmação na etapa 5), ​​basta especificar um caminho relativo (digamos que você esteja no /foo/bar/diretório, relativo da raiz do projeto) comogit commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek
@AlexanderBird legal, ainda não percebi com o recurso de várias árvores de trabalho no git. Thx pela dica! Acredito que a única desvantagem disso é que você deve manter uma visão geral em sua cabeça, o que impede que você se concentre no código real. E apenas para pegar a mensagem sobre "onde eu deixei off` é um pouco pesado :) comprometer
Rudolf Tucek
1
@AlexanderBird então em vez de :wdo :sav committmpegit commit -eF committmp
#
0

Eu costumo fazer minhas confirmações IntelliJusando os terminais fornecidos. Infelizmente meus commits são manuais:

git commit -m'my message' // etc

então a única coisa que acho seguro fazer é fechar a janela do terminal! Apenas destaque seu texto se quiser salvá-lo, copie e feche a janela do terminal.

União Soviética
fonte
-2

A resposta @bdonlan é boa para essa pergunta, mas vou apontar para uma situação em que você pode querer uma solução melhor.

Digamos que você queira adicionar alterações para a última confirmação. Então você faz como @bdolan sugeriu:

git add files
git commit --amend

Imagine que, durante a gravação da nova mensagem, você se arrepende de adicionar esses arquivos a essa confirmação. O problema é que você está preso com uma mensagem de confirmação já salva e sair do editor (com ou sem salvar) adicionará essas alterações à última confirmação. Voltar ao ponto em que você estava antes dessas ações requer que você divida o último commit - aposto que você deseja evitá-lo.

O truque é salvar e sair do editor enquanto ele tiver apenas linhas começando com #ou sem linhas. Quando você sair, você será recebido com a mensagem:

Aborting commit due to empty commit message.

E você não mudou a última confirmação.

Doron Behar
fonte
Se eu entendo o que você está dizendo é um problema, está incorreto; como demonstrado aqui: git commit; vim ....; git commit --amend; git reset HEAD@{1}. Ou seja: se eu quiser "desfazer" a alteração, não tenho que dividir a confirmação anterior. o objeto de confirmação que era HEAD antes da alteração é salvo como HEAD@{1}. Além disso, o zetta já sugeriu excluir todas as linhas que não são de comentário.
Alexander Bird