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 - это фиксация, из которой вы хотите скопировать старые данные.