Подтвердить что ты не робот

Как работать одновременно на нескольких ветвях

Это продолжение этого вопроса о создании веток.

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

Я бы предположил, что лучшим методом является дублирование репозитория и работа в разных папках на моем компьютере для каждой ветки, но я не знаю, как это установить. У меня есть мой текущий репозиторий в Documents/San/CompProj, и какие команды я буду использовать для создания нового репозитория, связанного с другой веткой в ​​другой локальной папке?

Git является для меня совершенно новым, поэтому я бы хотел, чтобы любые исправления, которые вы можете сделать, я принимаю/задаю выше.

4b9b3361

Ответ 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, если они не используют именованные ветки: они клонируют репозиторий в новый каталог на диске для каждой ветки, которую они хотят, а затем выталкивают и извлекают наборы изменений между ними.

Ответ 2

С Git 2.5+ (Q2 2015) Git больше не предназначен для работы в одной папке (то есть в одном рабочем дереве)

Git будет поддерживать несколько рабочих деревьев (для одного клонированного Git repo) с помощью новой команды git worktree add <path> [<branch>].

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

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

Подробнее в разделе Несколько рабочих каталогов с Git?"

Ответ 3

Ваша забота о "файлах на моей локальной машине будет странным сочетанием разных экспериментов". является необоснованным - если вы выведете ветвь 2, вы не увидите файлы ветки 1 одновременно.

Я бы сделал что-то вроде

# on master branch
git checkout master
# Create a branch for feature 1
git checkout -b feature_1
# work on feature 1

# Start a new feature branch
git checkout master
git checkout -b feature_2
# work on feature 2

# feature 2 finished and committed, time to merge 
git checkout master
git merge feature_2

# update feature_1 branch
git checkout feature_1
git merge master

Ответ 4

Я предлагаю свое решение с помощью небольшого сценария https://web.archive.org/web/20141114201917/http://www.redhotchilipython.com/en_posts/2013-02-01-clone-per-feature.html.

Хотя инструменты git stash хороши, я считаю, что иметь несколько клонов гораздо лучше. Вы можете запускать тесты в одной ветке, а работать в другой. Или вам даже не нужно останавливать отладчик, закрывать редактор, очищать временные файлы или что-то еще.