Tenho o seguinte no texto de tarefas de git rebase -i HEAD~2
:
pick 56bcce7 Closes #2774
pick e43ceba Lint.py: Replace deprecated link
# Rebase 684f917..e43ceba onto 684f917 (2 command(s))
#
...
Agora, quando tento esmagar o primeiro ( 56bcce7
) e escolher o segundo adicionando "s" antes do primeiro, recebo o seguinte erro:
Cannot 'squash' without a previous commit
Alguém pode me explicar o que significa e como faço isso?
Eu quero esmagar o primeiro commit ( 56bcce7
) e "selecionar e reformular" o segundo ( e43ceba
) commit
Respostas:
O rebase interativo apresenta os commits na ordem reversa daquela com a qual você está acostumado
git log
.git rebase -i
reproduz os commits selecionados na ordem exata (de cima para baixo) em que estão listados no arquivo de instruções de rebase salvo. Ao fazer o squashing, o commit selecionado para squashing é combinado com o commit que o precede na lista (editada), ou seja, o commit da linha anterior. No seu caso - não há commit anterior para56bcce7
. Você tem que fazer um dos seguintesgit rebase -i HEAD~3
(se você quer esmagar56bcce7
a684f917
)Se você quer dizer para combinar
56bcce7
come43ceba
, ee43ceba
não depende56bcce7
, então simplesmente reordená-los:ATUALIZAÇÃO : a resposta de Gus abaixo sugere uma maneira melhor de fazer o mesmo, sem reordenar os dois commits:
Isso irá esmagar / mesclar os dois commits em um. Quando o rebase interativo solicitar uma mensagem de confirmação reformulada para
56bcce7
, forneça a mensagem de confirmação que descreve a união de56bcce7
ee43ceba
.fonte
56bcce7
eme43ceba
. Então, como faço a Etapa 1 aqui?Tive um problema semelhante, que resolvi da seguinte maneira:
Este é o grupo de commit que eu queria esmagar:
Como você pode ver, eu não queria. 4, mas 1, 2 e 3 não tinham nenhum compromisso anterior para esmagar . Portanto, não é possível 'esmagar' sem um erro de confirmação anterior .
Minha solução foi usar a
r
opção de# r, reword = use commit, but edit the commit message
Então, minha lista de commits era assim:
Depois de salvar, o shell interativo me pediu para reformular o commit escolhido.
Depois disso, meu log de commits resultou em um único commit que resultou em um histórico de commit mais limpo.
fonte
git rebase --edit-todo
e corrigir referindo esta resposta e então fazergit rebase --continue
Eu tive esse problema e a razão pela qual isso aconteceu no meu caso é que você não pode esmagar commits mais antigos em um novo commit. Aqui está um exemplo, digamos que você tenha 3 commits:
Agora, se você disser
git rebase -i HEAD~3
e fizer algo comoIsso resultará no erro:
Solução:
Ao esmagar os commits, você deve esmagar os commits recentes nos antigos e não vice-versa, portanto, no exemplo, será algo assim:
Isso vai funcionar bem, caso você queira todas as suas mensagens de commit, eu sugeriria correção em vez de squash .
fonte
Squash com a lógica reversa . Você poderá selecionar a mensagem de confirmação desejada na etapa posterior.
pick
o primeiro commit para o qual você não quer a mensagem de commit.squash
oufixup
o (s) commit (s) que você deseja mesclar, até aquele que contém a mensagem de commit que você realmente queria.:x
)Lint.py: Replace deprecated link
:).:x
)Espero que esteja mais claro para alguém ✌🏽
fonte
Será melhor apenas dizer no editor interativo contendo os commits, git sempre squash de baixo para cima e deve-se deixar uma entrada "pick" no topo para receber os squashes de baixo.
fonte
Acabei de tentar essa abordagem.
Isso mostraria os últimos 3 commits que me dariam uma idéia de qual é o último commit e qual foi anteriormente. Agora declarado rebase,
Escolha o último commit além do qual precisamos esmagar os outros dois. O ID do commit que é escolhido como commit básico seria como,
Para os outros dois IDs de commit, altere-os para,
ou simplesmente,
fonte
Eu também já encontrei este problema agora, que é apenas descuido. Você pode resolver o problema como a seguir: quando você tenta esmagar o primeiro (56bcce7) e escolhe o segundo, você deve adicionar "s" antes da segunda linha, mas não o primeiro. você também pode consultar o próximo site: http://backlogtool.com/git-guide/en/stepup/stepup7_5.html
fonte