Differenza tra git checkout --track origin / branch e git checkout -b branch origin / branch


209

Qualcuno conosce la differenza tra questi due comandi per cambiare e tenere traccia di un ramo remoto?

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

Penso che entrambi tengano traccia del ramo remoto in modo da poter inviare le mie modifiche al ramo sull'origine, giusto?

Ci sono differenze pratiche ??

Grazie!

Risposte:


282

I due comandi hanno lo stesso effetto ( grazie alla risposta di Robert Siemer per averlo sottolineato ).

La differenza pratica viene quando si utilizza un ramo locale denominato in modo diverso :

  • git checkout -b mybranch origin/abranchcreerà mybranche seguiràorigin/abranch
  • git checkout --track origin/abranchcreerà solo ' abranch', non un ramo con un nome diverso.

(Cioè, come commentato da Sebastian Graf , se la filiale locale non esistesse già. In
caso affermativo , sarebbe necessario git checkout -B abranch origin/abranch)


Nota: con Git 2.23 (3 ° trimestre 2019), si utilizza il nuovo comandogit switch :

git switch -c <branch> --track <remote>/<branch>

Se il ramo esiste in più telecomandi e uno di essi è chiamato dalla checkout.defaultRemotevariabile di configurazione, useremo quello a scopo di chiarimento delle ambiguità, anche se <branch>non è univoco in tutti i telecomandi.
Impostalo ad es. checkout.defaultRemote=originPer verificare sempre i rami remoti da lì se <branch>è ambiguo ma esiste sul telecomando 'origine'.

Qui, " -cè il nuovo -b".


Innanzitutto, alcuni retroscena: il monitoraggio indica che un ramo locale ha il suo upstream impostato su un ramo remoto:

# git config branch.<branch-name>.remote origin
# git config branch.<branch-name>.merge refs/heads/branch

git checkout -b branch origin/branch volere:

  • crea / resetta branchal punto a cui fa riferimento origin/branch.
  • crea il ramo branch(con git branch) e traccia il ramo di tracciamento remoto origin/branch.

Quando un ramo locale viene avviato da un ramo di tracciamento remoto, Git imposta il ramo (in particolare le voci di configurazione branch.<name>.remotee branch.<name>.merge) in modo che git pullsi uniscano in modo appropriato dal ramo di tracciamento remoto.
Questo comportamento può essere modificato tramite il branch.autosetupmergeflag di configurazione globale . Tale impostazione può essere sovrascritta utilizzando la --tracke --no-trackle opzioni, e ha cambiato in seguito utilizzando git branch --set-upstream-to.


E git checkout --track origin/branchfarà lo stesso di 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

Impostarebbe anche l'upstream per ' branch'.

(Nota: git1.8.0 si deprecherà git branch --set-upstreame lo sostituirà con git branch -u|--set-upstream-to: vedere git1.8.0-rc1 annunciare )


Avere una filiale a monte registrata per una filiale locale:

  • dì a git di mostrare la relazione tra i due rami in git statusegit branch -v .
  • dirige git pull senza argomenti da estrarre dall'upstream quando il nuovo ramo viene estratto .

Vedere " Come si fa a tracciare un ramo git esistente come ramo remoto? " Per ulteriori informazioni.


1
@VonC Stavo cercando quel piccolo dettaglio che ti è capitato di menzionare come informazione aggiuntiva. Nel mio caso, ero curioso di sapere perché alcuni dei miei rami me lo consentivano git pull, mentre alcuni rami avrebbero chiesto un ramo remoto da cui attingere. Si scopre che se, per la prima volta, stai verificando un ramo remoto creato dal tuo peer, git continua e si aggiunge branch.<BNAME>.remote=original gitconfig locale. Che quindi ti consente di emettere git pull. Tuttavia, se sei tu a creare il ramo git checkout -b BNAME, allora git - ovviamente - non lo sa. Quindi dovresti specificare il suo telecomando.
Batilc,

@batilc "Si scopre che se, per la prima volta, stai verificando un ramo remoto creato dal tuo peer,"; sì, leggendo git-scm.com/docs/git-checkout , vedo: " If <branch>non è stato trovato ma esiste un ramo di tracciamento esattamente in un telecomando (chiamalo <remote>) con un nome corrispondente, considera equivalente a $ git checkout -b <branch> --track <remote>/<branch>"
VonC

@VonC Ho trovato una configurazione migliore per questo. impostare per branch.autoSetupMergeeseguire alwayssemplicemente ciò di cui stiamo parlando. L'impostazione predefinita è true, il che significa che il tracciamento verrà eseguito solo quando si verifica un ramo remoto. truenon imposta il tracciamento per le filiali create localmente.
Batilc,

@batilc Sono d'accordo. Tendo a non utilizzare sempre, poiché preferisco impostare esplicitamente il tracciamento, ma nel tuo caso, dovrebbe essere l'impostazione corretta.
VonC,

1
"git branch --set-upstream-to branch upstream / branch" non è la sintassi corretta. dovrebbe essere: "git branch --set-upstream-to upstream / branch branch"
maharvey67

33

Non c'è alcuna differenza!

1) git checkout -b branch origin/branch

Se non ci sono --tracke no --no-track, --trackviene assunto come predefinito. L'impostazione predefinita può essere modificata con l'impostazione branch.autosetupmerge.

In effetti, 1) si comporta come git checkout -b branch --track origin/branch.

2) git checkout --track origin/branch

"Per praticità", --tracksenza -bimplicazioni -be l'argomento -bè indovinato come "ramo". L'ipotesi è guidata dalla variabile di configurazione remote.origin.fetch.

In effetti, 2) si comporta come git checkout -b branch --track origin/branch.

Come puoi vedere: nessuna differenza.

Ma migliora ancora:

3) git checkout branch

equivale anche a git checkout -b branch --track origin/branchse "branch" non esiste ancora, ma "origin / branch" fa 1 .


Tutti e tre i comandi impostano "upstream" di "branch" su "origin / branch" (o falliscono).

A monte viene utilizzato come punto di riferimento della discussione-meno git status, git push, git mergee quindi git pull(se configurato come quello (che è quella predefinita o quasi predefinito)).

Ad esempio git statusti dice quanto sei a monte o dietro se sei configurato.

git pushè configurato per spingere il ramo corrente a monte di default 2 da git 2.0.

1 ... e se “origine” è il “ramo” avente solo remoto
2 predefinito (chiamato “semplice”) anche impone per entrambi i nomi ramo siano uguali


5

Il libro sembra indicare che quei comandi producono lo stesso effetto:

Il semplice caso è l'esempio che hai appena visto, eseguendo git checkout -b [branch] [nome remoto] / [branch]. Se hai Git versione 1.6.2 o successive, puoi anche usare la scorciatoia --track:

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

Per impostare un ramo locale con un nome diverso rispetto al ramo remoto, è possibile utilizzare facilmente la prima versione con un nome di ramo locale diverso:

$ git checkout -b sf origin/serverfix

È particolarmente utile quando i tuoi completamenti bash o oh-my-zsh git sono in grado di estrarre il origin/serverfixnome per te - basta aggiungere --track(o -t) e sei sulla buona strada.


-1

Non è possibile creare un nuovo ramo con questo comando

git checkout --track origin/branch

se hai cambiamenti che non sono stati messi in scena.

Ecco un esempio:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/App.js

no changes added to commit (use "git add" and/or "git commit -a")

// TRY TO CREATE:

$ git checkout --track origin/new-branch
fatal: 'origin/new-branch' is not a commit and a branch 'new-branch' cannot be created from it

Tuttavia, puoi facilmente creare un nuovo ramo con modifiche non messe in scena con il git checkout -bcomando:

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js

tieni presente che entrambi i comandi nelle domande servono per tracciare un ramo remoto esistente ( origin/branch)
yorch

@Verde Il test che fai è al origin/new-branchposto di origin/branch. Ne sei a conoscenza?
Robert Siemer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.