Obter alterações do mestre para o ramo no Git


689

No meu repositório, tenho um ramo chamado no aqqual estou trabalhando.

Em seguida, cometi um novo trabalho e erros master.

Qual é a melhor maneira de colocar esses commits no aqbranch? Crie outro novo ramo mastere mescle-o aq?


3
No futuro, você também poderá iniciar seu ramo de correções de erros a partir de um ancestral comum do mestre e de outros ramos que precisarão das correções, para que você possa mesclá-lo em todos esses ramos, sem precisar buscar mais nada.
Cascabel

2
@ Jeffromi, mas isso está fora de controle se ele não é a única pessoa que trabalha no projeto. outras pessoas atualizam o mestre. inferno, você mesmo pode atualizar o mestre de um terceiro ramo, e a situação seria inevitável e precisa de uma solução geral.
ahnbizcad

@ahnbizcad Tenho certeza de que ele está no controle de onde começa seu próprio ramo. Se o ramo dele for um ancestral comum daqueles em que ele deseja se fundir e as pessoas posteriormente adicionarem a esses ramos, ainda será um ancestral comum.
Cascabel

pergunta pessoal, este comando faz-lo, #git pull origin my_branch_name
060 Basheer AL-MOMANI

Respostas:


794

Confira a aqramificação e refaça a partir de master.

git checkout aq
git rebase master

rebase pode vir de qualquer outro ramo? Ou seja. git rebase otherbranch? Parece que eu estava um pouco fora da minha pergunta, ramifiquei de um ramo e fiz alterações no ramo original.
Slee

2
Se estiver certo, rebase na solicitação pull, mostrará todas as confirmações do mestre. se você usar o mestre de mesclagem / origem, todas as confirmações mestre serão mostradas como 1 confirmação, o que facilita a revisão do código.
Foo Bar Usuário

4
Às vezes, git mergeseria melhor. Se os dois ramos evoluíram com o tempo, considere o melhor para você.
Erick2red

70
Tarde para a festa, mas esta é uma ótima visão geral de quando fazer o rebase vs mesclar: atlassian.com/git/tutorials/merging-vs-rebasing/…
ebuat3989

7
Se suas confirmações anteriores na ramificação aq forem públicas, não faça uma nova recuperação. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

Você deve poder apenas git merge origin/masterquando estiver no seu ramo aq.

git checkout aq
git merge origin/master

55
Se a recuperação for "melhor", depende completamente da situação específica.
Bombe

13
por que você simplesmente não chama "git merge master" em vez de "git merge master / origin"?
Michael Küller

145
Use rebasese sua filial for local e não tiver sido enviada para origin. Use mergese o seu ramo já foi enviado. rebasereescreverá a história.
garbagecollector

17
@Toskan, você pode encontrar problemas em que o mestre local não está atualizado com o controle remoto. Dessa forma, garante que você esteja mesclando na cópia remota do código.
precisa saber é o seguinte

8
@garbagecollector Sou contra rebase (posso, mas não vou rebater) Não vejo razão para apostar com rebase. Isso apenas torna as coisas desnecessariamente complexas. Você sempre tem a pergunta "Eu enviei isso para o controle remoto?" refletir e é difícil explicar aos recém-chegados. Algumas pessoas dizem que isso evita fusões confirmadas. Mas eu quero ter confirmações de mesclagem. Eles não são confusos, documentam quando as ramificações são mescladas. Então, pela última vez, podemos finalmente parar de agir como se estivéssemos comprometidos em dominar? Se você não gosta tanto de commits de mesclagem no log, basta filtrá-los com --no-mesclagens.
Nurettin


25

Não há garantia de que as correções principais não estejam entre outras confirmações, portanto, você não pode simplesmente mesclar. Faz

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

assumindo que esses commits representam as correções de bugs.

De agora em diante, mantenha as correções de erros em um ramo separado. Você será capaz de apenas

git merge hotfixes

quando você deseja agrupar todos eles no ramo de desenvolvimento regular.


17

Tanto cherry-pickos commits relevantes no ramo aqou merge ramo masterem ramo aq.


5
@Slee você respondeu a si mesmo ... não é a solução para esta situação
mtet88

13

Mesclar com aq

git checkout master
git pull
git checkout aq
git merge --no-ff master
git push

8

Jeito fácil

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

Para mim, eu já tinha alterações em vigor e queria as últimas da ramificação base. Eu era incapaz de fazer rebasee cherry-picklevaria uma eternidade, então fiz o seguinte:

git fetch origin <base branch name>  
git merge FETCH_HEAD

então neste caso:

git fetch origin master  
git merge FETCH_HEAD

7

Isso ( daqui ) funcionou para mim:

git checkout aq
git pull origin master
...
git push

Citação:

git pull origin masterbusca e mescla o conteúdo da ramificação principal com sua ramificação e cria uma confirmação de mesclagem. Se houver algum conflito de mesclagem, você será notificado nesse estágio e deverá resolver os commits de mesclagem antes de continuar . Quando você estiver pronto para enviar suas confirmações locais, incluindo sua nova confirmação de mesclagem, para o servidor remoto, execute git push.


É importante observar que esta solução é perfeita se uma mesclagem for necessária especificamente, ou seja, se a ramificação principal não puder ser rebaseada por algum motivo.
cudacoder

3

Você tem algumas opções. git rebase master aqna ramificação que manterá os nomes de confirmação, mas NÃO REBASE se for uma ramificação remota. Você pode git merge master aqse não se importar em manter os nomes de confirmação. Se você deseja manter os nomes de confirmação e é uma ramificação remota, ela é git cherry-pick <commit hash>confirmada em sua ramificação.


0

Você também pode fazer isso executando uma única linha.
git merge aq master

Isso é equivalente a

git checkout aq
git merge master

Isso não está fazendo o que você pensa que está fazendo. git merge a bmescla ramificações ae bna ramificação atual. Mas git merge aquando você está no ramo anão fará nada (é por isso que isso parece um pouco com o que você pensa que está fazendo). (Veja git-scm.com/docs/git-merge#Documentation/… .)
MikeBeaton

0

EDITAR:

A minha resposta abaixo documenta uma maneira de mesclar masterem aq, onde se você ver os detalhes da fusão que lista as alterações feitas em aqantes da fusão, não as alterações feitas no master. Eu percebi que isso provavelmente não é o que você quer, mesmo que você pense que é!

Somente:

git checkout aq
git merge master

está bem.

Sim, essa mesclagem simples mostrará que as alterações de masterforam feitas aqnesse ponto, e não o contrário; mas tudo bem - já que foi isso que aconteceu! Posteriormente, quando você finalmente mesclar sua ramificação master, é quando uma mesclagem finalmente mostrará todas as alterações feitas master(o que é exatamente o que você deseja e é o commit no qual as pessoas esperam encontrar essas informações).

Eu verifiquei e a abordagem abaixo também mostra exatamente as mesmas alterações (todas as alterações feitas aqdesde a divisão original entre aqe master) que a abordagem normal acima, quando você finalmente mescla tudo de volta master. Portanto, acho que sua única desvantagem real (além de ser excessivamente complexa e não-padrão ...: - /) é que, se você rever n mudanças recentes com git reset --hard HEAD~<n>e isso ultrapassar a mesclagem, a versão abaixo será revertida no ramo 'errado', que você deve consertar manualmente (por exemplo, com git reflog& git reset --hard [sha]).


[Então, o que eu pensava anteriormente era que:]

Há um problema com:

git checkout aq
git merge master

porque as alterações mostradas no commit de mesclagem (por exemplo, se você procurar agora ou mais tarde no Github, Bitbucket ou seu visualizador de histórico de git local favorito) são as alterações feitas no master, que podem não ser exatamente o que você deseja.

Por outro lado

git checkout master
git merge aq

mostra as alterações feitas no aq, que provavelmente é o que você deseja. (Ou, pelo menos, geralmente é o que eu quero!) Mas a mesclagem que mostra as mudanças corretas está no ramo errado!

Como lidar?!

O processo completo, terminando com uma confirmação de mesclagem, mostrando as alterações feitas no aq (conforme a segunda mesclagem acima), mas com a mesclagem que afeta o ramo aq, é:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

Isto: mescla aq no master, avança rapidamente a mesma mesclagem no aq, desfaz no master e o coloca novamente no aq!

Sinto que estou perdendo alguma coisa - isso parece ser algo que você obviamente deseja e algo difícil de fazer.

Além disso, rebase NÃO é equivalente. Perde os timestamps e a identidade dos commits feitos no aq, o que também não é o que eu quero.


0

Cenário:

  • Eu criei uma filial do master, por exemplo, branch-1 e a puxei para o meu local.
  • Meu amigo criou uma ramificação do master say branch-2.
  • Ele comprometeu algumas alterações de código no mestre.
  • Agora eu quero levar essas alterações da ramificação mestre para minha ramificação local.

Solução

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

Você pode encontrar conflitos no seu arquivo após executar o "git stash apply". Você precisa corrigi-lo manualmente e agora está pronto para fazer o push.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.