Как вы откатываете (reset) репозиторий Git для определенного коммита?

Я клонировал репозиторий Git, а затем попытался вернуть его к определенному коммиту в начале процесса разработки. Все, что было добавлено в репозиторий после этого момента, для меня неважно, поэтому я хочу опустить все последующие изменения из моего локального исходного кода.

Однако, когда я пытаюсь вернуться в GUI-инструмент, он не обновляет мою локальную файловую систему - я всегда получаю последний исходный код для проекта.

Каков правильный способ просто получить источник для репозитория как конкретного коммита в истории проекта и опустить все последующие обновления?

Ответ 1

git reset --hard <tag/branch/commit id>

Примечания:

  • git reset без опции --hard сбрасывает историю фиксации, но не файлы. С опцией --hard файлы в рабочем дереве также reset. (зачисленный пользователь)

  • Если вы хотите зафиксировать это состояние, чтобы удаленный репозиторий также указывал на отмененную транзакцию, выполните: git push <reponame> -f (зачисленный пользователь)

Ответ 2

Обновление:

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

Сделайте копию ветки в ее текущем состоянии:

git branch crazyexperiment

(Команда git branch <name> оставит вас с вашей текущей веткой, все еще вычеркнутой.)

Reset текущая ветка к вашему желаемому фиксации с помощью 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

Ответ 3

Для тех, у кого есть git gui bent, вы также можете использовать gitk.

Щелкните правой кнопкой мыши на фиксации, к которой вы хотите вернуться, и выберите "Reset master branch to here". Затем выберите из следующего меню.

Ответ 4

Когда вы говорите "GUI Tool", я предполагаю, что вы используете Git для Windows.

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

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