O que exatamente git rebase --skip faz?

107

Acabei de fazer um git pull --rebase origin mastere houve um conflito.

Em primeiro lugar, este conflito estava em um arquivo que eu não tinha tocado e estava a cerca de 10 commits de volta. Por que isso acontece?

Em seguida, digitei acidentalmente git rebase --skipe 'pulei aquele patch'.

Preocupado por ter pulado um commit, verifiquei uma nova versão do branch master e fiz uma comparação entre o branch no qual fiz o rebase e o novo branch master. As únicas mudanças que aparecem no diff são o último commit, e olhando para o log, o patch que foi 'pulado', aparece no histórico de commits.

Alguém pode explicar o que está acontecendo aqui?

mrwooster
fonte
11
Como você digita acidentalmente git rebase --skip. Erradamente, talvez? :)
manojlds
3
Ha! Foi criado para digitar --abort, mas por algum motivo desconhecido saiu como --skip. Não estava realmente pensando. :)
mrwooster,
9
O histórico do shell é bom nisso (para fazer com que você execute algo que não deseja).
Florian Klein

Respostas:

60

Ele faz o que diz, ele pula um commit. Se você executar rebase --abortem um conflito posterior durante o mesmo rebase, o commit ignorado também será revertido, é claro.

Se a sua mudança já existia no upstream, o Git não será capaz de aplicar o seu commit (mas geralmente deve pular automaticamente, se o patch for exatamente o mesmo). Seu próprio commit será ignorado, mas a alteração ainda existirá no HEAD atual, porque já foi aplicada no upstream.

Você realmente deve se certificar de que não removeu uma alteração importante sua;) (use o reflog para voltar ao estado anterior ao rebase)

tricô
fonte
4
Então, por que o commit ainda está aparecendo no log? E por que o commit ausente agora aparece no diff?
mrwooster
3
Sim, o conflito já havia sido resolvido upstream ... por algum motivo git rebase traz antigos conflitos de mesclagem ... outra coisa que me confunde? ... isso significa que ele ignorou o conflito, mas aplicou o patch que resolveu o conflito?
mrwooster,
3
Você pulou seu próprio commit, que teve a mesma alteração de um commit upstream. Você ignorou seu commit, mas a alteração ainda foi feita (porque ela já existia no upstream)
knittl
1
@mittal não, não acho que --skipseja o caminho a percorrer. Skip irá pular um commit completamente, descartando todas as mudanças feitas nele.
Knittl
3
@mittal: pense git rebaseem copiar commits de um branch para outro. Então, quando você pula um commit, o conteúdo original do commit é pulado e o patch não é aplicado (então todas as mudanças feitas em qualquer arquivo não irão para seu branch de destino). A maneira mais fácil é configurar um repositório git simples com dois branches, vários commits em cada um deles e então tentar rebase e pular um commit (você pode usar git rebase --interactivepara especificar quais commits serão copiados ( pick) ou pulados ( skip)
knittl