Откат к старому Git-коммиту в публичном репозитории

StackOverflow https://stackoverflow.com/questions/2007662

  •  18-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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 и хеш фиксации.

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

На оригинальном плакате говорится:

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

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

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

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

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

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

Диапазон фиксации HEAD~20.. это сокращение от HEAD~20..HEAD, и означает "начинайте с 20че родительский элемент ГОЛОВНОГО коммита и возвращает все коммиты после него вплоть до 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 фактически удалит все файлы, которые были добавлены в любые коммиты, которые вы возвращаясь, что делает это правильным способом отмены ряда ревизий.

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

Шаг 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», но без обновления HEAD.

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

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

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

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

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

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

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

git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .

Хорошо, этот коммит работает для вас.Больше никакой ошибки.Вы обозначили проблему.Теперь вы можете вернуться к последнему коммиту:

git checkout 792d9294f652d753514dc2033a04d742decb82a5 .

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

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

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

Хотите режим отсоединения HEAD?

Если вы хотите откатить время X до определенного коммита с ОТДЕЛЕННОЙ ГОЛОВКОЙ (то есть вы не можете ничего испортить), то обязательно используйте следующее:

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

git checkout HEAD~X

И.Е.чтобы вернуться на один коммит:

git checkout HEAD~1

Вот пример, как это сделать

    cd /yourprojects/project-acme 


    git checkout efc11170c78 .

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

git checkout 5889575 .

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top