Diferença entre o checkout git – origem / branch da agência e checkout git – b origem / ramificação do branch

Alguém sabe a diferença entre esses dois comandos para alternar e rastrear uma ramificação remota?

git checkout -b branch origin/branch git checkout --track origin/branch 

Acho que os dois acompanham o ramo remoto para que eu possa enviar minhas alterações para o branch na origem, certo?

Existe alguma diferença prática?

Obrigado!

Os dois comandos têm o mesmo efeito ( graças à resposta de Robert Siemer para apontá-lo ).

A diferença prática vem quando usando um ramo local nomeado diferentemente :

  • git checkout -b mybranch origin/abranch mybranch criará mybranch e rastreará origin/abranch
  • git checkout --track origin/abranch criará apenas ‘ abranch ‘, não um branch com um nome diferente.

(Isto é, como comentou Sebastian Graf , se o ramo local já não existia.
Se isso acontecesse, você precisaria git checkout -B abranch origin/abranch )


Primeiro, alguns antecedentes: Tracking significa que um branch local tem seu upstream definido para um branch remoto:

 # git config branch..remote origin # git config branch..merge refs/heads/branch 

git checkout -b branch origin/branch vai

  • criar / redefinir branch para o ponto referenciado por origin/branch .
  • crie a ramificação (com git branch ) e rastreie a origin/branch ramo de rastreamento remoto.

Quando uma ramificação local é iniciada em uma ramificação de controle remoto, o Git configura a ramificação (especificamente as inputs de configuração branch..remote e branch..merge ) para que git pull seja mesclado adequadamente ramo de rastreamento.
Esse comportamento pode ser alterado por meio do branch.autosetupmerge configuração branch.autosetupmerge global. Essa configuração pode ser sobrescrita usando as --track e --no-track , e alteradas posteriormente usando git branch --set-upstream-to .


E git checkout --track origin/branch fará o mesmo:

  # or, since 1.7.0 git branch --set-upstream branch upstream/branch # or, since 1.8.0 (October 2012) git branch --set-upstream-to branch upstream/branch # the short version remains the same: git branch -u branch upstream/branch 

Também configuraria o upstream para ‘ branch ‘.

(Nota: git1.8.0 irá descartar git branch --set-upstream e substituí-lo por git branch -u|--set-upstream-to : ver git1.8.0-rc1 announce )


Ter uma filial upstream registrada em uma filial local irá:

  • diga ao git para mostrar a relação entre as duas ramificações no git status git branch -v e git branch -v .
  • direciona git pull sem argumentos para puxar do upstream quando o novo branch é retirado .

Veja ” Como você faz uma ramificação git existente rastrear uma ramificação remota? ” Para mais.

Não há diferença alguma!

1) git checkout -b branch origin/branch

Se não houver --track e no --no-track , --track é assumido como padrão. O padrão pode ser alterado com a configuração branch.autosetupmerge .

Com efeito, 1) se comporta como git checkout -b branch --track origin/branch .

2) git checkout --track origin/branch

“Como uma conveniência”, – --track sem -b implica -b e o argumento para -b é considerado “branch”. A suposição é conduzida pela variável de configuração remote.origin.fetch .

Com efeito, 2) se comporta como git checkout -b branch --track origin/branch .

Como você pode ver: sem diferença.

Mas fica ainda melhor:

3) git checkout branch

também é equivalente a git checkout -b branch --track origin/branch se “branch” ainda não existir, mas “origin / branch” faz 1 .


Todos os três comandos definem o “upstream” de “branch” como “origin / branch” (ou eles falham).

Upstream é usado como ponto de referência do git status sem argumento, git push , git merge e assim git pull (se configurado assim (que é o padrão ou quase o padrão)).

Por exemplo, o git status informa o quanto está atrasado ou adiantado do upstream, se estiver configurado.

git push está configurado para empurrar a ramificação atual para o upstream por padrão 2 desde o git 2.0.

1 … e se “origem” é o único controle remoto com “branch”
2 o padrão (denominado “simples”) também impõe que ambos os nomes de filiais sejam iguais

O livro parece indicar que esses comandos produzem o mesmo efeito:

O caso simples é o exemplo que você acabou de ver, executando git checkout -b [branch] [remotename] / [branch]. Se você possui o Git versão 1.6.2 ou posterior, você também pode usar a abreviatura –track:

 $ git checkout --track origin/serverfix Branch serverfix set up to track remote branch serverfix from origin. Switched to a new branch 'serverfix' 

Para configurar uma ramificação local com um nome diferente da ramificação remota, você pode usar facilmente a primeira versão com um nome de ramificação local diferente:

 $ git checkout -b sf origin/serverfix 

Isso é particularmente útil quando suas conclusões bash ou oh-my-zsh git são capazes de puxar o nome de origin/serverfix para você – apenas append – --track (ou -t ) e você está a caminho.