Pergunta

Então, se eu estou usando galhos que são remotas (monitorado) filiais, e eu quero começar o mais recente, ainda estou claro se eu deveria estar fazendo git pull ou git rebase. Eu pensei que eu tinha lido que fazer git rebase quando se trabalha em um ramo com outros usuários, o produto pode estragar-los quando eles puxar ou rebase. Isso é verdade? Devemos todos estar usando git pull?

Foi útil?

Solução

git pull é uma combinação de 2 comandos

  • git fetch (sincroniza o seu repo local com o mais novo material no controle remoto)
  • merge git (mescla as alterações do ramo distante, se houver, em seu ramo de rastreamento local)

rebase git é apenas uma equivalente aproximado a fusão git. Ele não buscar qualquer coisa remotamente. Na verdade ele não faz uma fusão adequada seja, ele repete os commits do ramo que você está em pé após os novos commits de um segundo ramo.

Sua finalidade é principalmente para deixá-lo ter um histórico limpo. Ele não leva muitas fusões por muitas pessoas antes que a história passada em gitk fica terrivelmente spaghetti-like.

A melhor explicação gráfica pode ser visto nos primeiros 2 ilustrações aqui . Mas deixe-me explicar aqui com um exemplo.

Eu tenho 2 ramos: master e mybranch. Quando em pé na mybranch eu posso correr

git rebase master

e eu vou conseguir nada de novo em master inserido diante dos meus commits mais recentes na mybranch. Isto é perfeito, porque se eu agora fundir ou rebase o material de mybranch em master, meus novos commits são adicionados linearmente logo após os commits mais recentes.

O problema que você se refere acontece se eu rebase na direção "errada". Se eu só tenho o mestre mais recente (com novas alterações) e do mestre I rebase assim (antes de sincronizar meu ramo):

git rebase mybranch

Agora, o que eu fiz é que eu inserido meu novo mudanças em algum lugar no passado de mestre. A principal linha de commits mudou. E devido à forma como os trabalhos git com comprometer ids, todos os commits (de mestre) que foram apenas repetidos sobre minhas novas alterações a ter novas identificações.

Bem, é um pouco difícil de explicar apenas em palavras ... Espero que isso faz um pouco de sentido: -)

De qualquer forma, o meu próprio fluxo de trabalho é o seguinte:

  • 'git pull' novas mudanças a partir remoto
  • para mybranch
  • 'mestre git rebase' para trazer novas alterações de mestrado em meu histórico de commits
  • interruptor de volta ao mestre
  • 'mybranch merge git', que só fast-forwards quando tudo em mestre também está em mybranch (evitando assim o problema cometer reordenação em uma filial público)
  • 'git push'

Uma última palavra. Eu recomendo fortemente utilizando rebase quando as diferenças são triviais (por exemplo, pessoas que trabalham em diferentes arquivos ou pelo menos linhas diferentes). Ele tem a pegadinha Tentei explicar lá apenas para cima, mas faz para uma história mais limpa muito.

(algo por exemplo, um colega de trabalho foi renomeado em um monte de arquivos) Assim que pode haver conflitos significativos, eu recomendo fortemente mesclagem. Neste caso, você será solicitado para resolver o conflito e depois comprometer a resolução. No lado positivo, uma mesclagem é muito mais fácil de resolver quando há conflitos. O lado negativo é que sua história pode tornar-se difícil de seguir se um monte de gente que funde o tempo todo: -)

Boa sorte!

Outras dicas

Git rebase é uma reescrita da história.Você nunca deve fazer isso em filiais que sejam “públicas” (ou seja, filiais que você compartilha com outras pessoas).Se alguém clonar seu branch e você fizer o rebase desse branch - então eles não poderão mais extrair/mesclar alterações de seu branch - eles terão que jogar fora o antigo e puxar novamente.

Este artigo sobre software de empacotamento com git é uma leitura que vale muito a pena.É mais sobre como gerenciar distribuições de software, mas é bastante técnico e fala sobre como as ramificações podem ser usadas/gerenciadas/compartilhadas.Eles falam sobre quando rebase e quando puxar e quais são as diversas consequências de cada um.

Resumindo, ambos têm o seu lugar, mas você precisa realmente grocar a diferença.

git pull faz uma mesclagem se você tiver commits que não estão na ramificação remota. git rebase reescreve quaisquer commits existentes que você precisa estar em relação à ponta da ramificação remota.Eles são semelhantes no sentido de que ambos podem causar conflitos, mas acho que usar git rebase se você puder, permite uma colaboração mais tranquila.Durante a operação de rebase você pode refinar seus commits para que pareçam ter sido aplicados recentemente à última revisão do branch remoto.Uma mesclagem talvez seja mais apropriada para ciclos de desenvolvimento mais longos em uma ramificação com mais histórico.

Como a maioria das outras coisas no git, há muitas funcionalidades sobrepostas para acomodar diferentes estilos de trabalho.

Confira os excelentes Gitcasts em Ramificação e fusão assim como rebase.

Se você deseja extrair o código-fonte sem afetar as ramificações remotas e sem nenhuma alteração na sua cópia local, é melhor usar git pull.

Eu acredito que se você tiver um branch funcional no qual você fez alterações, use git rebase para alterar a base desse branch para o master remoto mais recente, você manterá todas as alterações do seu branch, porém o branch agora será ramificado do master local, em vez de onde foi anteriormente ramificado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top