web-dev-qa-db-fra.com

Différence entre git checkout - piste Origine / branche et git checkout -b branche Origine / branche

Est-ce que quelqu'un sait la différence entre ces deux commandes pour basculer 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 pour que je puisse appliquer mes modifications à la branche sur Origin, non?

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

Merci!

179
yorch

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

La différence pratique vient de l’utilisation d’une branche locale nommée autrement:

  • _git checkout -b mybranch Origin/abranch_ créera mybranch et suivra _Origin/abranch_
  • _git checkout --track Origin/abranch_ ne créera que 'abranch', et non une branche avec un nom différent.

(C'est-à-dire comme indiqué par Sebastian Graf , si la branche locale existait déjà not ​​existait déjà.
Si c'était le cas, vous auriez besoin de _git checkout -B abranch Origin/abranch_)


Note: avec Git 2.23 (Q3 2019), cela utiliserait le nouvelle commande _git 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 variable de configuration _checkout.defaultRemote_, nous l'utiliserons aux fins de la désambiguïsation, même si la _<branch>_ n'est pas unique dans toutes les télécommandes. .
Réglez-le sur p. Ex. _checkout.defaultRemote=Origin_ pour toujours extraire les branches distantes à partir de là si _<branch>_ est ambigu, mais existe sur la télécommande 'Origin'.

Ici, '_-c_' est le nouveau '_-b_'.


Tout d’abord, quelques antécédents: Suivi signifie qu’une branche locale a son groupe en 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_ va:

  • créer/réinitialiser branch jusqu'au point référencé par _Origin/branch_.
  • créez la branche branch (avec git branch ) et suivez la branche de suivi distante _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>.remote_ et _branch.<name>.merge_) afin que _git pull_ soit correctement fusionné à partir de la branche de suivi à distance.
Ce comportement peut être modifié via l'indicateur de configuration global _branch.autosetupmerge_. Ce paramètre peut être remplacé à l'aide des options _--track_ et _--no-track_, puis modifié ultérieurement à l'aide de git branch _--set-upstream-to_.


Et _git checkout --track Origin/branch_ fera la même chose 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 va déconseiller _git branch --set-upstream_ et le remplacer par _git branch -u|--set-upstream-to_: voir annonce git1.8.0-rc1 )


Avoir une succursale en amont enregistrée pour une succursale locale:

  • indiquez à git to de montrer la relation entre les deux branches dans _git status_ et _git branch -v_ .
  • dirige _git pull_ sans arguments à extraire de l'amont lorsque la nouvelle branche est extraite .

Voir " Comment faire en sorte qu'une branche git existante suive une branche distante? " pour plus d'informations.

241
VonC

Il n'y a pas de différence du tout!

1) git checkout -b branch Origin/branch

S'il n'y a ni --track ni --no-track, --track est utilisé 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é”, --track sans -b implique -b et l'argument de -b est supposé être “branche”. La conjecture est piloté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: pas de différence.

Mais ça va encore mieux:

3) git checkout branch

est également équivalent à git checkout -b branch --track Origin/branch si "branche" n'existe pas encore mais "Origine/branche" n'existe pas1.


Les trois commandes définissent le "amont" de "branche" sur "Origine/branche" (ou échouent).

Upstream est utilisé comme point de référence de l'argument sans argument git status, git Push, git merge et donc git pull (s'il est configuré comme cela (qui est la valeur par défaut ou presque la valeur par défaut)) .

Par exemple. git status vous indique à quelle distance vous êtes en amont ou en amont, le cas échéant.

git Push est configuré pour pousser la branche actuelle en amont par défaut2 depuis git 2.0.

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

28
Robert Siemer

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

Le cas simple est l'exemple que vous venez de voir, exécutant git checkout -b [branche] [nom_sélection]/[branche]. 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 celui de la branche distante, vous pouvez facilement utiliser la première version avec un nom de branche local différent:

$ git checkout -b sf Origin/serverfix

C'est particulièrement pratique lorsque vos finitions git bash ou oh-my-zsh sont en mesure de tirer le nom Origin/serverfix - ajoutez simplement --track (ou -t) et vous êtes sur votre chemin.

5
Pat