web-dev-qa-db-fra.com

Git ajoute un arbre de travail d'une branche distante existante

Je suis nouveau chez Git. Je cherche beaucoup mais rien ne trouve qui corresponde exactement à mon cas.

J'ai une application personnelle WinForms et dans mon dépôt distant, il y a 3 branches (maître et 2 longues branches):

master  #the common features are here like Core, DAL,...
north   #customized for A company (long-running)
razavi  #customized for B company (long-running)

Sur mon ordinateur de bureau, j'ajoute 2 worktree pour ces branches north et razavi:

$ git worktree list
C:/Source/nis     a6fb6e1 [master]
C:/Source/north   ebc7670 [north]
C:/Source/razavi  eed08a2 [razavi]

Jusqu'à présent, tout va bien, je décide de travailler sur ce projet depuis chez moi également, mais lorsque j'essaie d'ajouter un arbre de travail pour ces deux branches sur mon ordinateur personnel, cela me donne une erreur:

$git worktree add -b north ../north north
fatal: A branch named 'north' already exists.

Je supprime le commutateur -b pour ne pas ajouter de nouvelle branche, mais cela ne fonctionne pas aussi.

Comment puis-je ajouter une worktree à partir d'une branche existante qui n'est pas locale mais distante?

MISE À JOUR (Solution)

Après avoir travaillé pendant un moment, j'ai trouvé la solution à mon problème, en fait, c'était un commutateur --checkout qui manquait:

$ git worktree add --checkout ../north north

Je vais mettre cela dans les réponses aussi.

8
vaheeds

En plus de "deviner la branche distante", comme je explique dans mon autre réponse , Git 2.18 (T2 2018) offrira une nouvelle fonctionnalité:
"git worktree add" a appris à extraire une branche existante.

Voir commit f60a7b7 , commit 6427f87 , commit 2c27002 , commit d861d34 (24 avril 2018) de Thomas Gummerer (tgummerer) .
Aidé de: Eric Sunshine (sunshineco) .
(Fusion par Junio ​​C Hamano - gitster - dans commit 10174da , 23 mai 2018)

arbre de travail: enseignez "add" pour vérifier les branches existantes

Actuellement, 'git worktree add <path>' crée une nouvelle branche nommée d'après le nom de base du chemin par défaut.
Si une branche portant ce nom existe déjà, la commande refuse de faire quoi que ce soit, sauf si l'option '--force' est donnée.

Cependant, nous pouvons faire un peu mieux que cela et vérifier la branche si ce n'est pas vérifié ailleurs.
Cela aidera les utilisateurs qui souhaitent simplement archiver une branche existante dans une nouvelle arborescence de travail
et enregistrer quelques frappes au clavier.

Comme le comportement actuel consiste simplement à "die()" lorsqu'une branche portant le nom du nom de base du chemin existe déjà, il n'y a pas de retour en arrière la compatibilité s'inquiète ici.

Nous allons toujours 'die()' si la branche est extraite dans une autre arborescence, sauf si le drapeau --force est passé.

La documentation indique maintenant :

$ git worktree add --track -b <branch> <path> <remote>/<branch>

Si <commit-ish> est omis et que ni -b, ni -B ni --detach ne sont utilisés, ensuite, par commodité, le nouvel arbre de travail est associé à une branche (appelez-le <branch>) nommé d'après $(basename <path>)

  • Si <branch> n'existe pas, une nouvelle branche basée sur HEAD est automatiquement créée comme si -b <branch> avait été donné. 
  • Si <branch> existe, il sera extrait du nouvel arbre de travail, s'il n'est extrait nulle part ailleurs, sinon la commande refusera de créer l'arbre de travail (sauf si --force est utilisé).
2
VonC

Pour ce problème, worktree add a besoin d'un commutateur --checkout pour le faire:

$ git worktree add --checkout ../north north
$ git worktree add --checkout ../razavi razavi
1
vaheeds

En plus du git worktree add --checkout, Git 2.16 (T1 2018) proposera une autre alternative:

La façon dont "git worktree add" détermine quelle branche créer à partir d'où et que la sortie dans la nouvelle arborescence a été mise à jour un peu.

Voir commit e92445a , commit 71d6682 (29 nov. 2017), et commit 4e85333 , commit e284e89 , commit c4738ae , commit 7c85a87 (26 Nov 2017) de Thomas Gummerer (tgummerer) .
(Fusion par Junio ​​C Hamano - gitster - dans commit 66d3f19 , 19 déc. 2017)

ajout de l'option de configuration worktree.guessRemote

Certains utilisateurs voudront peut-être que l'option --guess-remote soit introduite dans le commit précédent par défaut, afin qu’ils n’aient pas à le taper chaque fois qu'ils créent un nouvel arbre de travail.

Ajoutez une option de configuration worktree.guessRemote permettant aux utilisateurs de configurer le comportement par défaut pour eux-mêmes.

La documentation pour git config se lit maintenant:

worktree.guessRemote::

Avec add, si aucun argument de branche, et ni -b, ni -B ni --detach ne sont fournis, la commande crée par défaut une nouvelle branche à partir de HEAD.
Si worktree.guessRemote est défini sur true, worktree add tente de trouver une branche de suivi à distance dont le nom correspond de manière unique au nouveau nom de la branche. 

  • Si une telle branche existe, elle est extraite et définie comme "en amont" pour la nouvelle branche. 
  • Si aucune correspondance de ce type ne peut être trouvée, il en résulte une nouvelle branche à partir de la HEAD actuelle.

En fait, Git 2.21 (T1 2019) clarifie la documentation de cette option, qui a immédiatement été intégrée à "With add", sans expliquer que add est une sous-commande de "git worktree".

Voir commit b4583d5 (23 déc. 2018) par Eric Sunshine (sunshineco) .
(Fusionnée par Eric Sunshine - sunshineco - dans commit b4583d5 , 28 déc. 2018)

La documentation se lit maintenant:

worktree.guessRemote:

Si aucune branche n'est spécifiée et que ni -b, ni -B, ni --detach n'est utilisé, alors git worktree add crée par défaut une nouvelle branche à partir de HEAD. 

1
VonC