Как вы откатываете (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.
ВАЖНО, я бы очень рекомендовал создать новую ветку, чтобы сделать это, если вы еще этого не сделали. Таким образом, ваш мастер может оставаться тем же, пока вы проверяете свои изменения.
С графическим интерфейсом вам нужно "отменить эту фиксацию", как у вас, с историей справа от вашего представления. Затем вы заметите, что у вас есть все нежелательные файлы, как изменения для фиксации слева.
Теперь вам нужно щелкнуть правой кнопкой мыши по серому заголовку над всеми неуправляемыми файлами и выбрать "игнорировать изменения". Это вернет ваши файлы к тому, как они были в этой версии.