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

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

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

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

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

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

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

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

git checkout [revision] .

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

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

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

git reset --hard 

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

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

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

git reset --hard commit_sha

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

git reset --hard HEAD~10

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

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

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

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

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

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

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

Лучший ответ, который кто-то мог мне дать, - использовать 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 и вернуть все фиксации после него до 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 фактически удалит любые файлы, которые были добавлены в любой из коммитов, которые вы возвращаете, что делает это правильным способом для возврата диапазона изменений.

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

35
ответ дан 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

Что все.

20
ответ дан 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 завершить.

8
ответ дан 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
поделиться

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