Как сделать коммиты в другой ветке без оформления заказа? - PullRequest
0 голосов
/ 16 января 2020

У меня есть git хранилище с потерянной веткой. В настоящее время я нахожусь в ветке master и сделал копию потерянной ветки, например, так:

git read-tree other-branch
git checkout-index -f -a --prefix=/home/user/another-workdir/
git read-tree master  # Restore

Предположим, я внесу изменения в файлы в /home/user/another-workdir/, как мне их зафиксировать? переходит в потерянную ветку без изменения моего текущего рабочего каталога (т.е. без git checkout)?

Я пробовал git --work-dir=/home/user/another-workdir/ commit -a, но это влияет на ветку, над которой я сейчас работаю (master).

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Послушайте Торека: Не делайте этого!

Ради информации, можно создавать коммиты в других ветвях или в любом месте дерева, используя git write-tree, git commit-tree, git branch и, возможно, другие команды в зависимости от операции, которую вы хотите выполнить.

0 голосов
/ 16 января 2020

Самый простой способ, безусловно, таков: нет. То есть, не пытайтесь делать это, таким образом, вообще. Сделайте это по-другому.

Если у вас 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», чтобы быть немного техническим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...