Meu histórico Git é assim:
Eu gostaria de esmagar os commits roxos em um único. Eu não quero vê-los nunca mais no meu log de commits.
Eu tentei fazer um git rebase -i 1
, mas mesmo estando 1
no branch azul (cf. figura), ainda vejo todos os commits no meu branch roxo.
Como posso remover completamente o branch roxo (do log de commit)?
git
git-merge
git-rebase
Benjamin Toueg
fonte
fonte
Respostas:
Fazer
git rebase -i <sha before the branches diverged>
isso permitirá que você remova o commit de mesclagem e o log terá uma única linha, conforme desejado. Você também pode deletar quaisquer commits que você não deseja mais. O motivo pelo qual seu rebase não estava funcionando é que você não estava retrocedendo o suficiente.AVISO: Você está reescrevendo a história fazendo isso. Fazer isso com alterações que foram enviadas para um repositório remoto causará problemas. Eu recomendo fazer isso apenas com commits locais.
fonte
git rebase
e eles serão removidos.Começando com o repo no estado original
Para remover o commit de mesclagem e comprimir o branch em um único commit na linha principal
Use estes comandos (substituindo 5 e 1 pelos SHAs dos commits correspondentes):
Para manter um commit de mesclagem, mas compactar os commits de branch em um:
Use estes comandos (substituindo 5, 1 e C pelos SHAs dos commits correspondentes):
Para remover o commit de mesclagem e substituí-lo por commits individuais do branch
Basta fazer (substituindo 5 pelo SHA do commit correspondente):
E, finalmente, para remover o ramo inteiramente
Use este comando (substituindo C e D pelos SHAs dos commits correspondentes):
fonte
git rebase 5 master
caso, por que não é a ordem "ABC 1 2 3 4 5 D ..."?master
não têm em comum5
e os coloca no topo5
. O commit emC
não faz parte da linhagem de5
, é o primeiro a ser movido para cima5
.git rebase C 5; git rebase 5 master
Existem duas maneiras de resolver isso com base no que você deseja:
Solução 1 : remover commits roxos, preservando o histórico (caso você queira reverter)
-m 1
especifica qual linha pai escolherOs commits roxos ainda estarão lá na história, mas como você reverteu, você não verá o código desses commits.
Solução 2 : remova completamente os commits roxos (alteração perturbadora se o repo for compartilhado)
e deletar (remover linhas) correspondendo aos commits roxos.
Isso seria menos complicado se os commits não fossem feitos após a fusão. Confirmações adicionais aumentam a chance de conflitos durante
revert/rebase
.fonte
1 - 1 = 0
. Mas se você então rebase os commits roxos, você deixa para trás o patch revertido, a menos que você rebase isso também. Do contrário, é como aplicar-1
ao seu histórico, não0
, então você deixará para trás as mudanças que não deseja.Para apenas remover um Merge Commit
Se tudo o que você deseja fazer é remover um commit de mesclagem (2) para que seja como se nunca tivesse acontecido, o comando é simplesmente o seguinte
git rebase --onto <sha of 1> <sha of 2> <blue branch>
E agora o branch roxo não está no log de commits em azul e você tem dois branches separados novamente. Você pode então esmagar o roxo de forma independente e fazer quaisquer outras manipulações que desejar sem o commit de mesclagem no caminho.
fonte