git pull VS git busca Vs git rebase

294

Outra pergunta dita git pullé como um git fetch+ git merge.

Mas qual é a diferença entre o git pullVS git fetch+ git rebase?

Michael
fonte
2
alguém deve limpar o link ... e estou impressionado com quantos votos essa outra pergunta recebeu.
Xenoterracide
13
@xeno: Eu acho que é apenas uma contagem de quantas pessoas vão "Eu tinha essa questão também"
bobobobo
45
Algum dia eu vou encontrar tempo para realmente ler a documentação git, mas até então, eu estou adicionando meus votos a esses tipos de perguntas
Eran Medan

Respostas:

336

Deve ser bastante óbvio da sua pergunta que você realmente está apenas perguntando sobre a diferença entre git mergee git rebase.

Então, vamos supor que você esteja no caso comum - você fez algum trabalho em sua ramificação principal e extraiu da origem, que também fez algum trabalho. Após a busca, as coisas ficam assim:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

Se você mesclar neste momento (o comportamento padrão do git pull), supondo que não haja conflitos, você termina com isso:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

Se, por outro lado, você fez a rebase apropriada, você terminaria com isso:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

O conteúdo da sua árvore de trabalho deve terminar o mesmo nos dois casos; você acabou de criar uma história diferente que antecede a ela . A reescrita reescreve seu histórico, fazendo parecer que você havia confirmado no topo da nova ramificação principal da origem ( R), em vez de onde você originalmente confirmou ( H). Você nunca deve usar a abordagem de rebase se outra pessoa já tiver saído de sua ramificação principal.

Por fim, observe que você pode realmente configurar git pulluma ramificação para usar rebase em vez de mesclar, definindo o parâmetro config branch.<name>.rebasecomo true. Você também pode fazer isso para uma única puxada usando git pull --rebase.

Cascabel
fonte
39
O que acontece se você se recuperasse depois que alguém já havia saído de seu ramo mestre? Isso quebraria o repo?
Didier A.
12
Como você sabe se alguém saiu do seu ramo principal?
Frank
29
Se você não tem certeza de que alguém não tem , deve assumir que sim .
21713 Chris Down
4
Eu só estava pensando que, a menos que você também faça alterações em algum lugar que não seja origem / mestre, nunca vejo o problema de alguém ter feito as alterações em questão, porque se você já havia pressionado essas alterações para a origem / mestre, não haveria nada para refazer em primeiro lugar. Parece-me que o aviso realmente importa apenas nos casos em que você tem algo mais complexo que X -> origin / X, mas posso estar errado. Se alguém souber de um cenário que estou ignorando, compartilhe.
neverfox 26/06
1
@SteveChambers Não, esse não é o resultado. As linhas representam simplesmente a ancestralidade de confirmação, ou seja, A é o pai de B. Não há nenhuma implicação sobre se Q ou B foi a primeira vez. Todas essas operações são baseadas em gráficos de confirmação, não em tempo. Rebase simplesmente transplanta algumas confirmações, com o resultado, como mostrei, independentemente de quais sejam os carimbos de data / hora de confirmação.
Cascabel
9

TLDR:

git pullé como correr git fetchentão git merge
git pull --rebaseé como git fetchentãogit rebase

Em resposta à sua primeira declaração,

git pullé como um git fetch+ git merge.

"No modo padrão, git pull é uma abreviação para git fetchseguido por git mergeFETCH_HEAD" Mais precisamente, git pullé executado git fetchcom os parâmetros fornecidos e depois chamagit merge para mesclar as cabeças de ramificação recuperadas na ramificação atual "

(Ref: https://git-scm.com/docs/git-pull )


Para sua segunda declaração / pergunta:

'Mas qual é a diferença entre git pullVS git fetch+git rebase '

Novamente, da mesma fonte:
git pull --rebase

"Com --rebase, ele executa git rebase em vez de git merge."


Agora, se você quiser perguntar

'a diferença entre mergee rebase'

isso também é respondido aqui:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(a diferença entre alterar a maneira como o histórico da versão é registrado)

harshvchawla
fonte
2
Eu gostaria de mencionar que "git pull --rebase" é como "git fetch e git rebase" na maioria das vezes - mas nem sempre. Em algumas situações, "git pull --rebase" faz um pouco mais. Veja este exemplo, muitas vezes referenciada aqui: gitolite.com/git-pull--rebase
Daniel K.
1
Muito obrigado pela sua resposta. Eu realmente entendo como os git fetch + git rebasecomandos funcionam a partir de agora. Não há mais ou menos conflito em nossa árvore git a partir de agora :)
Travis Le