Mestre de mesclagem do GIT em uma ramificação

49

Estou desenvolvendo um novo recurso em uma nova ramificação e, ao lado, cometi algumas alterações em minha ramificação principal.

É possível mesclar a ramificação principal em minha nova ramificação para mantê-lo atualizado, para que não tenha muitos conflitos de mesclagem depois que o novo recurso for concluído?

mnml
fonte
Você já tentou o git-merge? Ajuda aqui .
perfil completo

Respostas:

56

Você pode git merge masterou git rebase master, nesse caso, eu preferiria o git rebase .

Porque git rebasefaz com que as alterações na ramificação do recurso tenham sido feitas sobre as alterações na ramificação principal, o que simplifica o gráfico da versão.

Rebase

Tomando o exemplo do manual git rebase , git rebase masterna ramificação feature:

      A---B---C feature                             A'--B'--C' feature
     /                   --rebase-->               /
D---E---F---G master                  D---E---F---G master

No entanto, git rebaseé adequado apenas quando a ramificação não foi distribuída ou haverá confusão e trabalho extra a jusante, porque o antigo commit A, B, C agora é substituído pelos novos commit A ', B', C 'e F e G que não estavam lá antes.

O resultado real depois git rebase masterda ramificação featureé este:

      ( A---B---C )
       /
      /       A'--B'--C' feature
     /       /
D---E---F---G master

As confirmações A, B, C estão pendentes após a rebase, mas são alcançáveis git reflog feature.

Mesclar

Se alguém puxou seu ramo ou você o empurrou para algum lugar, você deve se fundir a ele, para evitar confusão e trabalho extra do outro lado. Consulte Recuperando de rebase upstream .

Este é o resultado de git merge masterno ramo feature:

      A---B---C feature                    A---B---C---M feature
     /                   --merge-->       /       ,---’
D---E---F---G master                 D---E---F---G master

Como alternativa, se você git merge featureno ramo master, ficaria assim:

      A---B---C feature                    A---B---C feature
     /                   --merge-->       /         \
D---E---F---G master                 D---E---F---G---M master
Christoffer Hammarström
fonte
Você deve explicar por que prefere rebase e qual é a diferença. Rebase cria um histórico linear - isso pode não se encaixar nessa pergunta.
Andreas Rehm
Ok, se eu entendi bem: tenho que fazer check-out da ramificação principal se a novidade ainda não tiver terminado e uma nova reformulação se tiver terminado?
Mnml
Não, com a ramificação do recurso desmarcada, faça git rebase master, e "rebase" as alterações na ramificação do recurso, para que sejam "baseadas" nas alterações na ramificação mestre. Se as alterações na ramificação principal entrarem em conflito com as mudanças na ramificação de recursos, o git solicitará que você as resolva e continue, ignore ou aborte. Se você não tiver certeza, pode fazer o check-out de uma ramificação de teste para experimentá-la git checkout -b test-feature feature(supondo que sua ramificação de recurso seja denominada "feature").
Christoffer Hammarström
2
O que você quer dizer com "não consigo mais ver meu ramo"? Enfim, git rebasesó deve ser usado se o ramo não tiver sido distribuído, o que eu assumi ser o caso, pois você disse que era um novo ramo, desculpe por isso. Consulte Recuperando-se da rebase upstream nos documentos aos quais vinculei. Você precisará usar git merge. E você pode usar git reflogpara encontrar a cabeça de ramificação de recurso anterior, se quiser recuperá-la.
Christoffer Hammarström
1
Eu nunca vi uma explicação mais clara sobre as diferenças entre mesclagem e rebase. Obrigado.
Paulo Pedroso