Switch git ветка без проверки файлов
Возможно ли в git переключиться на другую ветку без проверки всех файлов? После переключения ветки мне нужно удалить все файлы, восстановить их, зафиксировать и вернуть обратно. Поэтому проверка файлов - это просто трата времени (и около 14000 файлов - это длительная операция).
Чтобы все было ясно:
Мне нужно все это, чтобы загрузить документацию в github.
У меня есть репо с ветвью gh-pages. Когда я перестраиваю документацию локально, я копирую ее в каталог репо, фиксирую и нажимаю на github. Но я был недоволен, потому что у меня было две копии документации на местном уровне. И я решил создать пустую ветку и после того, как переключился на пустые и удаленные файлы. Но переключение - длительная операция, поэтому я задал этот вопрос.
Я знаю, что могу просто оставить на ветке gh-pages и удалить файлы, но мне не нравятся грязные рабочие деревья)
Ответы
Ответ 1
Да, вы можете это сделать.
git symbolic-ref HEAD refs/heads/otherbranch
Если вам нужно зафиксировать в этой ветке, вам нужно будет reset индекс, иначе вы в конечном итоге совершите что-то на основе последней вывешенной ветки.
git reset
Ответ 2
Использование только основных команд git:
Этот ответ немного дольше, чем у Чарльза, но он состоит только из основных команд git, которые я могу понять и, таким образом, запомнить, устраняя необходимость продолжать поиск.
Отметьте свое текущее местоположение (сначала зафиксируйте):
git checkout -b temp
Reset (перемещает) маркер на другую ветку без изменения рабочего каталога:
git reset <branch where you want to go>
теперь temp и другая ветвь указывают на одну и ту же фиксацию, и ваш рабочий каталог не тронут.
git checkout <branch where you want to go>
так как ваш HEAD уже указывает на один и тот же фиксатор, рабочий каталог не затрагивается
git branch -d temp
Обратите внимание, что эти команды также доступны любому графическому клиенту.
Ответ 3
Не было бы лучшим решением иметь два рабочих каталога (две рабочие области) с одним хранилищем или даже с двумя репозиториями?
В contrib/
есть инструмент git-new-workdir, чтобы помочь вам в этом.
Ответ 4
Вы можете перезаписать свой файл HEAD с другим именем ветки:
echo "ref: refs/heads/MyOtherBranch" > .git/HEAD
Ответ 5
Я думаю, вы ищете команду сантехника git read-tree
. Это обновит индекс, но не будет обновлять файлы в вашем рабочем каталоге. Например, если предположить, что branch
- это название ветки, которую нужно читать:
git read-tree branch
Если вы хотите затем зафиксировать ветвь, которую вы только что прочитали, вам также понадобится:
git symbolic-ref HEAD refs/heads/branch
Ответ 6
В интересах читателя:
Хотя я считаю, что решение Charles Bailey является правильным, это решение нуждается в настройке при переключении на что-то, что не является локальной ветвью. Также должен быть каким-то образом, как это сделать с помощью регулярных команд, которые легко понять. Вот что я придумал:
git checkout --detach
git reset --soft commitish
git checkout commitish
Разъяснения:
-
git checkout --detach
совпадает с git checkout HEAD^{}
, который оставляет текущую ветку позади и переходит в "состояние отдельной головы". Поэтому следующая модификация HEAD
больше не влияет на какую-либо ветвь. Отключение HEAD
не влияет на рабочую строку или индекс.
-
git reset --soft commitish
затем перемещает HEAD
в SHA данного commitish
. Если вы хотите обновить индекс, откройте --soft
, но я не рекомендую это делать. Это, опять же, не касается рабочей строки, и (--soft
) не индекс.
-
git checkout commitish
затем присоединяет HEAD
к данной commitish
(ветки) снова. (Если commitish
является SHA, ничего не происходит.) Это тоже не влияет на индекс и worktree.
Это решение принимает все, что относится к фиксации, поэтому оно идеально подходит для некоторого псевдонима git
. rev-parse
ниже - это просто тест, чтобы убедиться, что в цепочке ничего не сломается, так что опечатки не случайно переключаются в состояние отсоединенной головки (восстановление ошибок было бы более сложным).
Это приводит к следующему git switch treeish
псевдониму:
git config --global alias.switch '!f() { git rev-parse --verify "$*" && git checkout "HEAD^{}" && git reset --soft "$*" && git checkout "$*"; }; f'
FYI, вы можете найти его в моем списке git
псевдонимы.
Ответ 7
С таким количеством файлов вам может быть лучше всего сохранить два репозитория, по одному для каждой ветки. Вы можете тянуть изменения взад и вперед по мере необходимости. Это будет менее удивительно, чем пытаться играть в хитроумные трюки с помощью git.
Ответ 8
Если вы просто пытаетесь изменить место расположения удаленной ветки, вы можете сделать это с помощью "git push", не касаясь вашей локальной копии.
http://kernel.org/pub/software/scm/git/docs/git-push.html
Формат параметра <refspec> является необязательным значением плюс +, за которым следует исходный код ref <src> , за которым следует двоеточие:, а затем пункт назначения ref <dst> . Он используется для указания того, какой объект <src> должен обновить <dst> ref в удаленном репозитории.
например, для обновления foo для фиксации c5f7eba выполните следующие действия:
git push origin c5f7eba:foo
Не уверен, что это было после или нет.
Ответ 9
вы можете использовать
1. git checkout -f <new-branch>
2. git cherry-pick -x <previous-branch-commit-id>
previous-branch-commit-id - это фиксация, из которой вы хотите скопировать старые данные.