Suponha que você tenha um histórico contendo os três commits A, B e C :
A-B-C
Gostaria de combinar os dois commits A e B com um commit AB :
AB-C
eu tentei
git rebase -i A
que abre meu editor com o seguinte conteúdo:
pick e97a17b B
pick asd314f C
Eu mudo isso para
squash e97a17b B
pick asd314f C
Então o Git 1.6.0.4 diz:
Cannot 'squash' without a previous commit
Existe um caminho ou isso é simplesmente impossível?
git
rebase
git-rebase
git-rewrite-history
cristão
fonte
fonte
Respostas:
Use a
git rebase -i --root
partir da versão 1.7.12 do Git .No arquivo de rebase interativo, altere a segunda linha do commit B para squash e deixe as outras linhas na seleção :
Isso combinará os dois commits A e B em um commit AB .
Encontrado nesta resposta .
fonte
Você tentou:
É possível começar assim se você continuar com, em
edit
vez desquash
:então corra
Feito.
fonte
git rebase --abort
para começar de novo e fazê-lo da maneira certa (não esmagando o primeiro commit no editor) #A
foi o commit inicial, mas agora você querB
ser o commit inicial. Os commit do git são árvores inteiras, e não diffs, mesmo que sejam normalmente descritos e visualizados em termos do diff que eles introduzem.Esta receita funciona mesmo se houver vários commits entre A e B e B e C.
fonte
git rebase --onto tmp <sha1_for_B>
No caso de rebase interativa, você deve fazer isso antes de A para que a lista seja:
tornar-se:
Se A é o commit inicial, você precisa ter um commit inicial diferente antes de A. Git pensa em diferenças, ele funcionará na diferença entre (A e B) e (B e C). Portanto, a abóbora não está funcionando no seu exemplo.
fonte
No caso de você ter centenas ou milhares de confirmações, usando a resposta de kostmo de
pode ser impraticável e lento, apenas devido ao grande número de confirmações que o script rebase precisa processar duas vezes , uma vez para gerar a lista interativa do editor de rebase (onde você seleciona qual ação executar para cada confirmação) e uma vez para realmente executar o re-aplicação de confirmações.
Aqui está uma solução alternativa que evitará o custo de tempo para gerar a lista do editor de rebase interativo ao não usar um rebase interativo em primeiro lugar. Dessa forma, é semelhante à solução de Charles Bailey . Você simplesmente cria um ramo órfão a partir do segundo commit e, em seguida, refaz todos os commit descendentes sobre ele:
Documentação
fonte
Em uma questão relacionada, eu consegui criar uma abordagem diferente para a necessidade de esmagar o primeiro commit, que é, assim, torná-lo o segundo.
Se você estiver interessado: git: como inserir um commit como o primeiro, alterando todos os outros?
fonte
Comando git para esquadrão: git rebase -i HEAD ~ [número de confirmações]
Digamos que você tenha um histórico abaixo do git commit:
pick 5152061 feat: Adicionado suporte para salvar a imagem. (A)
escolha 39c5a04 Correção: correções de erros. (B)
escolha a correção 839c6b3: conflito resolvido. (C)
Agora você deseja compactar A e B para AB, execute as etapas abaixo:
pick 5152061 feat: Adicionado suporte para salvar a imagem. (A)
s 39c5a04 Correção: correções de erros. (B)
escolha a correção 839c6b3: conflito resolvido. (C)
Nota: para o squash commit, podemos usar squash ou s. O resultado final será:
escolha 5152061 feat: Adicionado suporte para salvar a imagem. (AB)
escolha a correção 839c6b3: conflito resolvido. (C)
fonte
Você precisa executar um pouco de mágica na linha de comando.
Isso deve deixar você com um ramo que possui AB e C como confirmados.
fonte