Como manter um branch git sincronizado com o master

276

No momento em que o git está entrando na minha cabeça, não consigo encontrar a melhor solução para o seguinte.

Existem dois ramos, um chamado mestre e outro chamado suporte móvel . Desejo manter o suporte para dispositivos móveis como um ramo contínuo que será mesclado / sincronizado com o ramo mestre sempre que o suporte para dispositivos móveis estiver estável. Isso mesclaria as alterações do suporte móvel para o mestre, mas também traria todas as alterações do suporte mestre para o móvel, para que a ramificação possa continuar sendo trabalhada e os recursos aprimorados ou alterados. Isso precisa funcionar com um repositório central e vários desenvolvedores.

Por favor, um exemplo de fluxos de trabalho semelhantes que outras pessoas usam ou apenas me diga se essa ideia é estúpida e devo considerar outras opções. No momento, o fluxo de trabalho parece bom, mas simplesmente não sei como fazer o git funcionar dessa maneira.

Obrigado, toda ajuda muito apreciada.

Atualização 1: Para mesclar o mestre no suporte de dispositivos mobilizados e o suporte ao dispositivo mobilizado no mestre, eu recebo confirmações replicadas nos dois ramos. Ou o git é inteligente o suficiente para descobrir que eu puxei as alterações mais recentes da ramificação A para a ramificação B e adicionei a consolidação de mesclagem C na ramificação B. E eu extraí as alterações mais recentes da ramificação B para a ramificação A e adicionei a consolidação de mesclagem D para ramificação UMA?

Eu ia postar uma imagem, mas não tenho reputação suficiente, então acho que a ilustração a seguir terá que fazer. Duas ramificações em execução contínua com mesclagens nas duas direções frequentemente. A principal coisa sobre a qual não tenho certeza é como o git executará os commits e preencherá um ramo com os commits do outro ramo nas mesclagens ou permanecerá limpo. Eu já usei rebase antes, mas parece encerrar o branch e colocar todos os commits no master, ou fiz errado. Obrigado pela ajuda até agora.

master
A--B--C-----H--I--J--M--N
       \   /    \
mobile  \ /      \
D--E--F--G--------K--L
Mr. EZEKIEL
fonte
1
Se você estava, como eu, procurando como fazê-lo com o cliente GitHub : help.github.com/articles/merging-branches
cregox
1
Essa pergunta salvou minha vida por séculos; Obrigado pelo grande esforço para reservar esta maravilhosa pergunta @Mr. EZEKIEL
DJphy
Você está trabalhando em um garfo, você tem que seguir help.github.com/articles/syncing-a-fork
koppor

Respostas:

417

sim apenas faça

git checkout master
git pull
git checkout mobiledevicesupport
git merge master

para manter o suporte a dispositivos móveis sincronizado com o mestre

quando estiver pronto para colocar o suporte a dispositivos móveis no mestre, primeiro mescle no mestre como acima, e então ...

git checkout master
git merge mobiledevicesupport
git push origin master

e é isso.

a suposição aqui é que mobilexxx é um ramo de tópico com trabalho que ainda não está pronto para entrar em seu ramo principal. Portanto, somente entre no master quando o suporte a dispositivos móveis estiver em um bom lugar

concept47
fonte
Isso me parece razoável, acho que não tenho certeza de quão sujo isso tornaria o histórico de submissões, atualizarei minha pergunta com um exemplo do que acho que aconteceria.
Sr. EZEKIEL
1
Você terá alguns "commits de mesclagem", essencialmente o git tentando resolver as diferenças entre suas ramificações. se você está preocupado com isso E você é o único que usa o branch, faça um "git rebase master" em vez de um "git merge master" e não empurre os commit para a filial remota. Se você fizer isso, encontrará muitos push de força (git push --force) para dar origem / suporte a dispositivos móveis, porque você (provavelmente) sempre enviará, provavelmente, um histórico de confirmações que não correspondem ao que a filial remota possui. mais detalhes aqui git-scm.com/book/en/Git-Branching-Rebasing
concept47
Eu acredito que esta é a resposta correta, soa exatamente como o que eu quero. Adicionei uma ilustração acima para torná-la um pouco mais clara, mas se o que você está dizendo é verdade, isso deve funcionar exatamente como eu quero. Obrigado.
Sr. EZEKIEL
2
Leia isto para entender por que isso não é um conselho especialmente bom: kentnguyen.com/development/visualized-git-practices-for-team/… . Isso foi escrito pelo mantenedor do Git, então provavelmente é justo dizer que ele sabe do que está falando em relação a esse tópico específico.
Dan Molding
2
Isso deixa o histórico de envio confuso, veja minha resposta através de rebase.
Gob00st 29/11
43

Sempre que desejar obter as alterações do mestre em sua ramificação de trabalho, faça a git rebase <remote>/master. Se houver algum conflito. resolvê-los.

Quando a sua ramificação de trabalho estiver pronta, refaça novamente a redefinição e faça git push <remote> HEAD:master. Isso atualizará a ramificação principal no controle remoto (repositório central).

euphoria83
fonte
3
Quais são os prós / contras de fazê-lo dessa maneira, e não na resposta aceita?
Hampus Ahlgren 14/01
33
Sane até passar 5 horas no inferno rebase
IcedDante
21
Isso é verdade apenas se sua ramificação estiver em um repositório privado. Nunca rebase algo que foi enviado a montante. É por isso que: git-scm.com/book/en/v2/…
Kleag
3
O problema de refazer a reescrita do histórico é que os SHAs da confirmação refazida são alterados e, portanto, você não pode confiar na saída de (por exemplo) git branch --contains <commit>.
Jnns
13

A abordagem do concept47 é a maneira certa de fazê-lo, mas eu aconselho a mesclar com a opção --no-ff para manter seu histórico de consolidação claro.

git checkout develop
git pull --rebase
git checkout NewFeatureBranch
git merge --no-ff master
IwishIcanFLighT
fonte
9

Sim, eu concordo com a sua abordagem. Para mesclar o suporte a dispositivos móveis no mestre, você pode usar

git checkout master
git pull origin master //Get all latest commits of master branch
git merge mobiledevicesupport

Da mesma forma, você também pode mesclar o mestre no suporte a dispositivos móveis.

Q. Se a mesclagem cruzada for um problema ou não.

R. Bem, isso depende das confirmações feitas na filial móvel * e na filial principal desde a última vez em que foram sincronizadas. Veja este exemplo: Após a última sincronização, as confirmações a seguir ocorrem nesses ramos

Master branch: A -> B -> C [where A,B,C are commits]
Mobile branch: D -> E

Agora, suponha que o commit B fez algumas alterações no arquivo a.txt e o commit D também fez algumas alterações no a.txt. Vamos dar uma olhada no impacto de cada operação de fusão agora,

git checkout master //Switches to master branch
git pull // Get the commits you don't have. May be your fellow workers have made them.
git merge mobiledevicesupport // It will try to add D and E in master branch.

Agora, existem dois tipos de fusão possíveis

  1. Mesclagem de avanço rápido
  2. Mesclagem verdadeira (requer esforço manual)

O Git primeiro tentará fazer a fusão do FF e se encontrar algum conflito não resolvível pelo git. Ele falha na mesclagem e solicita a mesclagem. Nesse caso, ocorrerá uma nova confirmação responsável pela resolução de conflitos em a.txt.

Portanto, o ponto principal é que a mesclagem cruzada não é um problema e, no final das contas, você precisa fazer isso, e é isso que significa sincronização. Certifique-se de sujar as mãos na fusão de galhos antes de fazer qualquer coisa na produção.

sachinjain024
fonte
1
Então, a fusão cruzada como esta não é um problema?
EZEKIEL
Mesclagem cruzada é o que dizemos sincronização e não é um problema, a menos que as confirmações nos dois ramos não causem conflitos. Por favor, veja minha resposta atualizada.
Sachinjain024
3

A resposta aceita via git merge fará o trabalho, mas deixa um histórico confuso de confirmação, a maneira correta deve ser 'rebase' através das seguintes etapas (supondo que você queira manter o seu ramo de recursos em sycn com desenvolvimento antes de fazer o push final antes do PR )

1 git fetchda ramificação de recursos (verifique se a ramificação de recursos em que você está trabalhando está atualizada até a data)

2 git rebase origin/develop

3 se surgir algum conflito, resolva-os um por um

4 usar git rebase --continuequando todos os conflitos forem resolvidos

5 git push --force

Gob00st
fonte
1
Isso é difícil de ler e difícil de entender. Atualize sua resposta e use a marcação de código adequada, para separar seus comentários dos comandos.
Not2qubit
2

Você está pensando na direção certa. Mesclar mestre com dispositivos móveis de suporte continuamente e mesclar dispositivos móveis com mestre quando o suporte móvel é estável. Cada desenvolvedor terá sua própria ramificação e poderá mesclar de e para o suporte mestre ou de dispositivos móveis, dependendo de sua função.

faisal
fonte