No git, como a busca é diferente de pull e como a mesclagem é diferente de rebase?
160
Eu simplesmente não consigo entender isso. Eu tenho lido muito na web e livros e algo simplesmente não fica na minha cabeça. Alguém pode me dar a versão fictícia do seguinte:
Eu simpatizo com o interlocutor. A documentação e os conselhos são tão pesados e as permutações possíveis do fluxo de trabalho são tão grandes que a pessoa fica extremamente confusa. A cabeça explodiu e não se sabe o que perguntar, simplesmente não é tão óbvio.
Ed Randall
3
Por que não escolher a resposta pestrella como aceita?
Arashsoft
@Arashsoft porque ele não é visto desde 2013
VdeX 22/09
Respostas:
415
buscar vs puxar
fetch fará o download de quaisquer alterações do branch * remoto, atualizando os dados do repositório, mas mantendo o branch * local inalterado.
pullrealizará fetche, adicionalmente, mergeas alterações em sua filial local.
Qual é a diferença? pullatualiza a ramificação local com as alterações da ramificação puxada. A fetchnão avança sua filial local.
mesclar vs rebase
Dada a seguinte história:
C --- D --- E local
/
Controle remoto A --- B --- F --- G
mergeune duas histórias de desenvolvimento. Isso é feito repetindo as alterações que ocorreram na sua filial local após divergir na parte superior da ramificação remota e registra o resultado em uma nova confirmação. Esta operação preserva a ascendência de cada confirmação.
O efeito de a mergeserá:
C --- D --- E local
/ \
Controle remoto A --- B --- F --- G --- H
rebasereceberá confirmações existentes na sua filial local e as aplicará novamente na ramificação remota. Esta operação reescreve os ancestrais de suas confirmações locais.
O efeito de a rebaseserá:
C '- D' - E 'local
/
Controle remoto A --- B --- F --- G
Qual é a diferença? A mergenão altera a ascendência de confirmações. A rebase
reescreve a ancestralidade de seus commits locais.
*Esta explicação assume que o ramo atual é um ramo local, e que o ramo especificado como o argumento para fetch, pull, mergeou rebaseé uma filial remota. Este é o caso usual. pull, por exemplo, fará o download de quaisquer alterações da ramificação especificada , atualizará seu repositório e mergeas alterações na ramificação atual .
Essa é de longe a explicação mais simples e melhor, sem entrar no debate por trás de cada prática. Obrigado!
Jonathan S. Fisher
3
Resposta absolutamente dourada
ChaseMoskal
5
Gostaria de poder "favorito" esta resposta. Talvez eu apenas imprima e cole na minha parede.
Larsh
2
Eu diria que a melhor das melhores respostas que tenho no stackoverflow, Obrigado
Shahab J
1
Se a busca apenas baixa as alterações da ramificação remota e atualiza os dados do repositório, mas deixa a ramificação local inalterada, qual é o sentido de buscar se o diretório de trabalho não mostra / reflete as alterações? Minha pergunta originalmente era: como eu poderia ver as alterações que alguém fez e depois decidir se gostaria de mesclá-las no meu diretório de trabalho (por exemplo, experimente as alterações de outras pessoas para garantir que isso não interrompa meu trabalho), mas ainda estou confuso como fazer isso? Devo apenas fazer um pul e experimentar / explorar, e se foi problemático, faço uma redefinição definitiva?
28
Fetch vs Pull
A busca Git apenas atualiza seus dados de repo, mas uma atração git basicamente realiza uma busca e mescla a ramificação retirada
A mesclagem reúne duas linhas de desenvolvimento, preservando a ancestralidade de cada histórico de consolidação.
Por outro lado, o rebasing unifica as linhas de desenvolvimento reescrevendo as alterações da ramificação de origem para que elas apareçam como filhos da ramificação de destino - efetivamente fingindo que essas confirmações foram gravadas na ramificação de destino o tempo todo.
Além disso, confira o Learn Git Branching , que é um bom jogo que acaba de ser postado no HackerNews ( link para postagem ) e ensina muitos truques de ramificação e fusão. Eu acredito que será muito útil neste assunto.
obrigado Felips .. então, se eu fizer uma busca em um controle remoto, minha ramificação principal não terá as atualizações? Também parece que eu deveria fazer rebase mais de merga
techsjs2013
rebase vs merge depende de qual é sua intenção, tendo em mente que rebase reescreve todo o histórico de confirmações. E sim, se você só buscar, o branch master não será alterado, você terá que mesclar (ou pull) para ele para aplicar as alterações remotas
Felipe Sabino
git merge <remote>/<branch>. por exemplo, se você é o ramo principal e seu controle remoto é nomeado origem, você pode fazê-lo git merge origin/master.
Felipe Sabino
por isso soa como eu deve sempre fazer um mestre git checkout git fetch git mestre origem origem diff / master git rebase
techsjs2013
8
pull vs buscar :
A maneira como eu entendo isso é que git pullé simplesmente um git fetchseguido por git merge. Ou seja, você busca as alterações em uma ramificação remota e as mescla na ramificação atual.
mesclar vs rebase :
Uma mesclagem fará como o comando diz; mesclar as diferenças entre a ramificação atual e a ramificada especificada (na ramificação atual). Ou seja, o comando git merge another_branchserá mesclado another_branchno ramo atual.
Um rebase funciona de maneira um pouco diferente e é bem legal. Digamos que você execute o comando git rebase another_branch. O Git encontrará primeiro a versão comum mais recente entre a ramificação atual e another_branch. Ou seja, o ponto antes dos galhos divergirem. Então o git moverá esse ponto divergente para a cabeça do another_branch. Finalmente, todas as confirmações no ramo atual desde o ponto divergente original são reproduzidas a partir do novo ponto divergente. Isso cria um histórico muito limpo, com menos ramificações e mesclagens.
No entanto, não é sem armadilhas! Como o histórico da versão é "reescrito", você deve fazer isso apenas se as confirmações existirem no seu repositório git local. Ou seja: nunca faça isso se você tiver enviado as confirmações para um repositório remoto.
A explicação sobre rebaseamento apresentada neste livro on - line é bastante boa, com ilustrações fáceis de entender.
puxe com rebasing em vez de mesclar
Na verdade, estou usando bastante o rebase, mas geralmente ele é combinado com o pull:
git pull --rebase
buscará alterações remotas e depois será reorganizada em vez de mesclada. Ou seja, ele reproduzirá todos os seus commit locais desde a última vez que você executou um pull. Acho isso muito mais limpo do que fazer um puxão normal com a mesclagem, o que criará um commit extra com as mesclagens.
por isso, se estou trabalhando e ramifico e quero mesclá-lo de volta ao mestre antes de fazer um push. Devo fazer o checkout master e obter a correção de rebase?
techsjs2013
Eu ainda não entendo stand mesclar vs rebase
techsjs2013
Penso que as ilustrações fornecidas pela resposta de Pestrella mostram a diferença claramente. Além disso, confira: git-scm.com/book/en/Git-Branching-Rebasing - que faz um trabalho bastante decente de explicá-lo (mesmo link que o da resposta, mas dado novamente pelos preguiçosos).
Steinar
0
Mesclar - o ramo HEAD gerará uma nova confirmação, preservando a ancestralidade de cada histórico de confirmação. O histórico pode ficar poluído se as confirmações de mesclagem forem feitas por várias pessoas que trabalham na mesma ramificação em paralelo.
Rebase - reescreve as alterações de uma ramificação em outra sem criar uma nova confirmação. O histórico do código é simplificado, linear e legível, mas não funciona com solicitações pull, porque você não pode ver as pequenas alterações feitas por alguém.
Eu usaria git mergeao lidar com o fluxo de trabalho baseado em recursos ou se não estiver familiarizado com a rebase. Mas, se eu quero uma história git rebasemais linear e limpa, é mais apropriado. Para mais detalhes, verifique este artigo de mesclagem ou rebase .
Respostas:
buscar vs puxar
fetch
fará o download de quaisquer alterações do branch * remoto, atualizando os dados do repositório, mas mantendo o branch * local inalterado.pull
realizaráfetch
e, adicionalmente,merge
as alterações em sua filial local.Qual é a diferença?
pull
atualiza a ramificação local com as alterações da ramificação puxada. Afetch
não avança sua filial local.mesclar vs rebase
Dada a seguinte história:
merge
une duas histórias de desenvolvimento. Isso é feito repetindo as alterações que ocorreram na sua filial local após divergir na parte superior da ramificação remota e registra o resultado em uma nova confirmação. Esta operação preserva a ascendência de cada confirmação.O efeito de a
merge
será:rebase
receberá confirmações existentes na sua filial local e as aplicará novamente na ramificação remota. Esta operação reescreve os ancestrais de suas confirmações locais.O efeito de a
rebase
será:Qual é a diferença? A
merge
não altera a ascendência de confirmações. Arebase
reescreve a ancestralidade de seus commits locais.*
Esta explicação assume que o ramo atual é um ramo local, e que o ramo especificado como o argumento parafetch
,pull
,merge
ourebase
é uma filial remota. Este é o caso usual.pull
, por exemplo, fará o download de quaisquer alterações da ramificação especificada , atualizará seu repositório emerge
as alterações na ramificação atual .fonte
Fetch vs Pull
A busca Git apenas atualiza seus dados de repo, mas uma atração git basicamente realiza uma busca e mescla a ramificação retirada
Qual é a diferença entre 'git pull' e 'git fetch'?
Merge vs Rebase
Atlassian SourceTree Blog, Mesclar ou Rebase :
Além disso, confira o Learn Git Branching , que é um bom jogo que acaba de ser postado no HackerNews ( link para postagem ) e ensina muitos truques de ramificação e fusão. Eu acredito que será muito útil neste assunto.
fonte
git merge <remote>/<branch>
. por exemplo, se você é o ramo principal e seu controle remoto é nomeado origem, você pode fazê-logit merge origin/master
.pull vs buscar :
A maneira como eu entendo isso é que
git pull
é simplesmente umgit fetch
seguido porgit merge
. Ou seja, você busca as alterações em uma ramificação remota e as mescla na ramificação atual.mesclar vs rebase :
Uma mesclagem fará como o comando diz; mesclar as diferenças entre a ramificação atual e a ramificada especificada (na ramificação atual). Ou seja, o comando
git merge another_branch
será mescladoanother_branch
no ramo atual.Um rebase funciona de maneira um pouco diferente e é bem legal. Digamos que você execute o comando
git rebase another_branch
. O Git encontrará primeiro a versão comum mais recente entre a ramificação atual eanother_branch
. Ou seja, o ponto antes dos galhos divergirem. Então o git moverá esse ponto divergente para a cabeça doanother_branch
. Finalmente, todas as confirmações no ramo atual desde o ponto divergente original são reproduzidas a partir do novo ponto divergente. Isso cria um histórico muito limpo, com menos ramificações e mesclagens.No entanto, não é sem armadilhas! Como o histórico da versão é "reescrito", você deve fazer isso apenas se as confirmações existirem no seu repositório git local. Ou seja: nunca faça isso se você tiver enviado as confirmações para um repositório remoto.
A explicação sobre rebaseamento apresentada neste livro on - line é bastante boa, com ilustrações fáceis de entender.
puxe com rebasing em vez de mesclar
Na verdade, estou usando bastante o rebase, mas geralmente ele é combinado com o pull:
buscará alterações remotas e depois será reorganizada em vez de mesclada. Ou seja, ele reproduzirá todos os seus commit locais desde a última vez que você executou um pull. Acho isso muito mais limpo do que fazer um puxão normal com a mesclagem, o que criará um commit extra com as mesclagens.
fonte
Mesclar - o ramo HEAD gerará uma nova confirmação, preservando a ancestralidade de cada histórico de confirmação. O histórico pode ficar poluído se as confirmações de mesclagem forem feitas por várias pessoas que trabalham na mesma ramificação em paralelo.
Rebase - reescreve as alterações de uma ramificação em outra sem criar uma nova confirmação. O histórico do código é simplificado, linear e legível, mas não funciona com solicitações pull, porque você não pode ver as pequenas alterações feitas por alguém.
Eu usaria
git merge
ao lidar com o fluxo de trabalho baseado em recursos ou se não estiver familiarizado com a rebase. Mas, se eu quero uma históriagit rebase
mais linear e limpa, é mais apropriado. Para mais detalhes, verifique este artigo de mesclagem ou rebase .fonte