Git работает на двух ветвях одновременно


168

У меня есть проект со многими филиалами.

Я бы хотел работать над несколькими ветками одновременно, не переключаясь с одного на другой git checkout.

Есть ли способ сделать это, кроме копирования всего хранилища в другое место?



1
Git 2.5+ (Q2 2015) официально поддержит это с помощью новой команды git checkout --to=<path>. Смотрите мой ответ ниже .
VonC

2
На самом деле, команда будет git worktree add <path> [<branch>](Git 2.5 RC2)
VonC

Ответы:


156

Git 2.5+ (Q2 2015) поддерживает эту функцию!

Если у вас есть git repo , запустите cool-appcd to root ( cd cool-app) git worktree add ../cool-app-feature-A feature/A. Это проверяет ветку feature/Aв ее собственном новом выделенном каталоге cool-app-feature-A.

Это заменяет старый сценарий contrib/workdir/git-new-workdirболее надежным механизмом, в котором эти «связанные» рабочие деревья фактически записываются в новую $GIT_DIR/worktreesпапку основного репо (так что работают на любой ОС, включая Windows).

Опять же, после того, как вы клонировали репо (в папке типа /path/to/myrepo), вы можете добавить рабочие деревья для разных веток по разным независимым путям ( /path/to/br1, /path/to/br2), в то же время привязав эти рабочие деревья к основной истории репо (больше не нужно использовать --git-dirопцию)

Смотрите больше в « Несколько рабочих каталогов с Git? ».

И после того, как вы создали рабочее дерево, вы можете переместить или удалить его (с помощью Git 2.17+, Q2 2018).


2
Это должен быть новый принятый ответ, так как 2.5.X является рекомендуемой версией, даже для windows i.imgur.com/oQvUhVl.png git-scm.com/download/win
RAnders00

40

Посмотрите на $ GIT_SRC_DIR / contrib / workdir / git-new-workdir .

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


И аналогичные: stackoverflow.com/questions/655202/…
Тобу

2
Я знаю, что это старо, но не могли бы вы дать некоторые объяснения, пожалуйста.
dav_i

@dav_i: Как это ?
Stefan Näwe

@ StefanNäwe Ах, я растерялся - слишком рано утром ... обновил свой ответ ссылкой.
dav_i

0

Я предлагаю свой небольшой сценарий http://www.redhotchilipython.com/en_posts/2013-02-01-clone-per-feature.html

Он выполнит git clone и заменит конфигурацию (чтобы «посмотреть» на исходное репо, поэтому pull / push перейдет в «основное» репо), но это достаточно просто, чтобы служить абстракцией от реальной начальной загрузки.


0

Как сказал наш друг VonC пять месяцев назад, теперь с версии 2.5.x появилась новая функция, которая делает эту работу. мерзавец дерево .


Разве это не то же самое, что я упоминал 5 месяцев назад в своем ответе выше ?
VonC

Ops. Теперь я чувствую себя ужасно. Я не уделил должного внимания этому. Виноват.

0

Git поддерживает несколько рабочих деревьев одновременно. Для получения дополнительной информации см .:

Однако очень трудно поддерживать несколько рабочих деревьев с идентификаторами. Например, это запрос расширения в JGet (идентификатор затмения) для поддержки рабочего дерева.

Таким образом, вы должны управлять проектом вручную (из командной строки) с множеством проблем или работать с одним рабочим деревом в IDE.


На данный момент этот ответ не является правильным. Пожалуйста, обновите ответ.
Нарендра-Чоудхари

-2

Не совсем так, поскольку Git поддерживает только одну рабочую копию данных хранилища в каталоге хранилища.

Если вы хотите зафиксировать / извлечь один и тот же репозиторий с двумя разными рабочими копиями, вы можете создать пустой репозиторий и клонировать его в две рабочие копии .

Всякий раз, когда вы что-то закончили, вы просто нажимаете на «основной» голый репозиторий.

Некоторые намеки:

man git-clone

git clone --bare


3
«Git поддерживает только одну рабочую копию данных репозитория» -1 Неверно, см. Ответ о git-new-workdir.
слеське

Это хорошая идея. Просто клонируйте его дважды.
Сергей Виноградов
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.