Как переключать ветви между двумя отдельными рабочими деревьями в Git?

#git #git-worktree

#git #git-worktree

Вопрос:

Я добавил связанное рабочее дерево для ветки «develop». Итак, мои рабочие деревья такие:

— рабочее дерево «project» -> основная ветвь
— рабочее дерево «project_develop» -> ветвь разработки

В этом состоянии я хочу сделать, это оформить главную ветвь в рабочем дереве «project_develop». Но, насколько я знаю, невозможно проверить одну и ту же ветку на отдельных рабочих деревьях. Единственный способ, который я смог придумать, это добавить новую временную ветвь.

Я был бы признателен, если кто-нибудь покажет мне другой способ.
Спасибо!

Комментарии:

1. Было бы полезно знать, чего вы пытаетесь избежать / достичь здесь… какую проблему вы предвидите с временной ветвью?

2. @RomainValeri не было бы проблем с добавлением временной ветви, но, я думаю, этот процесс немного неэффективен, добавляя и удаляя дополнительную ветвь только для переключения существующих ветвей. Мне просто интересно, есть ли способ получше.

3. Я не могу представить, чтобы какая-либо альтернатива была более «эффективной», чем однострочная команда… git checkout <hash> на самом деле не быстрее, чем git checkout -b temp <target>

4. Вам действительно это нужно? вы можете объединить в master.

5. Обратите внимание, что если вы хотите сохранить добавленное рабочее дерево в течение длительного периода (более двух недель), убедитесь, что ваша версия Git не ниже 2.15. В версиях Git до 2.15 (но 2.5 или более поздней, где git worktree появились впервые) есть неприятная ошибка, из-за которой добавленные рабочие деревья могут быть повреждены через 14 дней. (Точно, когда это произойдет, и произойдет ли это вообще, предсказать нелегко. Это связано с ошибкой в git gc .)

Ответ №1:

Самый простой способ — на master рабочем дереве

 git checkout --detach
  

Существует множество других способов; суть в том, что, поскольку у вас нет другой ветви для получения доступа к этому рабочему дереву, вы хотите принудительно перевести его в обособленное HEAD состояние. У него все еще может быть извлечен тот же код; он просто не может думать, что он находится «на» master ветке (поскольку возникли бы проблемы с обновлением рабочих деревьев при фиксации).

Как только это будет сделано, вы можете git checkout master использовать одно из 2-х рабочих деревьев, а затем, если хотите, вы могли бы даже вернуться к первому рабочему дереву и git checkout develop полностью поменять ветви местами. Или просто подождите, пока вы не будете готовы вернуться develop ко 2-му рабочему дереву, а затем снова проверить master на 1-м дереве…

Комментарии:

1. Хороший трюк, но я удивлен, что невозможно быстро поменять местами две ветви или просто украсть ветку другого рабочего дерева. Это было бы намного эффективнее. Обычно это недостаток, из-за которого я неохотно использую рабочие деревья.

Ответ №2:

Я думаю, что лучше всего создать временную ветвь. Если вы не хотите создавать временную ветвь, у вас есть другие варианты.

  1. Извлеките определенный коммит. В вашем случае вы можете просто запустить git checkout refs/heads/master . Это приводит к отделенному головному состоянию. refs/heads/master может быть заменен конкретным коммитом.

  2. Создайте столько рабочих деревьев для отдельной головки, сколько захотите. Вы можете запустить git worktree add /path/foo1 refs/heads/master , git worktree add /path/foo2 refs/heads/master , …, git worktree add /path/fooN refs/heads/master .

  3. Сбросить develop на master . В рабочем дереве «project_develop» запустите git reset master --hard .

Эти подходы обходят ограничение, заключающееся в том, что вы не можете создать второе рабочее дерево для той же ветви. 1-я и 2-я почти одинаковы для временной ветви. 3-й может привести вас в замешательство некоторое время спустя.