Desenvolvimento

1 jun, 2012

Dica Git da semana: Pulling e Rebasing

Publicidade

A dica Git desta vez é sobre como configurar o que acontece quando você faz pull.

Pulling

Em março, escrevi sobre pushing e pulling como uma introdução para a obtenção de dados de um servidor Git remoto. Agora que já falamos sobre rebasing (duas vezes), podemos falar sobre estratégias de pull diferentes.

Lembre-se de que git fetch apenas faz as alterações disponíveis em seu repositório local; ele não afeta o (s) branch (s) em que você está. Por outro lado, git pull afeta os branches em que você está, enquanto ele tenta incluir alterações de upstream.

Por padrão, o Git tentará fazer um merge sempre que você fizer um pull nas mudanças. Aqui está a aparência de quando você faz um merge:

$ git log --oneline master
e1c1744 Third
36c3a20 Second
c66b73b First
# Take a branch from a previous point in history
$ git checkout -b feature-merge 36c3a20
Switched to a new branch 'feature-merge'
# Set it up so I can pull from master
$ git branch --set-upstream feature-merge master
Branch feature-merge set up to track local branch master.
$ git log --oneline feature-merge
36c3a20 Second
c66b73b First
# Add another file so we diverge
$ touch feature-merge.txt
$ git add feature-merge.txt
$ git commit -m "Feature-Merge"
[feature-merge a16a3db] Feature-Merge
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 feature-merge.txt
# Now, let's see what happens when we pull
$ git pull
From .
* branch master -> FETCH_HEAD
Merge made by recursive.
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 c
$ git log --oneline --graph
* 23b50a0 Merge branch 'master' into feature-merge
|\
| * e1c1744 Third
* | a16a3db Feature-Merge
|/
* 36c3a20 Second
* c66b73b First

Aqui, invocamos a operação padrão, que é fazer um merge. Quando estamos atrás do master com as alterações locais, e fazemos um pull, ele automaticamente cria um merge node, como mostrado no gráfico acima. (Normalmente, o branch seria um remoto, no entanto, eu estou mostrando um branch local rastreado, por conveniência.)

No entanto, em vez disso, ele pode ser configurado para fazer um rebase. Essa configuração é feita em uma base branch por branch. Vamos criar um novo branch para experimentar com esse recurso:

$ git checkout -b feature-rebase 36c3a20
Switched to a new branch 'feature-rebase'
$ git branch --set-upstream feature-rebase master
Branch feature-rebase set up to track local branch master.
$ git log --oneline feature-rebase
36c3a20 Second
c66b73b First
# Add another file so we diverge
$ touch feature-rebase.txt
$ git add feature-rebase.txt
$ git commit -m "Feature-Rebase"
[feature-rebase 62855ee] Feature-Rebase
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 feature-rebase.txt
$ git log --oneline
62855ee Feature-Rebase
36c3a20 Second
c66b73b First
# Configure the branch for rebase operations
$ git config branch.feature-rebase.rebase true
# Now, let's see what happens when we pull
$ git pull
From .
* branch master -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: Feature-Rebase
$ git log --oneline
* ff0ecc2 Feature-Rebase
* e1c1744 Third
* 36c3a20 Second
* c66b73b First

O que aconteceu aqui é que em vez de criar um merge nodle, a operação pull resultou em um rebase do branch subjacente contra o master atual. Isso é perigoso (no sentido de que um rebase é perigoso e muda o histórico), mas desde que você esteja fazendo isso em branches locais (aqueles que ainda não foram  para o repositório), então isso pode ser isso aceitável.

Essa configuração tem que ser feita em uma base branch por branch. Se a sua forma preferida de trabalhar é sempre habilitar essa opção, então aqui está um item de configuração que poderá ajudar:

$ git config branch.autosetuprebase always

Se isso for configurado (ou em um repositório ou globalmente com a configuração –global), então, sempre que você criar um novo branch, ele adicionará automaticamente branch.name.rebase=true para você.

?

Texto original disponível em http://alblue.bandlem.com/2011/06/git-tip-of-week-pulling-and-rebasing.html