it-swarm-ru.tech

Вернуть диапазон коммитов в git

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

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

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

git revert B-D

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

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

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

99
Alex Spurling

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

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


Как сообщает OP Alex Spurling в комментариях:

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

git revert B^..D 

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

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

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

git revert OLDER_COMMIT^..NEWER_COMMIT

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

git revert -n OLDER_COMMIT^..NEWER_COMMIT
git commit -m "revert OLDER_COMMIT to NEWER_COMMIT"
136
VonC

Если вы хотите вернуть диапазон фиксации 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

Спасибо Хонза Хэринг за исправление

9
Ramast

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

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

6
Orlando

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

0
Graham Borland