Начиная с Git 2.5, git-worktree
напрямую поддерживает этот рабочий процесс. Подробнее см. VonC на этот вопрос .
Мой ответ ниже может быть достаточным, если вам не нравится git-worktree
по любой причине.
Git разработан, чтобы позволить вам работать в одной папке на диске. Это единственный репозиторий, содержащий все ветки, которые вам интересны. & dagger; Вы извлекаете любую ветку, над которой хотите работать в данный момент.
В репозитории Git вы можете получить только одну ветку за раз. Если вы извлекаете вторую ветку, файлы на диске удаляются и заменяются файлами из второй ветки.
Если у вас есть следующие филиалы:
BRANCH-A BRANCH-B
alpha.txt alpha.txt
bravo.txt
charlie.txt charlie.txt
delta.txt
Когда вы находитесь на branch-A и извлекаете branch-B , тогда bravo.txt
будет удалено и delta.txt
будет добавлено в ваш рабочий каталог.
Однако git-checkout
не будет переписывать изменения, внесенные вами в файлы, если вы не укажете аргумент -f
. Если вы внесете изменение в alpha.txt
, а затем попытаетесь переключиться на branch-B , вы получите сообщение, предупреждающее вас о том, что ваши изменения будут потеряны, и прервет оформление заказа.
Исключением являются неотслеживаемые файлы. Если вы извлекли branch-A и создали новый файл с именем echo.txt
, Git не будет касаться этого файла при извлечении branch-B . Таким образом, вы можете решить, что хотите зафиксировать echo.txt
против branch-B без необходимости проходить через хлопоты: (1) переместить файл за пределы репо, (2) проверить правильную ветку, и (3) переместить файл обратно в хранилище.
Сноска
& dagger; На самом деле, Git не заставляет вас использовать один рабочий каталог. Если вы хотите, ничто не мешает вам создавать разные пути на диске для каждой ветви, с которой вы хотите работать.
/home/me/project
+-- branch-a/
+-- branch-b/
+-- ...
Каждый из этих путей является собственным Git-репозиторием (у каждого есть папка .git
внутри), и вы можете помещать и извлекать коммиты между репозиториями.
cd ~/project ## Go to my projects directory
git clone branch-a branch-b ## Create a new branch-b
cd branch-b
... work work work ...
git commit -a -m "Made some changes on branch-b"
git pull origin ## Fetch and merge the changes from branch-a
git push origin ## Push my changes back to branch-a
Вот как некоторые люди используют Mercurial, если они не используют именованные ветви : они клонируют репозиторий в новый каталог на диске для каждой ветви, которую они хотят, а затем перемещают и извлекают наборы изменений между ними.