Самый простой способ, безусловно, таков: нет. То есть, не пытайтесь делать это, таким образом, вообще. Сделайте это по-другому.
Если у вас Git версии 2.15 или новее - или даже 2.5 или новее - у вас есть команда git worktree
с подкомандами. Одна из подкоманд - git worktree add
. Для этого необходимо указать имя другой ветви, например, other-branch
, а также имя места для создания нового рабочего дерева в другом порядке:
git worktree add ../auxiliary other-branch
(при условии ../auxiliary
доставит вас в место, где Git может mkdir auxiliary
за пределами вашего существующего рабочего дерева; /home/user/another-workdir/
, вероятно, тоже хорошо).
Итак: используйте git worktree add
для создания new work-tree, как показано здесь. Это новое рабочее дерево совершенно новое, поэтому нет файлов, которые вы могли бы перезаписать. Новое рабочее дерево также получает новый индекс, так что пара индекс / рабочее дерево, которая покрывает ваше основное рабочее дерево, то, где вы находитесь на ветви master
, полностью независима от нового индекса / работы -дерево пары для этой другой ветви.
Теперь вы можете запустить новое окно оболочки, или pushd ../auxiliary
, или что угодно, чтобы попасть в новое дерево работы, которое находится в независимой ветви. 1 Здесь вы можете скопировать файлы из основного рабочего дерева, git add
и git commit
. Это похоже на наличие отдельного репозитория, за исключением того, что коммит входит в (общий) репозиторий, обновляя (общий) имя ветви other-branch
в основном репозитории без отдельного git fetch
требуется шаг.
Если у вас есть Git, то есть> = 2.5, но <2.15, fini sh всей этой работы, а затем go обратно в основной репозиторий в течение 14 дней, и используйте <code>rm -rf ../auxiliary (или где бы вы ни хранили хранилище) и git worktree prune
. Это позволит избежать неприятной ошибки: эти версии Git не могут проверять ссылки в добавленных рабочих деревьях и могут отбрасывать объекты, которые используются при запуске git gc
(из любого рабочего дерева!). Если ваш Git равен 2,15 или более поздней, ошибка исправлена, и нет необходимости в ее очистке, хотя в любом случае вы можете захотеть.
1"Сиротская ветвь" не очень хороший термин для этого, поскольку Git использует его специально для разговора о настройке, в которой вы находитесь на несуществующем имени ветки, сделанном с помощью git checkout --orphan
. Это имя перестает быть "сиротой", как только вы совершаете из этого состояния. Команда checkout
называет это сиротская ветвь , а git status
называет это нерожденная ветвь , поэтому сам Git немного запутан относительно того, что является правильным термином.
В вашем случае, однако, имя ветви other-branch
существует и указывает на некоторую существующую фиксацию. Просто коммит, на который указывает имя ветки, и все его предки ведут к другому root коммиту, а не к root коммиту, совместно используемому с коммитом tip master
. Таким образом, «несвязанный» может быть хорошим термином, или «независимым», как я здесь использовал, или «по-другому DAG-ged», чтобы быть немного техническим.