Почему git worktree add создает ветку и могу ли я ее удалить?

Я использовал git worktree add для создания нового рабочего дерева. Я заметил, что он создал новую ветку в репо с тем же именем, что и рабочее дерево. Для чего эта ветка?

Я проверил другую, уже существующую ветку во втором рабочем дереве. Могу ли я удалить ветку, созданную git worktree add?


person Tor Klingberg    schedule 26.09.2016    source источник
comment
Я могу ошибаться, но я предполагаю, что эта ветвь - это то, на чем вы на самом деле работаете в рабочем дереве.   -  person Tim Biegeleisen    schedule 26.09.2016
comment
Я думаю, что мне следовало указать уже существующую ветку, которую я хотел проверить, когда создавал рабочее дерево, вместо того, чтобы впоследствии переключать ветку. Тогда я бы не стал создавать новую ветку.   -  person Tor Klingberg    schedule 26.09.2016
comment
Я не могу сказать, почему они сделали это таким образом, но да, вы должны указать ветку для нового рабочего дерева, поэтому по умолчанию они создают ветвь, названная так же, как новое рабочее дерево. У них могла бы быть ошибка git worktree add /path/to/foo без аргумента -b или -B или final, вместо того, чтобы по умолчанию использовать здесь foo, но я предполагаю, что они решили, что по умолчанию здесь удобнее использовать foo.   -  person torek    schedule 26.09.2016
comment
Если вы не хотите создавать новую ветку, вы можете запустить git worktree add --detach </path/to/worktree> и вместо этого вы получите отсоединенную голову. Это то, что я всегда делаю. Если вы планируете проверить какую-либо существующую ветку, вы можете сделать git worktree add </path/to/worktree> <my-branch>.   -  person clacke    schedule 30.03.2017
comment
Примечание. Для удаления элемента, связанного с рабочим деревом: git worktree --remove (для Git 2.17+, Q2 2018): см. мой ответ здесь   -  person VonC    schedule 17.03.2018


Ответы (6)


Ветвь необходима, потому что вы не можете получить одну и ту же ветку в разных рабочих деревьях одновременно.

Поэтому, если вы не укажете ветку при добавлении рабочего дерева, git автоматически добавит ее на основе вашей текущей ветки и имени каталога рабочего дерева.

Вы можете спросить, почему я не могу дважды оформить одну и ту же кассу? Подумайте о том, что произойдет с рабочим деревом A, когда вы сделаете фиксацию в B, если они оба будут совместно использовать ветку... рабочее дерево A увидит фиксацию в B как локальное отличие, но наоборот! точно так же, как если бы вы сделали git reset --soft HEAD^... Это было бы довольно опасно.

Кстати, это та же самая причина, по которой вы не можете отправить ветку не голого репозитория, которая извлечена.

По поводу вашего последнего вопроса: можете ли вы удалить ветку? Конечно, эта ветвь не является чем-то особенным. Вы можете удалить его, если он нигде не проверен.

person rodrigo    schedule 26.09.2016
comment
Спасибо! Я спросил о проблеме двойной проверки отдельно в stackoverflow.com/questions/39665570/ - person Tor Klingberg; 27.09.2016

Поскольку другие ребята отвечают на этот вопрос, я помещаю команды для удаления folder, удаления worktree и удаления branch здесь:

во-первых, перечислите все ваши рабочие деревья, чтобы перепроверить...

$ git worktree list

затем удалите папку рабочего дерева

$ rm -rf path/to/worktree

после этого удалите само рабочее дерево

$ git worktree prune

если у вас более одного рабочего дерева, приведенная выше команда только обрезает рабочее дерево, так что его путь больше не существует, так что не беспокойтесь!

наконец, удалите ветку (то же имя ветки, что и рабочее дерево)

$ git branch -D <branch-name>
person vaheeds    schedule 22.11.2017
comment
Замечательно, я искал чернослив! - person Skynet; 03.10.2018
comment
Рабочее дерево не обязательно имеет собственную ветку. Так что стоит добавить оговорку к рекомендации удалить ветку - person Ben Carp; 26.11.2020
comment
После того, как я сделал rm -rf path/to/worktree и git worktree prune, каталог /.git/worktree был удален. FWIW у меня было только рабочее дерево main - person Honey; 22.01.2021

Из Git 2.17.0 вы можете безопасно запускать эту универсальную команду

git worktree remove <path>
person Efreeto    schedule 19.04.2018
comment
Это сладко ???? - person Siraj Alam; 28.05.2021

git worktree --help ясно упоминает об этом, как показано ниже.

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.
person Indra Uprade    schedule 26.09.2016

git worktree добавит новую ветку, если она не указана:

Если <commit-ish> опущено и не используются ни -b, ни -B, ни --detach, то для удобства автоматически создается новая ветвь, основанная на HEAD, как если бы было указано -b $(basename <path>).

Начиная с Git 2.17, вы можете удалить эту ветку с помощью git worktree remove.

Но та же самая команда remove также включала:

Нечистые рабочие деревья или деревья с подмодулями могут быть удалены с помощью --force.
Главное рабочее дерево не может быть удалено.

Верно... за исключением того, что --force не был полностью реализован в Git 2.17.

В Git 2.18 (второй квартал 2018 г.) «git worktree remove» узнал, что «-f» — это сокращение для опции «--force», как и для «git worktree add».

См. commit d228eea (17 апреля 2018 г.) от Стефан Беллер (stefanbeller).
Справка: Эрик Саншайн (sunshineco).
(Объединено Junio ​​C Hamano -- gitster - – в commit 90186fa, 8 мая 2018 г.)

worktree: примите -f как сокращение от --force для удаления

Многие команды поддерживают параметр "--force", часто сокращенно обозначаемый как "-f".
Однако свернутый вручную OPT_BOOL "git worktree remove" забывает распознавать краткую форму, несмотря на то, что git-worktree.txt документирует "-f" как поддерживаемый.
Заменить OPT_BOOL с OPT__FORCE, который предоставляет "-f" бесплатно и делает "remove" совместимым с разбором параметра "add" (который также указывает флаг PARSE_OPT_NOCOMPLETE).

person VonC    schedule 20.05.2018

Кажется, вы можете работать в автономном режиме с --detach, который не будет создавать ветки. Это может быть полезно, если вы не планируете вносить изменения в рабочее дерево, а, например, просто запускаете сборку или тесты.

Источник: https://stacktoheap.com/blog/2016/01/19/using-multiple-worktrees-with-git/#long-running-tasks

person liberforce    schedule 27.09.2017