Git

Tutorial Git Rebase

Tutorial Git Rebase

Iniciantes em Git são alertados contra o comando rebase. E com razão. Com todas as coisas novas a aprender, é melhor para os iniciantes dominarem os conceitos básicos antes de mergulhar nas complexidades da rebase. No entanto, se você entende os fundamentos da fusão de branches, saber como rebase pode ajudá-lo a resolver alguns quebra-cabeças de desenvolvimento complicados quando chegar a hora certa.

Git Rebase: Definições

De acordo com a documentação do git, o comando rebase irá reaplicar os commits em cima de outra dica base. Esta definição pode ser um pouco assustadora. É mais fácil explicar o rebase como um procedimento que adiciona as mudanças do branch atual ao final de outro branch. Vamos examinar um exemplo para ter uma ideia melhor do que acontece.

Exemplo de Rebasing Git

Neste exemplo, vamos primeiro criar um caso de teste com ramificação 'master' e 'feature'. Em seguida, faremos uma fusão padrão. A seguir, recriaremos o caso de teste e realizaremos rebase e mesclagem.

1. Criação de ramificações mestre e de recurso

Aqui está o cenário que criaremos:

A - B - C (mestre) \ E - F (recurso) 

No exemplo acima, estamos seguindo o seguinte caminho:

  1. Compromisso A: adicionamos um.arquivo txt no branch 'master'
  1. Compromisso B: adicionamos b.arquivo txt no branch 'master'
  1. Neste estágio, criamos o 'recurso' de ramificação, o que significa que terá um.txt e b.TXT
  1. Confirmar C: adicionamos c.arquivo txt no branch 'master'
  1. Vamos para o ramo 'recurso'
  1. Compromisso E: nós modificamos um.txt no ramo 'feature'
  1. Compromisso F: nós modificamos b.txt no ramo 'feature'

Você pode criar uma pasta e executar o seguinte código dentro da pasta para criar a situação acima:

git init touch a.txt git add -A git commit -m "Commit A: adicionou um.txt "toque b.txt git add -A git commit -m "Commit B: adicionado b.txt "recurso de branch git toque c.txt git add -A git commit -m "Commit C: adicionado c.txt "git status git checkout feature echo aaa> a.txt git add -A git commit -m "Commit E: modificado a.txt "echo bbb> b.txt git add -A git commit -m "Commit F: modificado b.TXT" 

2. Mesclagem Simples

Vamos usar o comando log para verificar os dois ramos.

Resultados para 'mestre':

$ git checkout master Trocado para branch 'master' $ git log --oneline 2bbde47 Commit C: adicionado c.txt b430ab5 Commit B: adicionado b.txt 6f30e95 Commit A: adicionou um.txt $ ls a.txt b.txt c.TXT 

Resultados para 'recurso':

$ git checkout feature alterado para branch 'feature' $ git log --oneline 0286690 Commit F: modificado b.txt 7c5c85e Commit E: modificado a.txt b430ab5 Commit B: adicionado b.txt 6f30e95 Commit A: adicionou um.txt $ ls a.txt b.TXT 

Observe como o branch de recurso não tem o Commit C

Agora vamos executar mesclar branch 'feature' com branch 'master'. Você será solicitado a inserir um comentário. No comentário, adicione “Commit G:” no início para facilitar o rastreamento.

$ git checkout master Trocado para branch 'master' $ git merge feature Mesclagem feita pela estratégia 'recursiva'. uma.txt | 1 + b.txt | 1 + 2 arquivos alterados, 2 inserções (+) 

Resultados para 'mestre':

 $ git checkout master Já em 'master' $ git log --oneline d086ff9 Commit G: Merge branch 'feature' 0286690 Commit F: modificado b.txt 7c5c85e Commit E: modificado a.txt 2bbde47 Commit C: adicionado c.txt b430ab5 Commit B: adicionado b.txt 6f30e95 Commit A: adicionou um.txt $ ls a.txt b.txt c.TXT 

Resultados para 'recurso':

$ git checkout feature alterado para branch 'feature' $ git log --oneline 0286690 Commit F: modificado b.txt 7c5c85e Commit E: modificado a.txt b430ab5 Commit B: adicionado b.txt 6f30e95 Commit A: adicionou um.txt $ ls a.txt b.TXT 

No branch 'master', você notará que há um novo commit G que juntou as mudanças do branch 'feature'. Basicamente, a seguinte ação ocorreu:

A - B - C - G (mestre) \ / E - F (recurso) 

No Commit G, todas as alterações do branch 'feature' foram trazidas para o branch master. Mas o branch 'feature' em si permaneceu intocado devido ao processo de mesclagem. Observe o hash de cada commit. Após a fusão, o commit E (7c5c85e) e F (0286690) tem o mesmo hash no branch 'feature' e 'master'.


3. Mesclando com Rebasing

Vamos repetir o passo 1 para criar os branches 'master' e 'feature' novamente.

Resultados para 'mestre':

$ git checkout master Trocado para branch 'master' $ git log --oneline 7f573d8 Commit C: adicionado c.txt 795da3c Commit B: adicionado b.txt 0f4ed5b Commit A: adicionou um.txt $ ls a.txt b.txt c.TXT 

Resultados para 'recurso':

$ git checkout feature alterado para branch 'feature' $ git log --oneline 8ed0c4e Commit F: modificado b.txt 6e12b57 Commit E: modificado a.txt 795da3c Commit B: adicionado b.txt 0f4ed5b Commit A: adicionou um.txt $ ls a.txt b.TXT 

Vamos fazer o rebase do branch 'feature'.

$ git checkout feature Mudou para branch 'feature' $ git rebase master Primeiro, rebobinando a cabeça para repetir seu trabalho em cima dele ... Aplicando: Commit E: modificado a.txt Aplicando: Commit F: modificado b.TXT 

Em seguida, mesclar 'recurso' em 'mestre'.

$ git checkout master Trocado para branch 'master' $ git merge feature Atualizando 7f573d8… 9efa1a3 Fast-forward a.txt | 1 + b.txt | 1 + 2 arquivos alterados, 2 inserções (+) 

Resultados para o branch 'master':

$ git checkout master Já em 'master' $ git log --oneline 9efa1a3 Commit F: modificado b.txt 8710174 Commit E: modificado a.txt 7f573d8 Commit C: adicionado c.txt 795da3c Commit B: adicionado b.txt 0f4ed5b Commit A: adicionou um.txt $ ls a.txt b.txt c.TXT 

Resultados para o branch 'feature':

$ git checkout feature alterado para branch 'feature' $ git log --oneline 9efa1a3 Commit F: modificado b.txt 8710174 Commit E: modificado a.txt 7f573d8 Commit C: adicionado c.txt 795da3c Commit B: adicionado b.txt 0f4ed5b Commit A: adicionou um.txt $ ls a.txt b.txt c.TXT 

Observe que após o rebase e mesclagem os dois ramos são os mesmos. Além disso, os hashes para E e F mudaram em ambos os ramos. Basicamente, no cenário de rebase, aconteceu o seguinte:

A - B - C \ E '- F' (recurso, mestre) 

É por isso que não há nenhum novo commit. Os commits E e F foram recalculados e travados no final do branch 'master'.

Rebasing é uma ferramenta útil quando você deseja limpar o histórico do seu trabalho. No entanto, existe um perigo que deu origem à regra de ouro.


Regra de ouro de rebasing

A regra de ouro do rebase é:

Nunca rebase uma agência pública.

Como você pode ver no exemplo acima, rebasing recalcula os commits. Quando várias pessoas estão ramificando de um repositório público, o rebasing pode criar situações em que os desenvolvedores que criaram novos branches irão se deparar com situações de mesclagem muito complicadas. Portanto, é uma boa ideia nunca realocar ramos públicos que são compartilhados.

Em conclusão:

Rebasing é um recurso único do Git. Mas use com cuidado.

Mais Informações:

Aqui estão alguns links para um estudo mais aprofundado:

Documentação Git Rebase
Atlassian Merging vs Rebasing

Referências:

Top 5 cartas de captura de jogos
Todos nós vimos e amamos streaming de jogos no YouTube. PewDiePie, Jakesepticye e Markiplier são apenas alguns dos melhores jogadores que ganharam mil...
Como desenvolver um jogo no Linux
Uma década atrás, poucos usuários de Linux preveriam que seu sistema operacional favorito um dia seria uma plataforma de jogos popular para videogames...
Portas de código aberto para motores de jogos comerciais
Recriações gratuitas, de código aberto e de mecanismo de jogo de plataforma cruzada podem ser usadas para jogar jogos antigos, bem como alguns dos tít...