Можно ли в Git переключиться на другую ветку без проверки всех файлов?
После переключения ветки мне нужно удалить все файлы, восстановить их, зафиксировать и переключиться обратно. Так что извлечение файлов - пустая трата времени (а файлов около 14 000 - это долгая операция).
Чтобы все было понятно:
Все это мне нужно для загрузки документации на GitHub.
У меня есть репозиторий с веткой gh-pages . Когда я перестраиваю документацию локально, я копирую ее в каталог репозитория, фиксирую и отправляю на GitHub. Но я не был счастлив, потому что у меня было две копии документации локально. И я решил создать пустую ветку и после фиксации переключиться на пустую и удалить файлы. Но переключение назад - долгая операция - поэтому я задал этот вопрос.
Я знаю, что могу просто оставить в ветке gh-pages и удалить файлы, но я не люблю грязные рабочие деревья.
источник
Ответы:
Да, ты можешь это сделать.
Если вам нужно выполнить фиксацию в этой ветке, вы также захотите сбросить индекс, иначе вы закончите фиксацию чего-то на основе последней извлеченной ветки.
источник
echo "ebff34ffb665de0694872dceabe0edeaf50ec5a9" > .git/HEAD
после него,git reset
чтобы указать ссылку вместо ветки.git update-ref HEAD refs/heads/otherbranch
git stash
2.git checkout -b otherBranch
3.git stash pop
git update-ref
полезно, но также перемещает кончик текущей ветки.Использование только базовых команд git:
Этот ответ немного длиннее, чем у Чарльза, но он состоит исключительно из основных команд git, которые я могу понять и, следовательно, запомнить, что избавляет от необходимости постоянно искать его.
Отметьте свое текущее местоположение (при необходимости сначала зафиксируйте):
Сбросить (переместить) маркер в другую ветку без изменения рабочего каталога:
теперь temp и другие ветки указывают на один и тот же коммит, и ваш рабочий каталог не затронут.
поскольку ваша ГОЛОВА уже указывает на ту же фиксацию, рабочий каталог не затрагивается
Обратите внимание, что эти команды также легко доступны из любого графического клиента.
источник
git reset --soft <branch where you want to go>
не обновлять индексДля удобства читателя:
Пока я думаю что решение Чарльза Бейли является правильным, это решение требует настройки при переключении на что-то, что не является локальной веткой. Также должен быть способ сделать это с помощью обычных команд, которые легко понять. Вот что я придумал:
Разъяснил:
git checkout --detach
такой же какgit checkout HEAD^{}
что оставляет текущую ветку позади и переходит в «состояние отдельной головы». Так что следующая модификацияHEAD
больше не затрагивает ни одну ветку. ОтсоединениеHEAD
не влияет ни на рабочее дерево, ни на индекс.git reset --soft commitish
затем движетсяHEAD
к SHA данногоcommitish
. Если вы хотите обновить и индекс, оставьте это в--soft
стороне, но я не рекомендую это делать. Это опять же не касается рабочего дерева и (--soft
) не индекса.git checkout commitish
затем прикрепляетHEAD
к даннойcommitish
(ветке). (Еслиcommitish
это SHA, ничего не происходит.) Это тоже не влияет ни на индекс, ни на рабочее дерево.Это решение принимает все, что относится к фиксации, поэтому оно идеально подходит для некоторых
git
псевдонима. Нижеrev-parse
приведен всего лишь тест, чтобы убедиться, что ничего не нарушается в цепочке, чтобы опечатки случайно не переключались в состояние отсоединенной головы (восстановление после ошибок было бы намного сложнее).Это приводит к следующему
git hop treeish
псевдониму:К вашему сведению, вы можете найти его в моем списке
git
псевдонимов .источник
$@
вместо$*
? Разница в том, что $ @ не раскрывает аргументы в кавычках, внутри которых есть пробелы.$@
это здесь окончательно не подразумевается.$*
используется вместо$1
, такое, чтоgit switch -f b
становится тем же,git switch '-f b'
что и должно быть ошибкой. Таким образом, я могу сократить псевдоним, оставив некоторую обработку ошибок, например!f() { [ 1 = $# ] || { echo 'WTF!'; return 1; }; ..
Разве не было бы лучшим решением иметь два рабочих каталога (две рабочие области) с одним репозиторием или даже два репозитория?
В разделе есть инструмент git-new-workdir ,
contrib/
который поможет вам в этом.источник
git-new-worktree
предшествующей сценарийgit worktree
подкоманда; эта команда была недоступна, когда был написан ответ. Например, для сценария требуется поддержка символических ссылок; ИМХО лучше использовать родную поддержку.Я думаю, вы ищете команду сантехников
git read-tree
. Это обновит индекс, но не обновит файлы в вашем рабочем каталоге. Например, если предположитьbranch
это имя ветки, которую нужно читать:Если вы хотите затем выполнить фиксацию в только что прочитанной ветке, вам также потребуется:
источник
read-tree
генерирует ошибку:fatal: Not a valid object name branch
если ее еще неgit switch branch
былоВы можете перезаписать файл HEAD другим именем ветки:
echo "ref: refs / heads / MyOtherBranch"> .git / HEAD
источник
git symbolic-ref HEAD refs/heads/MyOtherBranch
kernel.org/pub/software/scm/git/docs/git-symbolic-ref.htmlgit symbolic-ref
?С таким большим количеством файлов вам может быть лучше просто сохранить два репозитория, по одному для каждой ветки. Вы можете тянуть изменения назад и вперед по мере необходимости. Это будет менее удивительно, чем пытаться разыграть цингу с git.
источник
git-new-worktree
для этого вместо этого (incontrib/
)Если вы просто пытаетесь изменить точку удаленного ветвления, вы можете сделать это с помощью команды «git push», не касаясь локальной копии.
http://kernel.org/pub/software/scm/git/docs/git-push.html
например, чтобы обновить foo до фиксации c5f7eba, сделайте следующее:
Не уверен, что вы хотели этого или нет.
источник
вы можете использовать
previous-branch-commit-id - это фиксация, из которой вы хотите скопировать старые данные.
источник
Или просто используйте патч-файл, чтобы патчить от вашего другого филиала к вашему мастеру
источник
скажем, вы хотите быть в ветке A, но с файлами из ветки B
найти текущую ссылку на фиксацию ветки A с помощью журнала git, например "99ce9a2",
теперь вы должны быть в ветке A со структурой папок, соответствующей B, которая отображается как неустановленные изменения (история не изменилась).
источник