Вернуть диапазон коммитов в git - PullRequest
99 голосов
/ 14 февраля 2011

Как я могу вернуть диапазон коммитов в git? Просматривая документацию gitrevisions , я не вижу, как указать нужный диапазон. Например:

A -> B -> C -> D -> E -> HEAD

Я хочу сделать эквивалент:

git revert B-D

где результат будет:

A -> B -> C -> D -> E -> F -> HEAD

, где F содержит реверс B-D включительно.

Ответы [ 4 ]

136 голосов
/ 14 февраля 2011

Какую версию Git вы используете?

Возврат нескольких коммитов поддерживается только в Git1.7.2 +: см. " Откат к старому коммиту с использованием многократного возврата. " для получения дополнительной информации.детали.
Текущая git revert справочная страница предназначена только для текущей версии Git (1.7.4 +).


Как ОП Алекс Сперлинг сообщает в комментариях:

Обновление до 1.7.4 работает нормально.
Чтобы ответить на мой собственный вопрос, я искал синтаксис:

git revert B^..D 

B^ означает «первый родительский коммит B»: это позволяет включить в возврат B.
См. Раздел «git rev-parse УКАЗАНИЕ ПЕРЕСМОТРОВ * », который включает <rev>^, например, HEAD^ синтаксис: подробнее см. " Что означает символ каретки (^)? ")

Обратите внимание, что каждый отмененный коммитсовершается отдельно.

Хенрик N уточняет в комментарии :

git revert OLDER_COMMIT^..NEWER_COMMIT

Как показано ниже, вы можете вернуться без компрямо сейчас:

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
9 голосов
/ 24 января 2017

Если вы хотите вернуть диапазон фиксации B в D (по крайней мере, в git версии 2) в одном коммите, вы можете сделать

 git revert -n B^..D

Это отменит изменения, сделанные коммитами из родительского коммита B (исключено) для коммита D (включено), но не создает коммит с отмененными изменениями.Отмена только изменяет рабочее дерево и индекс.

Не забудьте зафиксировать изменения после

 git commit -m "revert commit range B to D"

Вы также можете отменить несколько несвязанных коммитов в одном коммите, используя тот же метод,например, чтобы вернуть B и D, но не C

 git revert -n B D
 git commit -m "Revert commits B and D"

Ссылка: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html

Спасибо Хонза Хэринг за коррекцию

6 голосов
/ 25 октября 2012

Выполнение git revert OLDER_COMMIT^..NEWER_COMMIT не сработало для меня.

Я использовал git revert -n OLDER_COMMIT^..NEWER_COMMIT и все хорошо.Я использую git версию 1.7.9.6.

0 голосов
/ 14 февраля 2011

Используйте git rebase -i, чтобы раздавить соответствующие коммиты в один. Тогда у вас есть только один коммит для возврата.

...