Neste exemplo, temos um repositório com uma branch principal main contendo um ficheiro de base fichier1.txt e um primeiro commit inicial. A partir de main, criamos duas branches, branche1 e branche2, cada uma destinada a testar respetivamente rebase e merge. Depois, duas branches de trabalho adicionais são criadas, branche-rebase a partir de branche1 e branche-merge a partir de branche2, para lhes acrescentar modificações.
O projeto começa com um repositório contendo um único commit em main, correspondente à criação do ficheiro fichier1.txt:
(main)
A # Commit inicial com fichier1.txtNo commit A, acrescentámos o ficheiro fichier1.txt com conteúdo inicial.
Depois, duas novas branches são criadas a partir de main:
branche1: destinada a acolher branche-rebase para testar git rebase.branche2: destinada a acolher branche-merge para testar git merge.Em cada branch de trabalho (branche-rebase e branche-merge), fazemos três commits distintos. Eis os commits em detalhe para cada branch:
(main)
A
(branche-rebase)
\
D---E---F # Commits acrescentados em branche-rebase
(branche-merge)
\
G---H---I # Commits acrescentados em branche-mergeCommits em branche-rebase:
fichier-2-rebase.txt com o conteúdo inicial "Modification 1 dans branche-rebase".fichier-2-rebase.txt.fichier-2-rebase.txt.Commits em branche-merge:
fichier-2-merge.txt com o conteúdo inicial "Modification 1 dans branche-merge".fichier-2-merge.txt.fichier-2-merge.txt.Estes commits acrescentam conteúdo idêntico, mas em ficheiros diferentes (fichier-2-rebase.txt e fichier-2-merge.txt), para permitir uma comparação clara entre merge e rebase.
branche-merge em branche2 com git mergePara integrar as modificações de branche-merge em branche2, usamos o comando git merge em branche2. Esta operação cria um commit de fusão que conserva um histórico completo e inclui os commits da branch de trabalho sem os reorganizar.
O histórico depois do merge:
(branche2)
A-------J # J é o commit de fusão
\ |
\ |
G---H---I # branche-merge conserva o seu histórico distintobranche2 com as modificações de branche-merge (G, H, I) sem as deslocar nem modificar a ordem.git merge, o histórico mostra um « ponto de junção » que indica visualmente onde branche-merge foi fundida em branche2. Isto conserva um histórico completo e distinto para cada branch, o que é muitas vezes útil em projetos colaborativos.branche-rebase em branche1 com git rebasePara integrar as modificações de branche-rebase em branche1, usamos o comando git rebase. Ao contrário do merge, o rebase reposiciona os commits (D, E, F) de branche-rebase como se tivessem sido criados depois do último commit de branche1 (A).
O histórico depois do rebase:
(branche1)
A---D'---E'---F' # Commits de branche-rebase reaplicados no fim de branche1branche-rebase aplicados linearmente a seguir a A em branche1.git rebase, os commits de branche-rebase são reorganizados para formar um histórico linear sem « ponto de junção », como se tivessem sido acrescentados diretamente depois do commit inicial A. Isto simplifica o histórico tornando-o mais limpo, mas pode mascarar o caminho das branches de trabalho iniciais.As diferenças observadas nos logs Git permitem compreender melhor os usos específicos de merge e rebase.
git merge:
git rebase:
| Comando | Histórico | Caso de utilização ideal |
|---|---|---|
git merge | Histórico completo com ponto de junção | Projetos colaborativos com várias branches |
git rebase | Histórico linear sem pontos de junção | Limpeza do histórico antes de um merge partilhado |
Em resumo:
git merge -> Histórico completo com commit de fusão
git rebase -> Histórico linear sem commit de fusãoEste guia permite-lhe compreender e visualizar as diferenças entre git merge e git rebase, e escolher o método mais adequado em função do contexto do projeto.