Как вы откатываете (сбрасываете) репозиторий Git до определенного коммита?
Я клонировал Git-репозиторий и затем попытался откатить его до определенного коммита в начале процесса разработки. Все, что было добавлено в хранилище после этого момента, для меня неважно, поэтому я хочу пропустить все последующие изменения в моем локальном исходном коде.
Однако, когда я пытаюсь выполнить откат в инструменте с графическим интерфейсом, он не обновляет мою локальную файловую систему - я всегда получаю последний исходный код проекта.
Как правильно получить исходный код репозитория для определенного коммита в истории проекта и пропустить все последующие обновления?
4 ответа
git reset --hard <tag/branch/commit id>
Заметки:
git reset
без--hard
опция сбрасывает историю коммитов, но не файлы. С--hard
опция файлы в рабочем дереве также сбрасываются. ( kauppi)Если вы хотите зафиксировать это состояние так, чтобы удаленный репозиторий также указывал на откат фиксации, выполните:
git push <reponame> -f
( Mariusz Nowak)
Обновить:
Из-за изменений в том, как создаются и перемещаются ветви отслеживания, я больше не рекомендую переименовывать ветви. Вот что я рекомендую сейчас:
Сделайте копию ветки в ее текущем состоянии:
git branch crazyexperiment
(The git branch <name>
Команда оставит вас с вашей текущей веткой все еще проверено.)
Сбросьте текущую ветку до желаемого коммита с помощью git reset
:
git reset --hard c2e7af2b51
(Заменить c2e7af2b51
с коммитом, к которому вы хотите вернуться.)
Когда вы решите, что ваша сумасшедшая ветка эксперимента не содержит ничего полезного, вы можете удалить это с помощью:
git branch -D crazyexperiment
Всегда приятно, когда вы начинаете с изменяющих историю команд git (reset, rebase), чтобы создать резервные ветви перед их запуском. В конце концов, когда вы будете чувствовать себя комфортно, вы не найдете в этом необходимости. Если вы изменяете свою историю таким образом, что вы не хотите и не создали резервную ветку, посмотрите на git reflog
, Git сохраняет коммиты довольно долго, даже если на них нет веток или тегов.
Оригинальный ответ:
Немного менее страшный способ сделать это, чем git reset --hard
Метод заключается в создании новой ветви. Давайте предположим, что вы на master
ветвь и коммит, к которому вы хотите вернуться, c2e7af2b51
,
Переименуйте вашу текущую главную ветку:
git branch -m crazyexperiment
Проверьте ваш хороший коммит:
git checkout c2e7af2b51
Сделайте вашу новую главную ветку здесь:
git checkout -b master
Теперь у вас все еще есть свой сумасшедший эксперимент, если вы хотите посмотреть на него позже, но ваша основная ветвь вернулась к вашей последней известной хорошей точке, готовой для добавления. Если вы действительно хотите отказаться от своего эксперимента, вы можете использовать:
git branch -D crazyexperiment
Для тех, у кого есть git gui, вы также можете использовать gitk.
Щелкните правой кнопкой мыши на коммите, к которому вы хотите вернуться, и выберите "Сбросить основную ветвь сюда". Затем выберите трудно из следующего меню.
Когда вы говорите "GUI Tool", я предполагаю, что вы используете Git For Windows.
ВАЖНО! Я бы настоятельно рекомендовал создать новую ветку, если вы этого еще не сделали. Таким образом, ваш мастер может оставаться прежним, пока вы проверяете свои изменения.
С графическим интерфейсом вам нужно "откатить этот коммит", как у вас с историей справа от вашего представления. Тогда вы заметите, что у вас есть все ненужные файлы в качестве изменений для фиксации слева. Теперь вам нужно щелкнуть правой кнопкой мыши на сером заголовке над всеми незафиксированными файлами и выбрать "игнорировать изменения". Это вернет ваши файлы к тому, как они были в этой версии.