Откат на старый коммит Git в публичном репо - PullRequest
725 голосов
/ 05 января 2010

Как я могу вернуться к конкретному коммиту в git?

Лучший ответ, который кто-то мог мне дать, это использовать git revert X раз, пока я не достигну желаемого коммита.

Итак, допустим, я хочу вернуться к коммиту, которому уже 20 коммитов, мне нужно было бы запустить его 20 раз.

Есть ли более простой способ сделать это?

Я не могу использовать сброс, потому что этот репозиторий общедоступен.

Ответы [ 11 ]

1082 голосов
/ 05 января 2010

Попробуйте это:

git checkout [revision] .

где [revision] - хеш коммита (например: 12345678901234567890123456789012345678ab).

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

Вы можете отменить это,

git reset --hard 

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

182 голосов
/ 14 февраля 2013

Чтобы выполнить откат до определенного коммита:

git reset --hard commit_sha

Для отката 10 фиксирует назад:

git reset --hard HEAD~10

Вы можете использовать «git revert», как в следующем посте, если вы не хотите переписывать историю

Как вернуть Git-репозиторий к предыдущему коммиту?

85 голосов
/ 05 января 2010

Ну, я думаю, вопрос в том, что вы подразумеваете под «откатом»? Если вы не можете reset, потому что она общедоступна, и вы хотите сохранить историю изменений без изменений, значит, вы хотите, чтобы ваша рабочая копия отражала определенный коммит? Используйте git checkout и хеш коммита.

Редактировать: Как отмечалось в комментариях, использование git checkout без указания ветви оставит вас в состоянии "нет ветви". Используйте git checkout <commit> -b <branchname>, чтобы оформить заказ в филиале, или git checkout <commit> ., чтобы оформить заказ в текущем филиале.

39 голосов
/ 22 апреля 2014

Оригинальный постер гласит:

Лучший ответ, который кто-то мог мне дать, это использовать git revert X раз, пока я достичь желаемого коммита.

Итак, скажем, я хочу вернуться к коммиту, которому 20 коммитов, я бы запустить его 20 раз.

Есть ли более простой способ сделать это?

Я не могу использовать сброс, потому что этот репозиторий открыт.

Нет необходимости использовать git revert X раз. git revert может принять принять диапазон в качестве аргумента, поэтому вам нужно использовать его только один раз, чтобы вернуть диапазон коммитов. Например, если вы хотите отменить последние 20 коммитов:

git revert --no-edit HEAD~20..

Диапазон фиксации HEAD~20.. является коротким для HEAD~20..HEAD и означает «начать с 20 th родителя фиксации HEAD и вернуть все коммиты после него до HEAD».

Это вернет последние 20 коммитов, при условии, что ни один из них не является слиянием коммиты. Если есть коммиты слияния, вы не можете отменить их все одной командой, вам нужно будет отменить их индивидуально с помощью

git revert -m 1 <merge-commit>

Обратите внимание, что я тестировал использование диапазона с git revert с использованием git версии 1.9.0. Если вы используете более старую версию git, использование диапазона с git revert может или может не работать.

В этом случае git revert предпочтительнее, чем git checkout.

Обратите внимание, что в отличие от этот ответ говорит, что использовать git checkout, git revert на самом деле удалит все файлы, которые были добавлены в любой из коммитов, которые вы возврат , что делает его правильным способом возврата диапазона ревизий.

Документация

25 голосов
/ 12 июля 2016

Шаг 1: получить список коммитов:

git log

Вы получите список, как в этом примере:

[Comp:Folder User$ git log
commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
Author: author <author@gmail.com>
Date:   Fri Jul 8 23:42:22 2016 +0300

This is last commit message

commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
Author: author <author@gmail.com>
Date:   Fri Jun 24 20:20:24 2016 +0300

This is previous commit message

commit ab0de062136da650ffc27cfb57febac8efb84b8d
Author: author <author@gmail.com>
Date:   Thu Jun 23 00:41:55 2016 +0300

This is previous previous commit message
...

Шаг 2: скопируйте необходимый хеш коммита и вставьте его для извлечения:

git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f

Вот и все.

10 голосов
/ 06 февраля 2016
git read-tree -um @ $commit_to_revert_to

сделает это. Это "git checkout", но без обновления HEAD.

Вы можете добиться того же эффекта с

git checkout $commit_to_revert_to
git reset --soft @{1}

, если вы предпочитаете объединять удобные команды вместе.

Это оставит вас с вашим рабочим деревом и индексом в желаемом состоянии, вы можете просто git commit закончить.

1 голос
/ 22 февраля 2017

Я не уверен, что изменилось, но я не могу оформить конкретный коммит без опции --detach. Полная команда, которая работала для меня, была: git checkout --detach [commit hash]

Чтобы вернуться из отключенного состояния, я должен был оформить заказ в местном отделении: git checkout master

0 голосов
/ 29 марта 2019

Вы можете найти идентификатор коммита, связанный с каждым коммитом, в разделе коммитов GitHub / BitBucket / Gitlab. Это очень просто, предположим, ваш идентификатор коммита 5889575 , тогда, если вы хотите вернуться к этой части в вашем коде, вам просто нужно набрать

git checkout 5889575 .

Это приведет вас к тому моменту времени в вашем коде.

0 голосов
/ 14 марта 2019

Хотите отключить режим HEAD?

Если вы хотите откатить X раз на определенный коммит с помощью DETACHED HEAD (то есть вы ничего не можете испортить), тогда непременно используйте следующее:

(замените X на количество коммитов, которые вы хотите вернуться)

git checkout HEAD~X

т.е. вернуться на один коммит:

git checkout HEAD~1
0 голосов
/ 06 марта 2019

Вот пример, чтобы сделать это

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .
...