Différence entre git checkout --track origin / branch et git checkout -b branch origin / branch

209

Quelqu'un connaît-il la différence entre ces deux commandes pour commuter et suivre une branche distante?

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

Je pense que les deux gardent une trace de la branche distante afin que je puisse pousser mes modifications à la branche d'origine, non?

Y a-t-il des différences pratiques ??

Merci!

yorch
la source

Réponses:

282

Les deux commandes ont le même effet ( merci à la réponse de Robert Siemer de l'avoir signalé ).

La différence pratique survient lorsque vous utilisez une branche locale nommée différemment :

  • git checkout -b mybranch origin/abranchva créer mybranchet suivreorigin/abranch
  • git checkout --track origin/abranchne créera que ' abranch', pas une branche avec un nom différent.

(C'est, comme commenté par Sebastian Graf , si la branche locale ne pas existait déjà.
Si elle l'a fait, vous auriez besoin git checkout -B abranch origin/abranch)


Remarque: avec Git 2.23 (Q3 2019), cela utiliserait la nouvelle commandegit switch :

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

Si la branche existe dans plusieurs télécommandes et que l'une d'entre elles est nommée par la checkout.defaultRemotevariable de configuration, nous l'utiliserons à des fins de désambiguïsation, même si la <branch>n'est pas unique sur toutes les télécommandes.
Réglez-le par exemple checkout.defaultRemote=originpour toujours extraire les branches distantes de là si elles <branch>sont ambiguës mais existent sur la télécommande «d'origine».

Ici, ' -c' est le nouveau ' -b'.


Tout d'abord, quelques informations de base: le suivi signifie qu'une branche locale a son ensemble amont défini sur une branche distante:

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

git checkout -b branch origin/branch volonté:

  • créer / réinitialiser branchau point référencé par origin/branch.
  • créer la branche branch(avec git branch) et suivre la branche de suivi à distance origin/branch.

Lorsqu'une branche locale est démarrée à partir d'une branche de suivi à distance, Git configure la branche (en particulier les entrées de configuration branch.<name>.remoteet branch.<name>.merge) de manière à git pullfusionner de manière appropriée à partir de la branche de suivi à distance.
Ce comportement peut être modifié via l' branch.autosetupmergeindicateur de configuration globale . Ce paramètre peut être remplacé en utilisant les --tracket les --no-trackoptions, et changé par la suite en utilisant git branch --set-upstream-to.


Et git checkout --track origin/branchfera de même 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

Cela définirait également l'amont pour ' branch'.

(Remarque: git1.8.0 le dépréciera git branch --set-upstreamet le remplacera par git branch -u|--set-upstream-to: voir git1.8.0-rc1 annonce )


L'enregistrement d'une succursale en amont pour une succursale locale:

  • dire à git de montrer la relation entre les deux branches dans git statusetgit branch -v .
  • ordonne git pull sans arguments de tirer de l'amont lorsque la nouvelle branche est extraite .

Voir " Comment faire pour qu'une branche git existante suive une branche distante? " Pour en savoir plus.

VonC
la source
1
@VonC Je cherchais ce petit détail que vous aviez justement mentionné comme information supplémentaire. Dans mon cas, j'étais curieux de savoir pourquoi certaines de mes succursales me le permettaient git pull, alors que certaines succursales demandaient qu'une succursale distante soit utilisée. Il s'avère que si vous, dans votre première fois, extrayez une branche distante que votre pair a créée, git continue et ajoute branch.<BNAME>.remote=originau gitconfig local. Ce qui vous permet ensuite d'émettre git pull. Cependant, si vous êtes celui qui crée la branche git checkout -b BNAME, alors git-of course- ne sait pas. Vous devez donc spécifier sa télécommande.
batilc
@batilc "Il se trouve que si vous, lors de votre première connexion, extrayez une branche distante créée par votre homologue,"; oui, en lisant git-scm.com/docs/git-checkout , je vois: " If <branch>est introuvable mais il existe une branche de suivi dans exactement une télécommande (appelez-la <remote>) avec un nom correspondant, traitez comme équivalent à $ git checkout -b <branch> --track <remote>/<branch>"
VonC
@VonC J'ai trouvé une meilleure configuration pour cela. mise en place branch.autoSetupMergepour alwayssimplement effectuer ce dont nous parlons. Par défaut true, ce paramètre signifie que le suivi sera effectué uniquement lors de l'extraction d'une branche distante. truene configure pas le suivi pour les branches créées localement.
batilc
@batilc je suis d'accord. J'ai tendance à ne pas toujours utiliser, car je préfère définir explicitement le suivi, mais dans votre cas, cela devrait être le bon paramètre.
VonC
1
"git branch --set-upstream-to branch upstream / branch" n'est pas la syntaxe correcte. il doit être: "git branch --set-upstream-to upstream / branch branch"
maharvey67
33

Il n'y a aucune différence!

1) git checkout -b branch origin/branch

S'il n'y a pas --tracket non --no-track, --trackest supposé par défaut. La valeur par défaut peut être modifiée avec le paramètre branch.autosetupmerge.

En effet, 1) se comporte comme git checkout -b branch --track origin/branch.

2) git checkout --track origin/branch

«Par commodité», --tracksans -bimplication -bet l'argument à -bdevinerait «branche». La supposition est déterminée par la variable de configuration remote.origin.fetch.

En effet, 2) se comporte comme git checkout -b branch --track origin/branch.

Comme vous pouvez le voir: aucune différence.

Mais ça va encore mieux:

3) git checkout branch

est également équivalent à git checkout -b branch --track origin/branchsi "branche" n'existe pas encore mais "origine / branche" existe 1 .


Les trois commandes définissent «en amont» de «branche» sur «origine / branche» (ou elles échouent).

En amont est utilisé comme point de référence inférieur argument git status, git push, git mergeet donc git pull(si elle est configurée comme celle (qui est la valeur par défaut ou à peu près la valeur par défaut)).

Par exemple, git statusvous indique dans quelle mesure vous êtes en amont ou en aval, si celui-ci est configuré.

git pushest configuré pour pousser la branche courante en amont par défaut 2 depuis git 2.0.

1 ... et si "origine" est la seule télécommande à avoir "branche"
2 la valeur par défaut (nommée "simple") impose également que les deux noms de branche soient égaux

Robert Siemer
la source
5

Le livre semble indiquer que ces commandes produisent le même effet:

Le cas simple est l'exemple que vous venez de voir, en exécutant git checkout -b [branch] [remotename] / [branch]. Si vous avez Git version 1.6.2 ou ultérieure, vous pouvez également utiliser le raccourci --track:

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

Pour configurer une branche locale avec un nom différent de la branche distante, vous pouvez facilement utiliser la première version avec un nom de branche locale différent:

$ git checkout -b sf origin/serverfix

C'est particulièrement pratique lorsque vos compléments bash ou oh-my-zsh git sont capables de tirer le origin/serverfixnom pour vous - ajoutez simplement --track(ou -t) et vous êtes sur votre chemin.

Tapoter
la source
-1

Vous ne pouvez pas créer une nouvelle branche avec cette commande

git checkout --track origin/branch

si vous avez des modifications qui ne sont pas mises en scène.

Voici un exemple:

$ 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

Cependant, vous pouvez facilement créer une nouvelle branche avec des modifications non échelonnées avec la git checkout -bcommande:

$ git checkout -b new-branch
Switched to a new branch 'new-branch'
M       src/App.js
vert
la source
gardez à l'esprit que les deux commandes dans les questions sont pour suivre une branche distante existante ( origin/branch)
yorch
@Green Le test que vous faites est avec origin/new-branchau lieu de origin/branch. Etes-vous au courant de cela?
Robert Siemer