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.

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.


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.


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.

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.


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 .


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.


-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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.