Ao fazer uma rebase do git, geralmente tenho dificuldade em descobrir o que está acontecendo com o 'local' e o 'remoto' ao resolver conflitos. Às vezes, tenho a impressão de que eles trocam de lado um compromisso para o outro.
Provavelmente é (definitivamente) porque ainda não entendi direito.
Ao rebasear, quem é 'local' e quem é 'remoto'?
(Eu uso o P4Merge para resolver conflitos)
git svn
parte ' ', apenas para agit rebase
parte ' ')Respostas:
TL; DR;
Para resumir (como Benubird comenta ), quando:
local
éB
(rebase para ),remote
éA
E:
local
éA
(intercalação em ),remote
éB
Uma rebase muda
ours
(a ramificação atual antes do início da rebase) etheirs
(a ramificação na qual você deseja rebase).O kutschkem ressalta que, em um contexto de fusão de ferramentas da GUI :
ours
" (a ramificação upstream)theirs
" - a ramificação atual antes da rebase.Veja ilustrações na última parte desta resposta.
Inversão quando rebase
A confusão pode estar relacionada à inversão
ours
etheirs
durante uma rebase .(extratos relevantes)
git rebase
página de manual :Por esse motivo, quando ocorre um conflito de mesclagem:
ours
" é a série rebaseada até agora, começando com<upstream>
,theirs
' é o ramo de trabalho. Em outras palavras, os lados são trocados.Inversão ilustrada
Em uma mesclagem
, não alteramos o ramo atual 'B'; portanto, o que temos ainda é o que estávamos trabalhando (e nos fundimos de outro ramo)
Em uma rebase:
Mas, em uma rebase , trocamos de lado, porque a primeira coisa que uma rebase faz é fazer o checkout da ramificação upstream! (para reproduzir as confirmações atuais em cima dela)
A
git rebase upstream
mudará primeiroHEAD
de B para o ramo upstreamHEAD
(daí a troca de 'nosso' e 'deles' em comparação com o ramo de trabalho "atual" anterior).), e a rebase repetirá os "commits" deles na nova ramificação "our" B:
Nota: a noção "upstream" é o conjunto referencial de dados (um repositório all ou, como aqui, uma ramificação, que pode ser uma ramificação local ) a partir da qual os dados são lidos ou aos quais novos dados são adicionados / criados.
'
local
' e 'remote
' vs. 'mine
' e 'theirs
'Pandawood acrescenta nos comentários :
GUI git mergetool
kutschkem acrescenta, e com razão:
ours
" (a ramificação upstream)theirs
" - a ramificação atual antes da rebase.git mergetool
de fato menciona 'local' e 'remote' :Por exemplo, o KDiff3 iria exibir a resolução merge como assim :
E fusão iria exibi-lo também :
O mesmo para o VimDiff , que exibe :
fonte
git checkout A; git rebase B
local é B, remoto é A. Tudo o que eu precisava saber ...git checkout A; git rebase B
local é B, remoto é um . Se eucheckout A
, então eu estou navegando na os arquivos como eles existem emA
, como é que de qualquer forma o controle remoto ? (Não estou dizendo que Benubird está errado; estou dizendo que o git tem um UX estúpido){branch A}
e{branch B}
ou similar.A linha inferior
git rebase
mesclar git
Em outras palavras, LOCAL é sempre o original e REMOTE é sempre o cara cujos commits não existiam antes, porque eles estão sendo mesclados ou reformulados no topo
Prove!
Certamente. Não aceite minha palavra! Aqui está um experimento fácil que você pode fazer para ver por si mesmo.
Primeiro, verifique se o git mergetool está configurado corretamente. (Se não o fizesse, provavelmente não estaria lendo esta pergunta de qualquer maneira.) Em seguida, encontre um diretório para trabalhar.
Configure seu repositório:
Crie uma confirmação inicial (com um arquivo vazio):
Crie uma confirmação em uma ramificação que não seja mestre:
Crie uma confirmação na ramificação principal:
Nesse ponto, seu repositório deve ficar assim:
Agora, para o teste de rebase:
Agora, o teste de mesclagem. Feche sua ferramenta de fusão sem salvar as alterações e, em seguida, cancele a rebase:
Então:
Seus resultados devem ser os mesmos mostrados no topo.
fonte
local
/remote
os aspectos eu lutava com a minha própria resposta acima (que é mais sobre a inversão doours
vstheirs
de qualquer maneira)Não entendi exatamente o seu problema, mas acho que o diagrama a seguir resolve seu problema. (Rebase: Repositório Remoto ---> Área de Trabalho)
Fonte: Meu fluxo de trabalho Git
fonte