Откат от старого Git фиксации в публичном репо

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

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

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

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

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

504
задан David 05 янв. '10 в 20:01
источник поделиться

8 ответов

Попробуйте следующее:

git checkout [revision] .

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

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

Вы можете отменить это с помощью

git reset --hard; 

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

745
ответ дан Alex Reisner 05 янв. '10 в 20:07
источник поделиться

Откат к конкретному фиксации:

git reset --hard commit_sha

Откат 10 завершает работу:

git reset --hard HEAD~10

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

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

133
ответ дан Naga Kiran 14 февр. '13 в 14:01
источник поделиться

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

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

69
ответ дан Ben 05 янв. '10 в 20:04
источник поделиться

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

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

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

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

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

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

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

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

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

git revert -m 1 <merge-commit>

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

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

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

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

27
ответ дан user456814 21 апр. '14 в 23:12
источник поделиться

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

Что все.

13
ответ дан Igor 12 июля '16 в 18:27
источник поделиться
git read-tree -um @ $commit_to_revert_to

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

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

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

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

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

3
ответ дан jthill 06 февр. '16 в 23:14
источник поделиться

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

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

1
ответ дан ken 22 февр. '17 в 14:45
источник поделиться

Я думаю, что понимаю ваши вопросы, вот что я нашел для его решения. и нет никакого GUI-решения, вы можете использовать команду только для ее решения, и это очень просто.

Шаг 1: создайте тег старого коммита, который вы хотите вернуться.

как тег v2.0

Шаг 2: git checkout v2.0

вот он, теперь ваш HEAD указывает на 'v2.0' commit, но мастер все еще указывает на последнюю фиксацию.

C:\Program Files\ Git\doc\Git\html\git -checkout.html этот документ может помочь вам

или введите git help < выезд >

0
ответ дан Zian Lai 02 дек. '17 в 23:47
поделиться

Другие вопросы по меткам