Git: como mesclar reversamente um commit?

124

Com o SVN, é fácil mesclar reversamente um commit, mas como fazer isso com o Git?

Mot
fonte
Eu não acho que é isso que significa a pergunta. Uma mesclagem reversa no SVN também reverte as alterações da confirmação para as alterações locais, para que você possa editá-las e confirmar novamente.
Dormouse

Respostas:

105

Para criar um novo commit que 'desfaz' as alterações de um commit passado, use:

$ git revert <commit>

Também é possível remover uma confirmação de um ponto arbitrário no passado, refazendo e redefinindo, mas você realmente não deseja fazer isso se já tiver enviado as confirmações para outro repositório (ou alguém o tiver retirado) .

Ben James
fonte
31
Você provavelmente precisaria fornecer a -m <parent number>opção git revertpara especificar qual alteração reverter. Se você deseja desfazer uma mesclagem de histórico não publicado, use git reset --hard HEAD^1.
Jakub Narębski 27/11/2009
3
Jakub: isso é verdade se você estiver revertendo um commit de mesclagem, mas na terminologia do Subversion, "mesclagem reversa" é na verdade simplesmente o nome para reverter qualquer tipo de commit.
Ben James
4
Observe que usar -msignifica que uma mesclagem futura da ramificação não mesclada não incluirá as alterações anteriores a essa mesclagem! Consulte schacon.github.com/git/howto/revert-a-faulty-merge.txt para obter maneiras adequadas de mesclar novamente uma ramificação não mesclada.
Martijn Pieters
125

Para reverter um merge commit, você precisa usar: git revert -m <parent number>. Portanto, por exemplo, para reverter a confirmação mais recente de mesclagem usando o pai com o número 1, você usaria:

git revert -m 1 HEAD

Para reverter um commit de mesclagem antes do último commit, você faria:

git revert -m 1 HEAD^

Usar git show <merge commit SHA1> para ver os pais, a numeração é a ordem em que aparecem, por exemploMerge: e4c54b3 4725ad2

documentação do git merge: http://schacon.github.com/git/git-merge.html

discussão sobre git merge (confusa, mas muito detalhada): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt

Marcus Ericsson
fonte
36
Como você pode obter o 'número' associado aos pais? As ramificações possuem um 'id' numérico intrínseco?
Daniyalzade 5/09
7
Use git show <merge commit SHA1>para ver os pais, a numeração é a ordem em que eles aparecem, por exemploMerge: e4c54b3 4725ad2
supermethod
8
exemplo: git revert -m 1 SHA1esse comando funcionou para mim para reverter um commit de mesclagem com vários commits de mesclagem antes do cabeçalho e com muitos commits embaixo.
c.apolzon
3
Quais são os pais? E4c54b3 ou 4725ad2?
Dolphin
1
Isso ainda não fornece informações suficientes sobre como os resultados do git show estão relacionados aos números dos pais. A ordem em que aparecem é baseada em 1? Baseado em 0? Neste exemplo especificamente, qual é o SHA1 do pai 1? e4c54b3 ou 4725ad2?
cowlinator
4

Se eu entendi direito, você está falando sobre fazer uma

svn merge -rn:n-1

voltar de um commit anterior, nesse caso, você provavelmente está procurando

git revert
Rudedog
fonte
0
git reset --hard HEAD^ 

Use o comando acima para reverter as alterações de mesclagem.

kapil chakravarthy
fonte
3
Isso descarta o commit de mesclagem, que não faz o que o pôster original está pedindo. O OP está tentando fazer um patch reverso para desfazer as alterações anteriores, não para apagar completamente o histórico das alterações anteriores.
-1

Se você não deseja confirmar, ou deseja confirmar posteriormente (a mensagem de confirmação ainda estará preparada para você, que você também pode editar):

git revert -n <commit>
rkrisztian
fonte