Ответ 1
Начиная с Git 2.5, git-worktree
напрямую поддерживает этот рабочий процесс. Смотрите VonC ответ на этот вопрос для деталей.
Моего ответа ниже может быть достаточно, если вам не нравится git-worktree
по какой-либо причине.
Git предназначен для работы в одной папке на диске. Это единственный репозиторий, содержащий все ветки, которые вам нужны. † Вы оформляете покупку в зависимости от того, над какой веткой вы хотите работать.
В репозитории Git вы можете получить только одну ветку за раз. Если вы извлекаете вторую ветку, файлы на диске удаляются и заменяются файлами из второй ветки.
Если у вас есть следующие ветки:
BRANCH-A BRANCH-B
alpha.txt alpha.txt
bravo.txt
charlie.txt charlie.txt
delta.txt
Когда вы находитесь на ветке A и bravo.txt
ветку B, bravo.txt
будет удален, а delta.txt
будет добавлен в ваш рабочий каталог.
Однако git-checkout
не будет перезаписывать изменения, внесенные вами в файлы, если вы не -f
аргумент -f
. Если вы alpha.txt
изменения в alpha.txt
затем попытаетесь переключиться на alpha.txt
-B, вы получите сообщение, предупреждающее вас о том, что ваши изменения будут потеряны, и прервет оформление заказа.
Исключением являются неотслеживаемые файлы. Если вы echo.txt
ветвь A и создали новый файл с именем echo.txt
, Git не будет касаться этого файла при извлечении ветки B. Таким образом, вы можете решить, что хотите зафиксировать echo.txt
ветке B без необходимости проходить через (1) перемещение файла за пределы репозитория, (2) извлечение правильной ветки и (3) перемещение вернуть файл в репо.
сноска
† На самом деле, 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, если они не используют именованные ветки: они клонируют репозиторий в новый каталог на диске для каждой ветки, которую они хотят, а затем выталкивают и извлекают наборы изменений между ними.