#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:
Я думаю, что лучше всего создать временную ветвь. Если вы не хотите создавать временную ветвь, у вас есть другие варианты.
-
Извлеките определенный коммит. В вашем случае вы можете просто запустить
git checkout refs/heads/master
. Это приводит к отделенному головному состоянию.refs/heads/master
может быть заменен конкретным коммитом. -
Создайте столько рабочих деревьев для отдельной головки, сколько захотите. Вы можете запустить
git worktree add /path/foo1 refs/heads/master
,git worktree add /path/foo2 refs/heads/master
, …,git worktree add /path/fooN refs/heads/master
. -
Сбросить
develop
наmaster
. В рабочем дереве «project_develop» запуститеgit reset master --hard
.
Эти подходы обходят ограничение, заключающееся в том, что вы не можете создать второе рабочее дерево для той же ветви. 1-я и 2-я почти одинаковы для временной ветви. 3-й может привести вас в замешательство некоторое время спустя.