web-dev-qa-db-fra.com

Pourquoi git worktree add crée-t-il une branche et puis-je la supprimer?

J'ai utilisé git worktree add pour créer un nouvel arbre de travail. J'ai remarqué que cela a créé une nouvelle branche dans le référentiel avec le même nom que l'arbre de travail. A quoi sert cette branche?

J'ai vérifié une autre branche préexistante dans le deuxième arbre de travail. Suis-je libre de supprimer la branche créée par git worktree add?

16
Tor Klingberg

La branche est nécessaire car vous ne pouvez pas extraire la même branche dans plusieurs arbres de travail en même temps.

Donc, si vous ne spécifiez pas de branche lors de l'ajout de l'arbre de travail, alors git en ajoutera une automatiquement, en fonction de votre branche actuelle et du nom du répertoire de l'arbre de travail.

Vous pouvez vous demander pourquoi je ne peux pas avoir la même caisse deux fois? Pensez à ce qui va arriver à l’arbre de travail A lorsque vous vous engagez sur B, s’ils partagent la même branche ... l’arbre de travail A verra le commit en B comme une différence locale, mais à l’inverse! comme si vous le faisiez git reset --soft HEAD^... Ce serait assez dangereux.

BTW, c’est la même raison pour laquelle vous ne pouvez pas Transférer vers une branche d’un référentiel non-nu extrait.

À propos de votre dernière question: pouvez-vous supprimer la branche? Bien sûr, cette branche n’a rien de spécial. Vous pouvez le supprimer tant qu'il n'est pas extrait nulle part.

12
rodrigo

Alors que les autres gars répondent à cette question, je mets des commandes pour supprimer la folder, supprimer worktree et supprimer branch ici:

commencez par lister tous vos arbres de travail à vérifier ...

$ git worktree list

puis supprimez le dossier de l'arborescence

$ rm -rf ../path/to/worktree

après cela, supprimez le arbre de travail lui-même

$ git worktree Prune

si vous avez plus d'un arbre de travail, la commande ci-dessus élimine uniquement l'arbre de travail car son chemin n'existe plus, alors ne vous inquiétez pas!

enfin, supprimez la branche (même nom de branche que l'arbre de travail)

$ git branch -D <branch-name>
16
vaheeds

git worktree ajoutera une nouvelle branche si aucune n'est spécifiée:

Si <commit-ish> est omis et que ni -b, ni -B ni --detach ne sont utilisés, ensuite, par commodité, une nouvelle branche basée sur HEAD est créée automatiquement, comme si -b $(basename <path>) était spécifié.

Depuis Git 2.17 , vous pouvez supprimer cette branche avec git worktree remove .

Mais cette même commande remove incluait également:

Les arbres de travail impurs ou comportant des sous-modules peuvent être supprimés avec --force.
L'arbre de travail principal ne peut pas être supprimé.

True ... sauf que --force n'était pas entièrement implémenté dans Git 2.17.

Avec Git 2.18 (T2 2018), "git worktree remove" a appris que "-f" était un raccourci pour l'option "--force", tout comme pour "git worktree add".

Voir commit d228eea } _ (17 avril 2018) de Stefan Beller (stefanbeller) }.
Aidé de: Eric Sunshine (sunshineco) }.
(Fusionné par Junio ​​C Hamano - gitster - à commit 90186fa , 08 mai 2018)

worktree: accepter -f comme raccourci pour --force pour suppression

De nombreuses commandes prennent en charge une option "--force", souvent abrégée en "-f".
Cependant, "git worktree remove" roulé à la main OPT_BOOL oublie reconnaître la forme abrégée, malgré git-worktree.txt documentant "-f" comme supporté.
Remplacez OPT_BOOL par OPT__FORCE, qui fournit gratuitement "-f" et rend "remove" cohérent avec l'analyse de l'option "add" (qui spécifie également l'indicateur PARSE_OPT_NOCOMPLETE).

3
VonC

git worktree --help le mentionne clairement ci-dessous. 

COMMANDS
       add <path> [<branch>]
           Create <path> and checkout <branch> into it. The new working directory is linked to the current repository, sharing everything
           except working directory specific files such as HEAD, index, etc.

           If <branch> is omitted and neither -b nor -B is used, then, as a convenience, a new branch based at HEAD is created automatically,
           as if -b $(basename <path>) was specified.

       Prune
           Prune working tree information in $GIT_DIR/worktrees.
3
Indra Uprade

Vous semblez pouvoir fonctionner en mode détaché avec --detach, qui ne créera pas de branche. Cela peut être utile si vous ne prévoyez pas de modifier la structure de travail, mais simplement de générer ou d'exécuter des tests, par exemple.

Source: https://stacktoheap.com/blog/2016/01/19/using-multiple-worktrees-with-git/#long-running-tasks

2
liberforce

Depuis Git 2.17.0, vous pouvez exécuter cette commande tout-en-un en toute sécurité.

git worktree remove <path>
0
Efreeto