Откат к старому git commit в публичном РЕПО

Как я могу вернуться к определенной фиксации в git?

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

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

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

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

8 ответов


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

git checkout [revision] .

здесь [revision] является хэшем фиксации (например:12345678901234567890123456789012345678ab).

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

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

git reset --hard 

что будет удалить все изменения из рабочего каталога и промежуточной области.


для отката к определенной ревизии:

git reset --hard commit_sha

для отката 10 коммитов назад:

git reset --hard HEAD~10

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

как вернуть репозиторий Git к предыдущей фиксации?


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

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


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

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

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

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

Я не могу использовать сброс, потому что это РЕПО является общедоступным.

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

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

диапазон фиксации HEAD~20.. сокращенно HEAD~20..HEAD, и означает "начать с 20th родитель главы совершает и возвращает все коммиты после него до головы".

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

git revert -m 1 <merge-commit>

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

git revert Лучше, Чем git checkout

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

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


Шаг 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

вот и все.


git read-tree -um @ $commit_to_revert_to

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

вы можете достичь того же эффекта с

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

Если вы предпочитаете нанизывание удобных команд.

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


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

чтобы вернуться из отдельного государства, мне пришлось проверить мой местный филиал:git checkout master


предположим, вы работаете над проектом и через день или около того. Вы заметили, что одна функция все еще дает вам ошибки. Но вы не знаете, какое изменение вы сделали, что вызвало ошибку. Таким образом, вы должны ловить предыдущие рабочие коммиты. Чтобы вернуться к определенной фиксации:

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Ok, так что commit работает для вас. Больше никаких ошибок. Вы точно определили проблему. Теперь вы можете вернуться к последней фиксации:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

и проверить конкретный файл, прежде чем он вызвал ошибку (в моем случае я использую пример файле.lock):

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 -- /projects/myproject/Gemfile.lock

и это один из способов обработки ошибок, которые вы создали в коммитах, не осознавая ошибок до более позднего времени.