Cancelar completamente um rebase

255

Eu executei uma rebase como esta:

git rebase --onto master new_background_processing export_background_processing

Como não fiz o que eu queria, executei uma redefinição:

git reset --hard HEAD@{1}

Voltei minha ramificação ao estado em que estava, mas recebi esta mensagem quando digito status git:

# You are currently rebasing branch 'export_background_processing' on 'e378641'.

Como faço para cancelar completamente esse rebase? Não tenho certeza do que isso significa em si.

Graham Jackson
fonte
16
git rebase --abort
Micha Wiedenmann
6
Agora o Git 2.12 fornece git rebase --quit. Veja minha resposta abaixo
VonC

Respostas:

408

Use git rebase --abort. Na documentação oficial do kernel Linux paragit rebase :

git rebase --continue | --skip | --abort | --edit-todo

fonte
5
No meu caso git rebase --abort, não funcionou, porque eu errei alguma coisa. Eu só tenho seguinte erro: error: could not read '.git/rebase-apply/head-name': directory of file does not exist. O git rebase --quit abaixo descrito resolveu meu problema.
Kout 6/02
84

No caso de uma nova versão anterior que você não anulou corretamente, agora (Git 2.12, primeiro trimestre de 2017) git rebase --quit

Ver commit 9512177 (12 de novembro de 2016) por Nguyễn Thái Ngọc Duy ( pclouds) . (Fundida por Junio ​​C Hamano - gitster- in confirmação 06cd5a1 , 19 de dezembro de 2016)

rebase: adicione --quità limpeza rebase, deixe tudo intocado

Há ocasiões em que você decide abortar uma recuperação em andamento e passa a fazer outra coisa, mas se esquece de fazer " git rebase --abort" primeiro . Ou a rebase está em andamento há tanto tempo que você se esqueceu. No momento em que você percebe que (por exemplo, iniciando outra rebase), já é tarde demais para refazer seus passos. A solução é normalmente

rm -r .git/<some rebase dir>

e continue com sua vida.
Mas pode haver dois diretórios diferentes para <some rebase dir>(e obviamente requer algum conhecimento de como a rebase funciona) e o ".git parte " pode ser muito mais longa se você não estiver no diretório principal ou em uma árvore de trabalho vinculada. E " rm -r" é muito perigoso .git, um erro pode destruir o banco de dados de objetos ou outros dados importantes.

Forneça " git rebase --quit" para este caso de uso, imitando um precedente " git cherry-pick --quit".


Antes do Git 2.27 (Q2 2020), a entrada stash criada por "git merge --autostash " para manter o estado inicial sujo foi descartada por engano em " git rebase --quit", que foi corrigida.

Veja commit 9b2df3e (28 de abril de 2020) de Denton Liu ( Denton-L) .
(Mesclado por Junio ​​C Hamano - gitster- in commit 3afdeef , 29 de abril de 2020)

rebase: salve a entrada de autostash stash reflogno--quit

Assinado por: Denton Liu

Em a03b55530a (" merge: teach --autostash option", 07/04 2020, Git v2.27.0 - mesclagem listada no lote # 5 ), a --autostashopção foi introduzida para git merge.

(Consulte " Pode" git pull"ocultar e saltar automaticamente as alterações pendentes? ")

Notavelmente, quando git merge --quité executada com uma entrada de autostash presente, ela é salva no reflog de stash.

Isso é contrastado com o comportamento atual de git rebase --quit onde a entrada de autostash é simplesmente abandonada.

Adote o comportamento de git merge --quitin git rebase --quite salve a entrada de autostash no reflog de stash em vez de apenas excluí-lo.

VonC
fonte
3
Isso é muito útil para evitar o efeito colateral de redefinir o diretório de trabalho quando são feitas alterações em cima de a git rebase, em vez de perdê-las como eu acabei de fazer: P.
Chimpanzé guerreiro
12

Você tem sorte de não ter concluído a rebase, portanto ainda pode fazê-lo git rebase --abort. Se você tivesse completado a reformulação ( reescreve o histórico ), as coisas teriam sido muito mais complexas. Considere marcar as dicas das ramificações antes de realizar operações potencialmente prejudiciais (principalmente a reescrita do histórico), para que você possa retroceder se algo acontecer.

vonbrand
fonte
8

Se você está "Rebaseando" , "Já começou a rebase" que deseja cancelar , basta comentar (#)todas as confirmações listadas no editor de rebase.

Como resultado, você receberá uma mensagem da linha de comando

Nothing to do
Almas Adilbek
fonte