Git: Como reutilizar / reter mensagens de commit após 'git reset'?


103

Como usuário do Git, eu regularmente me deparo com a situação de que preciso retrabalhar um ou mais commits de uma forma que não se encaixe em --amendou rebase -icom commits de correção. Normalmente, eu faria algo como

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

Eu levo mensagens de commit compostas sensatas muito a sério. Eles normalmente contêm um texto maior com referências e justificativas para a alteração. Até agora, eu estou bastante irritado sobre o longo processo para recuperar minha antiga mensagem de confirmação através de um indiferenciados git reflog, git loge copiar e colar processo.

Existe uma maneira melhor de lidar com isso? E como seria, se meu incluir mais de um commit?

Edit: Depois de pensar um pouco sobre isso, acho que o que estou procurando é alguma funcionalidade do tipo git stash para mensagens de commit onde corrigir / corrigir commits não são apropriados.


2
Se tudo que você fez foi git reset head~1, sua mensagem de commit antiga não seria apenas a segunda entrada no reflog?

Sim - mas como eu seria capaz de reutilizar a mensagem sem copiar e colar (o que normalmente requer
remoção

Hoje em dia, basta ter gitkaberto. Dessa forma, você nem precisará usar o reflog. Como alternativa, use rev-parse <branch>para obter seu hash antes da redefinição e use a resposta de ibizaman.
cst1992

Respostas:


142

Depois de um git reset, este one-liner pode fazer isso:

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

ou ainda mais curto:

git commit -C HEAD@{1}

Você pode usar as outras opções fornecidas por @ user2718704 .


6
Shorter:git commit -C@@{1}
Phu Ngo

2
Este é um uso fantástico do reflog
David Mann,

22
Após uma reinicialização, ORIG_HEAD é definido. Acho git commit --reuse-message=ORIG_HEADque é o mais claro.
Scott Jacobsen

45

Ao executar o comando "git commit", você deve verificar as seguintes opções,

Para reutilizar,

--reuse-message=<commit>

Para editar na reutilização,

--reedit-message=<commit>

Para mudar o autor,

--reset-author

1
Marcado como a nova solução, pois fornece a resposta mais abrangente. Embora essa solução ainda não resolva totalmente meus problemas de 'recuperação'.
bentolor

9

Por que reiniciar se você pode hackear, consertar, hackear e então apenas executar git commit --amend --no-edit; assim, mantendo sua mensagem de confirmação original.

Para fazê-lo funcionar para vários commits, apenas crie um commit temporário com suas mudanças mais recentes e então use um rebase interativo para esmagar o commit anterior (contendo a mensagem de commit válida) com o novo temporário, mantendo a mensagem de commit do commit antigo.


2
Ao fazer um rebase interativo, você pode até usar a fixupinstrução para declarar que o commit posterior é para corrigir o commit anterior e ele usará automaticamente a mensagem de commit do original descartando a mensagem do commit de correção.
qqx

Por exemplo, se eu quiser mesclar novamente uma solicitação de pull de atualização forçada. Ou se o commit não for o último e não puder ser facilmente corrigido com base no HEAD e será mais fácil refazê-los.
bentolor 01 de

@BenTebulin Bem, rebase interativo permite que você modifique qualquer commit em um intervalo de commits especificados. Não é estritamente o commit HEAD que precisa ser modificado.
mart1n

@ mart1n Obrigado por destacar edição no rebase -i. Nunca usei nesse contexto. Para os casos restantes, como re-mesclar a outra resposta é mais apropriado para a minha pergunta, então marquei essa como resposta.
bentolor

O Intellij possui escopos que operam apenas em arquivos que ainda não foram confirmados. É útil reconfigurar os arquivos como não confirmados para que o intellij possa ser instruído a lint os arquivos, por exemplo, e depois reenviá-los com a mesma mensagem. alterar não funcionará para isso devido às limitações do escopo do intellij.
David Mann,

5

Você pode considerar git commit --reset-author -c <commit>reutilizar a mensagem de confirmação com a edição e a hora atual.


Obrigado - isso chega bem perto do que eu estava procurando.
bentolor
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.