Suivre une nouvelle branche distante créée sur GitHub


183

J'ai déjà une branche principale locale qui suit la branche principale distante d'un projet github. Maintenant, un de mes collaborateurs a créé une nouvelle branche dans le même projet, et je veux faire ce qui suit en conséquence:

  1. créer une nouvelle branche localement
  2. faire en sorte que cette nouvelle branche suive la branche distante nouvellement créée.

Comment dois-je le faire correctement?


2
git checkout --track -b <branche locale> <remote> / <branche suivie> fonctionne également.
MLister

14
... ou juste git checkout -t <remote>/<whatever>. S'il n'y a qu'une seule branche de suivi à distance qui se termine par, <whatever>vous pouvez même le faire git checkout <whatever>et git devine ce que vous voulez dire.
Mark Longair

Réponses:


251
git fetch
git branch --track branch-name origin/branch-name

La première commande garantit que vous avez une branche distante dans le référentiel local. La deuxième commande crée une branche locale qui suit la branche distante. Il suppose que votre nom distant est originet le nom de la branche est branch-name.

--track L'option est activée par défaut pour les succursales distantes et vous pouvez l'omettre.


3
Quand je fais cela, j'obtiens un avertissement: refname 'branch-name' est ambigu.
Ultrasaurus le

19
S'il n'y a qu'une seule branche distante avec ce nom de branche, vous pouvez simplement le faire git checkout <branchname>et git la vérifiera automatiquement et configurera une branche de suivi. Je voulais juste répéter ce que @Mark Longair a dit ci-dessus dans ce commentaire: stackoverflow.com/questions/11262703/… .
Ryan Walls

Le nom de ma succursale distante est remotes/origin/develop? Ne devrait-il pas être juste origin/develop? Sont-ce les mêmes?
ア レ ッ ク ス

2
Je devais le faire git fetch --all, sinon les nouvelles branches ne seraient pas récupérées
mschrimpf

Comment faire cela dans Eclipse? Quand j'en ai terminé cmd, eclipse détecte la nouvelle branche?
Deckard

31

Si vous n'avez pas de succursale locale existante, c'est vraiment aussi simple que:

git fetch
git checkout <remote-branch-name>

Par exemple, si vous récupérez et qu'une nouvelle branche de suivi à distance est appelée origin/feature/Main_Page, procédez comme suit :

git checkout feature/Main_Page

Cela crée une branche locale avec le même nom que la branche distante, en suivant cette branche distante. Si vous avez plusieurs télécommandes avec le même nom de branche, vous pouvez utiliser la moins ambiguë:

git checkout -t <remote>/<remote-branch-name>

Si vous avez déjà créé la branche locale et que vous ne souhaitez pas la supprimer, consultez Comment faire en sorte qu'une branche Git existante suive une branche distante? .


1
git checkout 1.5-branch( remotes/upstream/1.5-branchest dans la sortie de git branch -a) entraîne la error: pathspec '1.5-branch' did not match any file(s) known to git.modification de ceci pour git checkout upstream/1.5-branchentraîner le détachement de HEAD et aucune branche locale n'est créée. Je pense que cette partie de la réponse est tout simplement erronée. C'est avec git 2.4.3
Piotr Dobrogost

La première commande fonctionne pour moi pour moi dans git 1.9.3, même pour différentes télécommandes. Il est possible que ce comportement ait changé. Le résultat de votre deuxième commande est ce à quoi je m'attendais. Sans -t, vous ne spécifiez pas que vous voulez faire autre chose que regarder cette version spécifique sur la télécommande.
kotoole

1
Je suis d'accord avec @PiotrDobrogost, je crois que votre déclaration "Cela crée une succursale locale avec le même nom ..." est erronée. Ce que fetch fera (lorsqu'il est appelé de cette façon) est de créer une branche de suivi à distance pour chaque branche de la télécommande. Cela signifie qu'une succursale de votre dépôt local est nommée <remote>/<branch>. Une branche de suivi à distance est en lecture seule, indiquant où cette branche était sur la télécommande lors de la dernière extraction. Faire appel checkoutà cette référence de branche vous met en mode HEAD détaché, comme le dit Piotr. Notez que spécifier la branche distante à récupérer évite de créer des branches de suivi distantes indésirables.
scanny

2
Pour être clair une fois de plus: je suggère d'utiliser la commande git checkout feature-branch. Je ne suggère PAS d'utiliser la commande git checkout origin/feature-branch qui, comme vous l'avez tous les deux souligné, entraînera une tête détachée inutile.
kotoole le

beaucoup plus simple et pertinent. Fonctionne très bien avec git 2.8.3 sur cygwin.
Felipe Alvarez

29

Tout d'abord, vous devez récupérer le référentiel distant:

git fetch remoteName

Ensuite, vous pouvez créer la nouvelle branche et la configurer pour suivre la branche distante souhaitée:

git checkout -b newLocalBranch remoteName/remoteBranch

Vous pouvez également utiliser "git branch --track" au lieu de "git checkout -b" comme max spécifié.

git branch --track newLocalBranch remoteName/remoteBranch

Si vous checkout -butilisez une branche distante comme point de départ, il est alors inutile de l'utiliser --track.

5
De plus, comme indiqué dans ce commentaire , si vous faites juste git checkout <branchname>, et qu'il y a une branche distante avec le même nom (après avoir fait a git fetch), alors la branche locale sera automatiquement configurée pour suivre la branche distante.

9

Lorsque la branche n'est pas une branche distante, vous pouvez pousser votre branche locale directement vers la branche distante.

git checkout master
git push origin master

ou lorsque vous avez une branche de développement

git checkout dev
git push origin dev

ou lorsque la branche distante existe

git branch dev -t origin/dev

Il existe d'autres possibilités pour pousser une branche distante.


Ensuite, vous prenez la troisième option. Lorsque la branche distante existe, vous pouvez créer une branche locale et suivre la branche distante :) c'est la même que la version de max mais plus courte.
René Höhle
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.