Как я могу отменить ряд коммитов в git? Глядя на документацию gitrevisions , я не вижу, как указать нужный мне диапазон. Например:
A -> B -> C -> D -> E -> HEAD
Я хочу сделать эквивалент:
git revert B-D
где результат будет:
A -> B -> C -> D -> E -> F -> HEAD
где F содержит знак, обратный BD включительно.
Ответы:
Какую версию Git вы используете?
Отмена нескольких коммитов поддерживается только в Git1.7.2 +: см. « Откат к старой фиксации с использованием многократного отката » для более подробной информации.
Текущая
git revert
страница руководства предназначена только для текущей версии Git (1.7.4+).Как сообщает в комментариях ОП Алекс Сперлинг :
Обновление до 1.7.4 работает нормально.
Чтобы ответить на мой собственный вопрос, это синтаксис, который я искал:
B^
означает «первый родительский коммит B»: что позволяет включитьB
в откат.См. Раздел «
git rev-parse
УКАЗАНИЕ ИЗМЕНЕНИЙ », который включает<rev>^
, например,HEAD^
синтаксис: подробнее см. « Что означает^
символ каретки ( )? »)Обратите внимание, что каждая отмененная фиксация совершается отдельно.
Хенрик Н поясняет в комментариях :
Как показано ниже, вы можете вернуться, не выполняя сразу:
источник
git revert OLDER_COMMIT^..NEWER_COMMIT
^
параметра ревизии означает первого родителя этого объекта фиксации».Если вы хотите вернуть диапазон фиксации B в D (по крайней мере, в git версии 2) за одну фиксацию, вы можете сделать
Это отменяет изменения, сделанные коммитами из родительского коммита B (исключено), в коммит D (включено), но не создает никаких коммитов с отмененными изменениями. Откат изменяет только рабочее дерево и индекс.
Не забудьте зафиксировать изменения после
Вы также можете отменить несколько несвязанных коммитов за один коммит, используя тот же метод. например, чтобы вернуть B и D, но не C
Ссылка: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html
Спасибо Хонзе Херинг за исправление
источник
git revert -n B..D
не отменяет фиксацию B, только C и D. такжеgit revert -n B^..D
возвращают B.git revert -n master~5..master~2
он говорит, что включен пятый последний коммит. Ноmaster~5
на самом деле это 6-й последний коммит. См. Выбор ревизии в документации git для получения подробной информации об..
обозначениях :-)Это
git revert OLDER_COMMIT^..NEWER_COMMIT
не помогло мне.Я привык
git revert -n OLDER_COMMIT^..NEWER_COMMIT
и все хорошо. Я использую версию git1.7.9.6
.источник
-n
или--no-commit
отменит все изменения в диапазоне за одну фиксацию, вместо того, чтобы создавать откатную фиксацию для каждой фиксации в диапазоне. Конечный результат такой же, как и в, те же изменения будут отменены. Просто зависит от того, как вы хотите, чтобы ваша история git выглядела.Используйте,
git rebase -i
чтобы объединить соответствующие коммиты в один. Тогда вам нужно будет отменить только одну фиксацию.источник