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




how to use tag on git (7)

Eu me encontrei nessa situação quando tentei rebase de um branch que estava rastreando um branch remoto, e eu estava tentando rebase no master. Neste cenário, se você tentar rebase, você provavelmente encontrará seu branch divergindo e isso pode criar uma bagunça que não é para git nubees!

Digamos que você esteja no ramo my_remote_tracking_branch, que foi ramificado do mestre

$ git status

# Na ramificação my_remote_tracking_branch

nada para confirmar (diretório de trabalho limpo)

E agora você está tentando rebase do master como:

git rebase master

Pare agora e poupe algum problema! Em vez disso, use a mesclagem como:

git merge master

Sim, você acabará com commits extras no seu branch. Mas, a menos que você esteja pronto para ramificações "não divergentes", esse será um fluxo de trabalho muito mais suave do que o rebasing. Veja este blog para uma explicação muito mais detalhada.

Por outro lado, se a sua ramificação é apenas uma ramificação local (isto é, ainda não foi enviada para qualquer controle remoto), você deve definitivamente fazer um rebase (e sua ramificação não irá divergir neste caso).

Agora, se você está lendo isso porque você já está em um cenário "divergente" devido a esse rebase, você pode voltar para o último commit de origem (ou seja, em um estado não-divergente) usando:

git reset - origem difícil / my_remote_tracking_branch

https://code.i-harness.com

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"?


Eu sei que existem muitas respostas aqui, mas acho que git reset --soft HEAD~1 merece alguma atenção, porque permite que você mantenha as alterações no último commit local (não pressionado) enquanto resolve o estado divergente. Eu acho que esta é uma solução mais versátil do que puxar com rebase , porque o commit local pode ser revisto e até movido para outro branch.

A chave é usar --soft , em vez do duro --hard . Se houver mais de 1 commit, uma variação de HEAD~x deve funcionar. Então, aqui estão todos os passos que resolveram minha situação (eu tinha 1 commit local e 8 commits no remote):

1) git reset --soft HEAD~1 para desfazer commit local. Para as próximas etapas, usei a interface no SourceTree, mas acho que os seguintes comandos também devem funcionar:

2) git stash para esconder alterações de 1). Agora todas as mudanças estão seguras e não há mais divergência.

3) git pull para obter as alterações remotas.

4) git stash pop ou git stash apply - git stash apply para aplicar as últimas alterações stashed, seguidas por um novo commit, se desejado. Esta etapa é opcional, junto com 2) , quando você deseja eliminar as alterações na confirmação local. Além disso, quando quiser se comprometer com outro ramo, essa etapa deve ser feita após a mudança para a desejada.


Eu tive isso e estou confuso sobre o que causou isso, mesmo depois de ler as respostas acima. Minha solução foi fazer

git reset --hard origin/master

Então, isso apenas restaura minha cópia (local) do master (que eu suponho que está errada) para o ponto correto, conforme representado por origem / master (remoto).

AVISO : Você perderá todas as alterações ainda não enviadas para origin/master .


No meu caso eu empurrei mudanças para origin/master e então percebi que eu não deveria ter feito isso :-( Isso foi complicado pelo fato de que as mudanças locais estavam em uma subárvore. Então eu voltei para o último bom commit antes do " mal "mudanças locais (usando o SourceTree) e, em seguida, recebi a" mensagem de divergência ".

Depois de consertar minha bagunça localmente (os detalhes não são importantes aqui) eu queria "voltar no tempo" a origin/master remota origin/master ramificação origin/master para que ela estivesse em sincronia com o master local novamente. A solução no meu caso foi:

git push origin master -f

Observe o interruptor -f (força). Isso excluiu as "alterações ruins" que foram enviadas para origin/master por engano e agora as filiais locais e remotas estão em sincronia.

Por favor, tenha em mente que esta é uma operação potencialmente destrutiva, portanto, realize-a somente se você estiver 100% certo de que "voltar" o mestre remoto a tempo está OK.


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 ).


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.


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.





branch