Qual é a diferença entre git merge
e git rebase
?
Qual é a diferença entre git merge
e git rebase
?
Respostas:
Suponha que originalmente havia 3 commits, A
, B
, C
:
Em seguida, o desenvolvedor Dan criou o commit D
e o desenvolvedor Ed criou o commit E
:
Obviamente, esse conflito deve ser resolvido de alguma forma. Para isso, existem 2 maneiras:
MERGE :
Ambos confirmam D
e E
ainda estão aqui, mas criamos um commit de mesclagem M
que herda mudanças de ambos D
e E
. No entanto, isso cria uma forma de diamante , que muitas pessoas acham muito confusa.
REBASE :
Criamos commit R
, cujo conteúdo real do arquivo é idêntico ao do commit de mesclagem M
acima. Mas nos livramos do commit E
, como se ele nunca tivesse existido (indicado por pontos - linha de fuga). Devido a essa obliteração, E
deve ser local para o desenvolvedor Ed e nunca deve ter sido enviado para nenhum outro repositório. A vantagem da rebase é que a forma do diamante é evitada e a história permanece em linha reta - a maioria dos desenvolvedores adora isso!
git merge
não intercala as confirmações (mas pode parecer assim git log
). Em vez disso, git merge
mantém os dois históricos de desenvolvimento de Dan e Ed preservados intactos, como foi visto de cada ponto de vista de cada vez. git rebase
faz parecer que Dan trabalhou primeiro e Ed o seguiu. Nos dois casos (mesclagem e rebase), a árvore de arquivos resultante real é absolutamente idêntica.
Eu realmente amo esse trecho de 10 coisas que eu odeio no git (ele fornece uma breve explicação para rebase no segundo exemplo):
3. Documentação de baixa qualidade
As páginas de manual são um todo-poderoso "f *** you" 1 . Eles descrevem os comandos da perspectiva de um cientista da computação, não de um usuário. Caso em questão:
git-push – Update remote refs along with associated objects
Aqui está uma descrição para humanos:
git-push – Upload changes from your local repository into a remote repository
Atualização, outro exemplo: (obrigado cgd)
git-rebase – Forward-port local commits to the updated upstream head
Tradução:
git-rebase – Sequentially regenerate a series of commits so they can be applied directly to the head node
E então nós temos
git-merge - Join two or more development histories together
o que é uma boa descrição.
1. sem censura no original
Pessoalmente, não acho muito útil a técnica de diagramação padrão - as setas sempre parecem apontar o caminho errado para mim. (Eles geralmente apontam para o "pai" de cada confirmação, que acaba atrasando o tempo, o que é estranho).
Para explicar em palavras:
Por razões que não entendo, as ferramentas da GUI para o Git nunca fizeram muito esforço para apresentar os históricos de mesclagem de maneira mais limpa, abstraindo as mesclagens individuais. Portanto, se você quiser um "histórico limpo", precisará usar o rebase.
Lembro-me de ter lido postagens de blog de programadores que usam apenas rebase e outros que nunca usam rebase.
Vou tentar explicar isso com um exemplo de apenas palavras. Digamos que outras pessoas em seu projeto estejam trabalhando na interface do usuário e você esteja escrevendo documentação. Sem rebase, seu histórico pode ser algo como:
Write tutorial
Merge remote-tracking branch 'origin/master' into fixdocs
Bigger buttons
Drop down list
Extend README
Merge remote-tracking branch 'origin/master' into fixdocs
Make window larger
Fix a mistake in howto.md
Ou seja, mescla e a confirmação da interface do usuário no meio da confirmação da documentação.
Se você reformulou seu código para mestre em vez de mesclá-lo, seria assim:
Write tutorial
Extend README
Fix a mistake in howto.md
Bigger buttons
Drop down list
Make window larger
Todos os seus commits estão na parte superior (mais recente), seguidos pelo restante da master
ramificação.
( Aviso: sou o autor da postagem "10 coisas que odeio no Git" mencionada em outra resposta )
Embora a resposta aceita e a mais votada sejam ótimas, também acho útil tentar explicar a diferença apenas com palavras:
fundir
rebase
resumo: quando possível, o rebase é quase sempre melhor. Facilitando a reintegração ao ramo principal.
Porque? ➝ seu trabalho de recurso pode ser apresentado como um grande 'arquivo de correção' (também conhecido como diff) em relação à ramificação principal, sem a necessidade de 'explicar' vários pais: pelo menos dois, provenientes de uma mesclagem, mas provavelmente muitos mais, se houver houve várias fusões. Diferentemente das mesclagens, várias rebotes não são adicionadas. (outra grande vantagem)
A rebase do Git está mais próxima de uma mesclagem. A diferença na rebase é:
Isso significa que todas as confirmações locais são movidas para o final, depois de todas as confirmações remotas. Se você tiver um conflito de mesclagem, também precisará resolvê-lo.
Encontrei um artigo realmente interessante sobre git rebase vs merge , pensei em compartilhá-lo aqui