Как работать одновременно на нескольких ветках - PullRequest
46 голосов
/ 12 декабря 2011

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

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

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

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

Ответы [ 4 ]

39 голосов
/ 12 декабря 2011

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

34 голосов
/ 12 мая 2015

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

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

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

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

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

1 голос
/ 04 февраля 2013

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

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

1 голос
/ 12 декабря 2011

Ваше беспокойство по поводу "файлов на моей локальной машине будет странным сочетанием разных экспериментов". является необоснованным - если вы извлекли ветку 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...