Os dois comandos têm o mesmo efeito ( graças à resposta de Robert Siemer por apontá-lo ).
A diferença prática ocorre ao usar um ramo local chamado de forma diferente :
git checkout -b mybranch origin/abranch
criará mybranch
e acompanharáorigin/abranch
git checkout --track origin/abranch
criará apenas ' abranch
', não um ramo com um nome diferente.
(Ou seja, como comentado por Sebastian Graf , se a filial local já não existisse.
Se existisse , você precisaria git checkout -B abranch origin/abranch
)
Nota: com o Git 2.23 (terceiro trimestre de 2019), isso usaria o novo comandogit switch
:
git switch -c <branch> --track <remote>/<branch>
Se a ramificação existir em vários controles remotos e um deles for nomeado pela checkout.defaultRemote
variável de configuração, usaremos esse para fins de desambiguação, mesmo que <branch>
não seja exclusivo em todos os controles remotos.
Configure-o como, por exemplo, checkout.defaultRemote=origin
para sempre fazer check-out de filiais remotas a partir daí, se <branch>
for ambíguo, mas existir no controle remoto 'origem'.
Aqui, ' -c
' é o novo ' -b
'.
Primeiro, alguns antecedentes: Rastrear significa que uma filial local tem seu upstream definido como uma filial remota:
# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.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
branch
(com git branch
) e acompanhe a ramificação de rastreamento remoto origin/branch
.
Quando uma ramificação local é iniciada em uma ramificação de rastreamento remoto, o Git configura a ramificação (especificamente as entradas branch.<name>.remote
e de branch.<name>.merge
configuração) para que git pull
se fundam adequadamente a partir da ramificação de rastreamento remoto.
Esse comportamento pode ser alterado através do branch.autosetupmerge
sinalizador de configuração global . Essa configuração pode ser substituído usando o --track
e --no-track
opções, e mudou mais tarde usando git branch --set-upstream-to
.
E git checkout --track origin/branch
fará o mesmo que git branch --set-upstream-to
):
# or, since 1.7.0
git branch --set-upstream upstream/branch branch
# or, since 1.8.0 (October 2012)
git branch --set-upstream-to upstream/branch branch
# the short version remains the same:
git branch -u upstream/branch branch
Também definiria o upstream para ' branch
'.
(Nota: o git1.8.0 será descontinuado git branch --set-upstream
e substituirá por git branch -u|--set-upstream-to
: consulte anúncio do git1.8.0-rc1 )
Ter uma filial upstream registrada para uma filial local:
- diga ao git para mostrar a relação entre os dois ramos em
git status
egit branch -v
.
- direciona
git pull
sem argumentos para extrair do upstream quando o novo ramo é retirado .
Consulte " Como você faz com que uma ramificação git existente rastreie uma ramificação remota? " Para obter mais informações.
git pull
que alguns galhos me permitiam , enquanto alguns pediam um galho remoto. Acontece que, se você, pela primeira vez, está verificando uma ramificação remota criada por seu colega, o git continua e adicionabranch.<BNAME>.remote=origin
ao gitconfig local. O que lhe permite emitirgit pull
. No entanto, se você é o responsável pela criação da ramificaçãogit checkout -b BNAME
, o git, é claro, não sabe. Então você deve especificar seu controle remoto.If <branch>
não foi encontrado, mas existe um ramo de rastreamento em exatamente um controle remoto (chame-o<remote>
) com um nome correspondente, trate como equivalente a$ git checkout -b <branch> --track <remote>/<branch>
"branch.autoSetupMerge
paraalways
simplesmente executar o que estamos falando. Essa configuração é padronizada comotrue
, o que significa que o rastreamento será realizado apenas ao fazer check-out de uma filial remota.true
não configura o rastreamento para ramificações criadas localmente.Não há nenhuma diferença!
1)
git checkout -b branch origin/branch
Se não
--track
e não--no-track
,--track
é assumido como padrão. O padrão pode ser alterado com a configuraçãobranch.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
implicar-b
e o argumento para-b
é adivinhado como "ramo". A suposição é conduzida pela variável de configuraçãoremote.origin.fetch
.Com efeito, 2) se comporta como
git checkout -b branch --track origin/branch
.Como você pode ver: não há diferença.
Mas fica ainda melhor:
3)
git checkout branch
também é equivalente a
git checkout -b branch --track origin/branch
se "ramificação" ainda não existir, mas "origem / ramificação" existir 1 .Todos os três comandos definem o "upstream" de "branch" como "origin / branch" (ou eles falham).
Upstream é usado como ponto de referência de argumentos sem argumentos
git status
,git push
,git merge
e assimgit pull
(se configurado como que (que é o padrão ou quase o padrão)).Por exemplo,
git status
informa a que distância você está atrás ou à frente do upstream, se um estiver configurado.git push
está configurado para enviar a filial atual a montante por padrão 2 desde o git 2.0.1 ... e se "origin" for o único controle remoto com "branch"
2, o padrão (nomeado "simple") também impõe que ambos os nomes de branch sejam iguais
fonte
O livro parece indicar que esses comandos produzem o mesmo efeito:
Isso é particularmente útil quando as conclusões do bash ou oh-my-zsh git são capazes de definir o
origin/serverfix
nome para você - basta acrescentar--track
(ou-t
) e você está a caminho.fonte
Você não pode criar uma nova ramificação com este comando
se você tiver alterações que não são preparadas.
Aqui está um exemplo:
No entanto, você pode criar facilmente uma nova ramificação com alterações não faseadas com o
git checkout -b
comando:fonte
origin/branch
)origin/new-branch
vez deorigin/branch
. Você está ciente disso?