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.

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

ibizaman
fonte
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
user2718704
fonte
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.

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

Joe
fonte
Obrigado - isso chega bem perto do que eu estava procurando.
bentolor