Поверніть діапазон комітетів у git


127

Як я можу відновити діапазон комітетів у git? Переглядаючи документацію щодо gitrevision , я не бачу, як вказати потрібний мені діапазон. Наприклад:

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

Я хочу зробити еквівалент:

git revert B-D

де був би результат:

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

де F містить реверс BD включно.


В кінці сторінки gitrevision (7) є розділ, який очолює "СПЕЦІФІКАЦІЙНІ ХАРАКТЕРИСТИКИ". Чим те, що ви хочете, відрізняється від описаного там?
Гарет Маккоган,

2
Сторінка gitrevision передбачає, що 'git revert A..D' буде робити те, що я хочу. Однак коли я намагаюся отримати помилку "фатально: Не можу знайти" A..D ""
Alex Spurling

Відповіді:


172

Яку версію Git ви використовуєте?

Повернення кількох комітетів, які підтримуються лише у Git1.7.2 +: див. " Відкат до старої фіксації, використовуючи кілька разів повернення ".
Поточна git revertсторінка man призначена лише для поточної версії Git (1.7.4+).


Як повідомляє в коментарях ОП Алекс Спрінг :

Оновлення до 1.7.4 працює чудово.
Щоб відповісти на моє власне запитання, це синтаксис, який я шукав:

git revert B^..D 

B^означає "перший батьківський комітет B": що дозволяє включити Bдо відновлення.
Див. git rev-parseРозділ " СПЕЦІФІКАЦІЙНІ РЕЦІЗІЇ ", який включає <rev>^, наприклад,HEAD^ синтаксис: докладніше див. У розділі " Що означає символ caret ( ^)? ")

Зауважте, що кожне повернене зобов’язання здійснюється окремо.

Генрік Н уточнює в коментарях :

git revert OLDER_COMMIT^..NEWER_COMMIT

Як показано нижче, ви можете повернути їх, не скориставшись відразу:

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

1
Дякую, це була відповідь. Оновлення до 1.7.4 працює чудово. Щоб відповісти на моє власне запитання, це той синтаксис, який я шукав: git revert B ^ .. D
Alex Spurling

геній. Дякую. Мені не прийшло в голову, що мені потрібно повернути комісії у зворотному порядку, щоб застосувати патчі, так. Ця команда показує шлях.
Тім Абелл

5
Я часто звертаюся до цієї відповіді, і для того, щоб розібратися в порядку, завжди потрібно час. Отож, щоб допомогти моєму майбутньому:git revert OLDER_COMMIT^..NEWER_COMMIT
Генрік Н

2
що означає ^?
Дастін Гец

1
@DustinGetz перший батьків: див. Git-scm.com/docs/gitreitions : "Суфікс ^до параметра перегляду означає перший батьківський об'єкт цього об'єкта".
VonC

15

Якщо ви хочете повернути діапазон комісій від B до D (принаймні, у версії 2 git) за один комітет, ви можете це зробити

 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

Дякую Honza Haering за виправлення


3
git revert -n B..Dне повертає виконувати B, лише C і D. також git revert -n B^..Dповертає B.
Honza Haering

згідно з git документацією, що це робить. посилання в дописі
Рамаст

1
Якщо ви посилаєтесь на цей приклад (який, на мою думку, є дещо заплутаним) у посиланні:, git revert -n master~5..master~2він говорить про включення п'ятого останнього комітету. Але master~5це насправді шостий останній комітет. Дивіться підбірку редакцій у git docs для детальної інформації про ..нотацію :-)
Honza Haering

6

Робити git revert OLDER_COMMIT^..NEWER_COMMITмені не вдалося.

Я звик git revert -n OLDER_COMMIT^..NEWER_COMMITі все добре. Я використовую версію git 1.7.9.6.


У мене була така ж проблема і виправити її за допомогою -n, але вам слід залишити ^ з OLDER_COMMIT (повернення git -n OLDER_COMMIT ^ .. NEWER_COMMIT).
FeelGood

@FeelGood чому ти повинен покинути ^?
Орландо

У мене була історія A -> B -> C, а метою було повернути B і C. Коли я запускаю 'git revert -n B..C', було повернуто лише C. Коли я використав 'git revert -n B ^ .. C', git повернув обидва коміти. Можливо, я зробив щось не так.
FeelGood

круто, добре перевірити це, але я думаю, що в моєму випадку спрацювало добре (якщо я не повертаю діапазон 1 фіксація, хай), я зміню відповідь, щоб включити ^. дякую
Орландо

2
Опція -nor --no-commitповерне всі зміни в межах діапазону за один комітет, замість того, щоб створювати комісію для відновлення для кожного коміту в діапазоні. Кінцевий результат такий же, як і в тому ж зміні, які будуть повернені. Просто залежить, як ви хочете виглядати вашу історію git.
Денніс

0

Використовуйте git rebase -iдля того, щоб розбити відповідні зобов’язання. Тоді у вас є лише одна зобов’язання відновити.


7
Якщо ви використовуєте git rebase, ви можете просто видалити коміти. Я думаю, що є причина не перезавантажуватись, як, наприклад, бажаючи, щоб SHA1 передавала F однаково.
Paŭlo Ebermann

5
Крім того, розімніть обертання, що повертається, в одне ціле.
аеосинт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.