git delete - ramificação mestre e 'origem / mestre' divergiram, como 'desviar' ramificações '?




5 Answers

Você pode revisar as diferenças com um:

git log HEAD..origin/master

antes de puxá-lo (buscar + mesclar) (veja também "Como você obtém o git para extrair sempre de um ramo específico?" )

Quando você tem uma mensagem como:

"Sua ramificação e 'origem / master' divergiram, # e possuem 1 e 1 commit (s) diferentes, respectivamente."

, verifique se você precisa atualizar a origin . Se a origin estiver atualizada, alguns commits foram enviados para a origin de outro repositório enquanto você fez seus próprios commits localmente.

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \
                    C  master (your work)

Você baseou commit C no commit A porque esse foi o trabalho mais recente que você buscou no upstream no momento.

No entanto, antes que você tentasse empurrar de volta para a origem, alguém empurrou o commit B.
A história do desenvolvimento divergiu em caminhos separados.

Você pode então mesclar ou rebase. Veja Pro Git: Git Branching - Rebasing para detalhes.

Mesclar

Use o comando git merge:

$ git merge origin/master

Isso diz ao Git para integrar as mudanças de origin/master em seu trabalho e criar um commit de mesclagem.
O gráfico da história agora se parece com isto:

... o ---- o ---- A ---- B  origin/master (upstream work)
                   \      \
                    C ---- M  master (your work)

A nova mesclagem, commit M, tem dois pais, cada um representando um caminho de desenvolvimento que levou ao conteúdo armazenado nesse commit.

Note que o histórico por trás de M agora é não-linear.

Rebase

Use o comando git rebase:

$ git rebase origin/master

Isso diz ao Git para repetir commit C (seu trabalho) como se você tivesse baseado em commit B ao invés de A.
Os usuários do CVS e do Subversion rotineiramente rebaixam suas mudanças locais em cima do trabalho upstream quando atualizam antes do commit.
O Git apenas adiciona separação explícita entre as etapas de confirmação e rebase.

O gráfico da história agora se parece com isto:

... o ---- o ---- A ---- B  origin/master (upstream work)
                          \
                           C'  master (your work)

Commit C 'é um novo commit criado pelo comando git rebase.
É diferente de C de duas maneiras:

  1. Tem um histórico diferente: B em vez de A.
  2. Seu conteúdo responde por alterações em B e C; é o mesmo que M do exemplo de mesclagem.

Note que o histórico por trás de C 'ainda é linear.
Nós escolhemos (por enquanto) permitir apenas um histórico linear em cmake.org/cmake.git .
Essa abordagem preserva o fluxo de trabalho baseado em CVS usado anteriormente e pode facilitar a transição.
Uma tentativa de empurrar o C 'para o nosso repositório funcionará (supondo que você tenha permissões e ninguém tenha pressionado enquanto você estava rebaixando).

O comando git pull fornece uma maneira abreviada de buscar a origem e rebase o trabalho local nela:

$ git pull --rebase

Isso combina as etapas de busca e rebase acima em um comando.

tag list

De alguma forma, meu mestre e minha origem / ramificação principal divergiram. Eu realmente não quero que eles sejam divergidos. Como posso ver essas diferenças e "fundi-las"?




git pull --rebase origin/master 

é um único comando que pode ajudá-lo a maior parte do tempo.

Edit: Puxa os commits da origem / master e aplica suas alterações no histórico de ramificação recém-puxado.




No meu caso, aqui está o que eu fiz para causar a mensagem divergente : Eu fiz git push mas depois git commit --amend para adicionar algo à mensagem de commit. Então eu também fiz outro commit.

Então, no meu caso, isso simplesmente significava que origem / mestre estava desatualizado. Porque eu sabia que ninguém mais estava tocando origem / mestre, a correção era trivial: git push -f (onde -f significa força)




Para ver as diferenças:

git difftool --dir-diff master origin/master

Isso exibirá as alterações ou diferenças entre os dois ramos. Em araxis (My favorite) ele exibe em um estilo de pasta diff. Mostrando cada um dos arquivos alterados. Eu posso clicar em um arquivo para ver os detalhes das mudanças no arquivo.




No meu caso, isso foi causado por não cometer minha resolução de conflitos.

O problema foi causado pela execução do comando git pull . Mudanças na origem levaram a conflitos com o meu repositório local, o que resolvi. No entanto, eu não os cometi. A solução neste momento é confirmar as alterações ( git commit the resolved file)

Se você também modificou alguns arquivos desde a resolução do conflito, o comando git status mostrará as modificações locais como modificações locais não sincronizadas e mesclará a resolução como modificações locais em etapas. Isso pode ser resolvido apropriadamente, através da confirmação de alterações da mesclagem primeiro por git commit , depois adicionando e confirmando as alterações não sincronizadas como de costume (por exemplo, git commit -a ).




Related

git branch

Tags

git   branch