usuario - git voltar para um commit especifico




Como alterar o commit do Git mais antigo? (4)

Esta questão já tem uma resposta aqui:

Eu fiz 3 git commits, mas não fui empurrado. Como posso corrigir o mais antigo (ddc6859af44) e (47175e84c) que não é o mais recente?

$git log
commit f4074f289b8a49250b15a4f25ca4b46017454781
Date:   Tue Jan 10 10:57:27 2012 -0800

commit ddc6859af448b8fd2e86dd0437c47b6014380a7f
Date:   Mon Jan 9 16:29:30 2012 -0800

commit 47175e84c2cb7e47520f7dde824718eae3624550
Date:   Mon Jan 9 13:13:22 2012 -0800

Caso o OP queira esmagar os 2 commits especificados em 1, aqui está uma maneira alternativa de fazer isso sem rebasing

git checkout HEAD^               # go to the first commit you want squashed
git reset --soft HEAD^           # go to the second one but keep the tree and index the same
git commit --amend -C [email protected]{1}   # use the message from first commit (omit this to change)
git checkout [email protected]{3} -- .       # get the tree from the commit you did not want to touch
git add -A                       # add everything
git commit -C [email protected]{3}           # commit again using the message from that commit

A sintaxe @{N) é útil, pois permitirá que você faça referência ao histórico de onde suas referências estavam. Neste caso, é HEAD que representa seu commit atual.


Eu preparei meu commit que queria emendar com um mais antigo e fiquei surpreso ao ver que o rebase -i reclamou que eu não tinha mudanças. Mas eu não queria fazer minhas alterações novamente especificando a opção de edição do commit antigo. Então a solução foi bem fácil e direta:

  1. prepare sua atualização para o commit mais antigo, inclua-o e confirme
  2. git rebase -i <commit you want to amend>^ - note o ^ então você vê o dito commit no editor de texto
  3. você vai conseguir algo assim:

    pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync
    pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
    pick e23d23a fix indentation of jgroups.xml
    
  4. Agora, para combinar o e23d23a com o 8c83e24, você pode alterar a ordem de linha e usar o squash da seguinte maneira:

    pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync    
    squash e23d23a fix indentation of jgroups.xml
    pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
    
  5. escrever e sair do arquivo, você estará presente com um editor para mesclar as mensagens de confirmação. Faça isso e salve / saia do documento de texto

  6. Você está feito, seus commits estão emendados

O crédito vai para: http://git-scm.com/book/en/Git-Tools-Rewriting-History Há também outra mágica git demonstrada útil.



Você pode usar o git rebase para reescrever o histórico de commit. Isso pode ser potencialmente destrutivo para suas alterações, portanto, use com cuidado.

Primeiro, confirme sua alteração "emendar" como um commit normal. Em seguida, faça um rebase interativo começando pelo pai do seu commit mais antigo

git rebase -i 47175e84c2cb7e47520f7dde824718eae3624550^

Isto irá disparar o seu editor com todos os commits. Reordene-os para que seu commit "emendar" seja inferior ao que você deseja corrigir. Em seguida, substitua a primeira palavra na linha com a confirmação "emendar" com s que combinará ( s ) com o commit antes. Salve e saia do seu editor e siga as instruções.





git-rewrite-history