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

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

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

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

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

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

вопрос задан 5.01.2010
David
2788 репутация

8 ответов


  • 922 рейтинг

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

    git checkout [revision] .
    

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

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

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

    git reset --hard 
    

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

    ответ дан Alex Reisner, с репутацией 22252, 5.01.2010
  • 159 рейтинг

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

    git reset --hard commit_sha
    

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

    git reset --hard HEAD~10
    

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

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

    ответ дан Naga Kiran, с репутацией 4939, 14.02.2013
  • 76 рейтинг

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

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

    ответ дан Ben, с репутацией 5976, 5.01.2010
  • 36 рейтинг

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

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

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

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

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

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

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

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

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

    git revert -m 1 
    

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

    git revert лучше git checkout

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

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

    ответ дан does_not_exist, с репутацией , 21.04.2014
  • 20 рейтинг

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

    git log
    

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

    [Comp:Folder User$ git log
    commit 54b11d42e12dc6e9f070a8b5095a4492216d5320
    Author: author 
    Date:   Fri Jul 8 23:42:22 2016 +0300
    
    This is last commit message
    
    commit fd6cb176297acca4dbc69d15d6b7f78a2463482f
    Author: author 
    Date:   Fri Jun 24 20:20:24 2016 +0300
    
    This is previous commit message
    
    commit ab0de062136da650ffc27cfb57febac8efb84b8d
    Author: author 
    Date:   Thu Jun 23 00:41:55 2016 +0300
    
    This is previous previous commit message
    ...
    

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

    git checkout fd6cb176297acca4dbc69d15d6b7f78a2463482f
    

    Вот и все.

    ответ дан Igor, с репутацией 7168, 12.07.2016
  • 8 рейтинг
    git read-tree -um @ $commit_to_revert_to
    

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

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

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

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

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

    ответ дан jthill, с репутацией 26403, 6.02.2016
  • 1 рейтинг

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

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

    ответ дан ken, с репутацией 46, 22.02.2017
  • 0 рейтинг

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

    git checkout 8a0fe5191b7dfc6a81833bfb61220d7204e6b0a9 .
    

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

    git checkout 792d9294f652d753514dc2033a04d742decb82a5 .
    

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

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

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

    ответ дан Donato, с репутацией 1657, 21.09.2018