Возвращаясь к определенному коммитам на основе идентификатора commit с помощью Git?

С git log, я получаю список коммитов, которые я сделал до сих пор.

commit f5c5cac0033439c17ebf905d4391dc0705dbd5f1
Author: prosseek 
Date:   Fri Sep 3 14:36:59 2010 -0500

    Added and modified the files.

commit c14809fafb08b9e96ff2879999ba8c807d10fb07
Author: prosseek 
Date:   Tue Aug 31 08:59:32 2010 -0500

    Just simple test for core.editor.

... etc ...
  • Как я могу вернуть его обратно к определенной фиксации? Например, что мне делать, если я хочу вернуться к commit c14809fafb08b9e96ff2879999ba8c807d10fb07?

  • Есть ли какой-либо другой/лучший способ вернуться к конкретному фиксации с помощью Git? Например, могу ли я поместить некоторую метку каждой фиксации, чтобы вернуть ее с помощью метки?

Ответ 1

Вы хотите откатить репо до этого состояния? Или вы просто хотите, чтобы ваш локальный репо выглядел так?

если вы делаете

git reset --hard c14809fa

Это сделает ваш локальный код и локальную историю такими же, какими были при фиксации. Но тогда, если вы хотите передать это кому-то еще, у кого есть новая история, это потерпит неудачу.

если вы делаете

git reset --soft c14809fa

Он переместит вашу ГОЛОВУ туда, где они были, но ваши локальные файлы и т.д. Остаются прежними.

Так что именно вы хотите сделать с этим сбросом?

Редактировать -

Вы можете добавить "теги" в репозиторий, а затем вернуться к тегу. Но тег - это просто ярлык для sha1.

Вы можете пометить это как TAG1.. тогда git reset --soft c14809fa, git reset --soft TAG1 или git reset --soft c14809fafb08b9e96ff2879999ba8c807d10fb07 будет делать то же самое.

Ответ 2

Я думаю, bwawok ответ ошибочен в какой-то момент:

если вы делаете

git reset --soft c14809fa

Это приведет к тому, что ваши локальные файлы будут изменены так, как они были тогда, но оставьте свою историю и т.д. одинаковыми.

В соответствии с manual: git - reset, git reset --soft"...

не затрагивает индексный файл или рабочее дерево вообще (но сбрасывает голову в <commit> , как и все режимы). Это оставляет все ваши измененные файлы "Изменения, которые необходимо совершить", поскольку статус git будет указан.

Таким образом, он будет "удалять" новые коммиты из ветки. Это означает, что, посмотрев на свой старый код, вы не можете легко перейти к новейшей фиксации в этой ветке. Таким образом, это противоположность, как описано в bawawok: локальные файлы не изменяются (они выглядят точно так же, как и раньше "git reset --soft" ), но история изменена (ветвь усечена после указанной фиксации).

Команда для ответа bwawok может быть:

git checkout <commit>

Вы можете использовать это для просмотра в старой версии: как вчера выглядел мой код?

(Я знаю, я должен поместить это в комментарии к этому ответу, но stackoverflow не позволяет мне это делать! Моя репутация слишком низкая.)

Ответ 3

git reset c14809fafb08b9e96ff2879999ba8c807d10fb07 - это то, что вам нужно...

Ответ 4

Если вы хотите устранить проблему, вы можете сделать:

git reset --hard c14809fafb08b9e96ff2879999ba8c807d10fb07

отправьте сообщение о том, как выглядел ваш клон git во время проверки