Как переключиться на конкретный коммит Git без потери всех коммитов, сделанных после него ?
Я хочу, чтобы локальные файлы были изменены, но база данных коммитов останется нетронутой, только текущий указатель позиции будет установлен на текущий выбранный коммит.
Я хочу изменить состояние файлов на конкретную фиксацию, запустить проект и, когда закончите, восстановить файлы до последней фиксации.
Как это сделать без архивирования всей папки проекта?
Ответы:
Если вы находитесь на определенной ветке
mybranch
, просто продолжайтеgit checkout commit_hash
. Затем вы можете вернуться в свою ветку поgit checkout mybranch
. У меня была та же самая игра, которая делит пополам ошибку сегодня :) Также вы должны знать о git bisect .источник
git checkout commit_hash
если вы находитесь в чистом хранилище и не нуждаетесь в ветвлении. Может быть проще для некоторых случаев использования (как у меня).git bisect
справки; какой чрезвычайно полезный инструмент!Во-первых, используйте
git log
для просмотра журнала, выберите нужный коммит, запишите хэш sha1, который используется для идентификации коммита. Далее бегиgit checkout hash
. После того, как вы закончитеgit checkout original_branch
. Преимущество в том, что вы не перемещаете ГОЛОВКУ, а просто переключаете рабочую копию на конкретный коммит.источник
git checkout <original_branch>
.git checkout HEAD
фактически NOOPgit reset --hard <hash>
изменяет заголовок текущей ветви, в то время какgit checkout <hash>
вы получаете отдельную проверку, которая не меняет никакой ветви, и вы можете легко вернуться, не зная исходного хеш-кода вашей ветви, как показано в этом ответе.В дополнение к другим ответам, приведенным здесь, показывающим, как
git checkout <the-hash-you-want>
стоит знать, вы можете вернуться туда, где вы использовали:Это часто более удобно, чем:
Как и следовало ожидать,
git checkout @{-2}
вы вернетесь в ту ветвь, в которой вы были два годаgit checkout
назад, и аналогично для других номеров. Если вы можете вспомнить, где вы были для больших чисел, вы должны получить какую-то медаль за это.К сожалению, для производительности,
git checkout @{1}
не приведет вас к отрасли, в которой вы будете в будущем, что является позором.источник
git checkout -
это сокращенный псевдоним дляgit checkout @{-1}
@{n}
синтаксисе, так как он работает со многими командами git. Мне было трудно добавить вашу стенограмму, не делая ответ довольно запутанным. Вместо этого я проголосовал за ваш комментарий - надеюсь, люди это увидят. Еще раз спасибо.git merge -
чтобы объединить ветку, которую вы последний раз проверяли, с веткой, которая была извлечена в данный момент. Это какcd -
в Bash.