Todos nós ouvimos que nunca se deve rebase um trabalho publicado, que é perigoso, etc. No entanto, não vi nenhuma receita postada sobre como lidar com a situação no caso de um rebase ser publicado.
Agora, observe que isso só é realmente viável se o repositório for clonado apenas por um grupo conhecido (de preferência pequeno) de pessoas, de modo que quem quer que faça o rebase ou redefinir possa notificar a todos que precisará prestar atenção na próxima vez que buscar(!).
Uma solução óbvia que eu vi funcionará se você não tiver nenhum commit local foo
e for rebaseizado:
git fetch
git checkout foo
git reset --hard origin/foo
Isso simplesmente descartará o estado local de foo
em favor de seu histórico de acordo com o repositório remoto.
Mas como alguém lida com a situação se tiver cometido mudanças locais substanciais naquele ramo?
fonte
git pull --rebase && git push
. Se você trabalharmaster
apenas em , então isso quase infalivelmente fará a coisa certa para você, mesmo se você tiver rebaseado e empurrado na outra extremidade.git reset --hard @{upstream}
agora que sei que o encantamento refspec mágico para "esqueça o que eu tenho / tive, use o que eu obtive do controle remoto" Veja meu comentário final em stackoverflow.com/a/15284176/717355push -f
): veja minha resposta abaixoRespostas:
Voltar a sincronizar após um rebase forçado não é tão complicado na maioria dos casos.
Ie. primeiro você configura um marcador para onde o branch remoto estava originalmente, então você o usa para reproduzir seus commits locais daquele ponto em diante no branch remoto rebaseizado.
Rebasing é como violência: se não resolve o seu problema, você só precisa de mais. ☺
Você pode fazer isso sem o marcador, é claro, se procurar o
origin/foo
ID de confirmação pré-rebase e usá-lo.É assim também que você lida com a situação em que se esqueceu de fazer um marcador antes de buscar. Nada está perdido - você só precisa verificar o reflog do branch remoto:
Isso imprimirá o ID de confirmação que
origin/foo
apontou antes da busca mais recente que mudou seu histórico.Você pode então simplesmente
fonte
git reflog show origin/foo
primeira linha dizendo "fetch: force-update"; é isso que o git grava quando uma busca faz com que o branch remoto faça qualquer coisa, menos o avanço rápido. (Você também poderia fazer isso manualmente - a atualização forçada é provavelmente a coisa mais recente.)Eu diria que a recuperação da seção upstream rebase da página do manual git-rebase cobre praticamente tudo isso.
Realmente não é diferente de recuperar de seu próprio rebase - você move um branch e rebase todos os branches que o tinham em seu histórico para sua nova posição.
fonte
Começando com git 1.9 / 2.0 Q1 2014, você não terá de marcar a sua origem ramo anterior antes rebasing-lo no ramo montante regravados, conforme descrito em Aristóteles Pagaltzis 's resposta :
Veja cometer 07d406b e cometer d96855f :
É por isso que o
git merge-base
comando tem uma nova opção:Por exemplo, se o histórico fosse assim:
Git 2.1 (Q3 2014) irá adicionar tornar este recurso mais robusto para isso: consulte commit 1e0dacd de John Keeping (
johnkeeping
)lidar corretamente com o cenário em que temos a seguinte topologia:
Onde:
B'
é uma versão corrigida doB
que não é idêntica ao patchB
;C*
eD*
são idênticos ao patchC
eD
respectivamente e conflitam textualmente se aplicados na ordem errada;E
depende textualmenteD
.O resultado correto da
git rebase master dev
é queB
é identificado como o ponto de bifurcação dodev
emaster
, de modo queC
,D
,E
são os commits que precisam ser repetidos paramaster
; masC
eD
são idênticos ao patch comC*
eD*
e podem ser eliminados, de modo que o resultado final seja:Se o ponto de bifurcação não for identificado, pegar
B
um branch contendoB'
resulta em um conflito e se os commits idênticos ao patch não forem identificados corretamente, então pegarC
um branch contendoD
(ou equivalentementeD*
) resulta em um conflito.O "
--fork-point
" modo de "git rebase
" regrediu quando o comando foi reescrito em C na era 2.20, que foi corrigido com Git 2.27 (Q2 2020).Veja o commit f08132f (09 de dezembro de 2019) de Junio C Hamano (
gitster
) .(Incorporado por Junio C Hamano -
gitster
- no commit fb4175b , 27 de março de 2020)fonte