Como mesclar mestre remoto à filial local

238

Eu tenho uma ramificação local de um projeto ("configUpdate") que extraí do projeto de outra pessoa e fiz várias alterações nele e gostaria de mesclar as alterações feitas na ramificação local.

eu tentei

git pull --rebase origin configUpdate

mas não conseguiu as últimas alterações - como posso mesclar as duas? (também para pontos de bônus, o que eu fiz com o pull --rebasecomando?)

Martyn
fonte
Possível duplicado do Git: Mescla um ramo de remoto localmente
Michael Freidgeim

Respostas:

354

No seu ramo de recursos (por exemplo configUpdate), execute:

git fetch
git rebase origin/master

Ou a forma mais curta:

git pull --rebase

Por que isso funciona:

  • git merge branchnamepega novas confirmações da ramificação branchnamee as adiciona à ramificação atual. Se necessário, ele adiciona automaticamente um commit "Merge" na parte superior.

  • git rebase branchnamepega novas confirmações da ramificação branchnamee as insere "em" suas alterações. Mais precisamente, ele modifica o histórico da ramificação atual, de forma que ela se baseie na ponta de branchname, com as alterações feitas por cima.

  • git pullé basicamente o mesmo que git fetch; git merge origin/master.

  • git pull --rebaseé basicamente o mesmo que git fetch; git rebase origin/master.

Então, por que você iria querer usar git pull --rebaseem vez de git pull? Aqui está um exemplo simples:

  • Você começa a trabalhar em um novo recurso.

  • No momento em que você está pronto para enviar suas alterações, vários commits foram enviados por outros desenvolvedores.

  • Se você git pull(que usa mesclagem), suas alterações serão ocultadas pelas novas confirmações, além de uma confirmação de mesclagem criada automaticamente.

  • Se você git pull --rebasepreferir, o git encaminhará seu mestre rapidamente para o upstream e aplicará suas alterações na parte superior.

Joey Adams
fonte
Fiz isso na ramificação correta, mas ainda vejo diferenças entre meus arquivos locais e a ramificação mestre remota do projeto original (mesmo que diga que tudo está atualizado!). Talvez eu tenha configurado o projeto incorretamente? Alguma maneira de verificar?
Martyn
1
@ Martin: As diferenças devem ser suas alterações locais. Faça outra bifurcação da ramificação remota e verifique se essa possui o conteúdo correto do arquivo.
precisa saber é o seguinte
4
Sei que essa é uma resposta antiga, mas observe que você pode preferir fazer uma MERGE em vez de uma nova rebase. Você não deseja fazer uma nova reformulação se precisar mesclar posteriormente para um repositório remoto que já tenha algumas alterações.
Domino
1
Que tal (supondo que você esteja atualmente no ramo configUpdate) ... o git pull é basicamente o mesmo que o git fetch; origem / mestre da mesclagem git. <- NÃO É VERDADEIRO
Chris
@ Chris: Em que sentido isso não é verdade? A suposição de origem / mestre como a montante? Ou o git pull foi alterado?
Joey Adams
81

Eu descobri que era:

$ git fetch upstream
$ git merge upstream/master
Martyn
fonte
6
Então, se você ainda não descobriu, pull --rebasenão funcionou porque originestava apontando para o garfo. Teria funcionado se você fizesse git pull --rebase upstream/master.
Karl Bielefeldt
3
Tente: origem merge git / master
Chris
Estava faltando uma busca, esta resposta resolveu para mim.
Nurettin
39

Mudar para o seu ramo local

> git checkout configUpdate

Mesclar o mestre remoto à sua filial

> git rebase master configUpdate

Caso haja algum conflito, corrija-o e, para cada arquivo em conflito, execute o comando

> git add [path_to_file / conflicted_file] (por exemplo, git add app / assets / javascripts / test.js)

Continuar rebase

> git rebase --continuar

Serge Seletskyy
fonte
Não tenha medo de usar rebase em vez de merge passar algum tempo de investigação a diferença se você sentir a lacuna nesta perguntas
Serge Seletskyy
13

O git rebase não parecia funcionar para mim. Após a rebase do git, quando tento enviar alterações para minha ramificação local, continuava recebendo um erro ("dica: as atualizações foram rejeitadas porque a ponta da ramificação atual está atrás da contraparte remota. Integre as alterações remotas (por exemplo, 'git pull. .. ') antes de pressionar novamente. ") mesmo após o git pull. O que finalmente funcionou para mim foi o git merge.

git checkout <local_branch>
git merge <master> 

Se você é iniciante como eu, aqui está um bom artigo sobre git merge vs git rebase. https://www.atlassian.com/git/tutorials/merging-vs-rebasing

AJC
fonte