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/abranch
va créer mybranch
et suivreorigin/abranch
git checkout --track origin/abranch
ne 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.defaultRemote
variable 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=origin
pour 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
branch
au 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>.remote
et branch.<name>.merge
) de manière à git pull
fusionner de manière appropriée à partir de la branche de suivi à distance.
Ce comportement peut être modifié via l' branch.autosetupmerge
indicateur de configuration globale . Ce paramètre peut être remplacé en utilisant les --track
et les --no-track
options, et changé par la suite en utilisant git branch --set-upstream-to
.
Et git checkout --track origin/branch
fera 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-upstream
et 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 status
etgit 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.
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 ajoutebranch.<BNAME>.remote=origin
au gitconfig local. Ce qui vous permet ensuite d'émettregit pull
. Cependant, si vous êtes celui qui crée la branchegit checkout -b BNAME
, alors git-of course- ne sait pas. Vous devez donc spécifier sa télécommande.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>
"branch.autoSetupMerge
pouralways
simplement effectuer ce dont nous parlons. Par défauttrue
, ce paramètre signifie que le suivi sera effectué uniquement lors de l'extraction d'une branche distante.true
ne configure pas le suivi pour les branches créées localement.Il n'y a aucune différence!
1)
git checkout -b branch origin/branch
S'il n'y a pas
--track
et non--no-track
,--track
est supposé par défaut. La valeur par défaut peut être modifiée avec le paramètrebranch.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
implication-b
et l'argument à-b
devinerait «branche». La supposition est déterminée par la variable de configurationremote.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/branch
si "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 merge
et doncgit 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 status
vous indique dans quelle mesure vous êtes en amont ou en aval, si celui-ci est configuré.git push
est 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
la source
Le livre semble indiquer que ces commandes produisent le même effet:
C'est particulièrement pratique lorsque vos compléments bash ou oh-my-zsh git sont capables de tirer le
origin/serverfix
nom pour vous - ajoutez simplement--track
(ou-t
) et vous êtes sur votre chemin.la source
Vous ne pouvez pas créer une nouvelle branche avec cette commande
si vous avez des modifications qui ne sont pas mises en scène.
Voici un exemple:
Cependant, vous pouvez facilement créer une nouvelle branche avec des modifications non échelonnées avec la
git checkout -b
commande:la source
origin/branch
)origin/new-branch
au lieu deorigin/branch
. Etes-vous au courant de cela?