Как вы откатываете (сбрасываете) репозиторий 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.

ВАЖНО! Я бы настоятельно рекомендовал создать новую ветку, если вы этого еще не сделали. Таким образом, ваш мастер может оставаться прежним, пока вы проверяете свои изменения.

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

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