Почему это не удалось? - PullRequest
       112

Почему это не удалось?

1 голос
/ 10 июня 2019

При попытке отменить коммит, который не является последним в моей ветке, я наткнулся на это сообщение:

error: commit fce9354*** is a merge but no -m option was given.
fatal: revert failed

Вот git log ветви непосредственно перед попыткой возврата:

C:\git\manager [feature/revert]> gl -n15 --oneline
a81945f (HEAD -> feature/revert, origin/develop, develop) Merge branch 'develop' of https://xyz/manager into develop
60cf3e5 Merge branch '***' into develop
b94fc85 Merge branch '***' into develop
9d81bc6 (origin/***) Accept 
48b318d (origin/***) Accept 
6f57592 ***
d823f1f (origin/***) removed 
854887b *** merged
0ebef20 added 
fce9354 Merged PR 12345: Add 
90f2b0f (origin/***) Add 
c859184 Merge branch '***' into develop
a1afdb3 Change 
fb48628 added 
2641680 added 
C:\git\manager [feature/revert]> git revert fce9354
error: commit fce9354*** is a merge but no -m option was given.
fatal: revert failed

Я понимаю, что revert - это, по сути, новый коммит, созданный для отмены предыдущего коммита.

Документация git revert для флага -m:

Обычно вы не можете отменить слияние, потому что не знаете, с какой стороны слияния следует считать основной. Эта опция указывает родительский номер (начиная с 1) основной линии и позволяет вернуться отменить изменение относительно указанного родителя.

Как найти значение, которое я должен предоставить для флага -m?

Я хочу удалить только коммит, который представляет слияние ветви с веткой develop, чтобы я мог исправить ветку и создать более позднее слияние, которое вводит все в ветку обратно в develop. То есть: я не хочу предотвращать слияние предыдущих изменений в ветке с develop позже.

Есть ли более простой способ отменить изменения предыдущего коммита?

1 Ответ

3 голосов
/ 10 июня 2019

Типичный коммит слияния будет показан как показано ниже в выводе команды git log.

commit dddfd0b6d529bfcdcd6515555ea1dcf186fe338
Merge: 6b5619b 40ad694
Author: Raja Anbazhagan <raja.anbazhagan@example.com>
Date:   Fri Jun 7 03:11:23 2019 +0530

    Merge branch 'xyz' into 'develop'

Здесь вы можете видеть, что вторая строка содержит два коротких хэша. 6b5619b и 40ad694. Оба из них - самые верхние коммиты из ветвей, которые были объединены.

Здесь 6b5619b - это самый верхний идентификатор коммита ветви develop. И 40ad694 является самым верхним коммитом ветви функции xyz.

Я говорю вам все это потому, что эта информация важна для того, что я собираюсь объяснить дальше.

Когда вы сбрасываете или отменяете коммит, он пытается выяснить, что изменилось в этом коммите, сравнивая его с коммитом-предком.

В этом случае есть два предка 6b5619b и 40ad694, и GIT теперь не уверен, от какого предка он должен найти разницу.

В этих случаях пользователь должен будет предоставить соответствующий идентификатор родительского коммита для продолжения процесса. Это делается с помощью флага -m, за которым следует порядковый номер, представляющий, где находится идентификатор родительского коммита в коммите слияния.

для моего образца слияния, возможные значения -m: 1 и 2. 1 для 6b5619b и 2 для 40ad694.

Так что, если вы хотите вернуть свой код в свою ветку разработки, вам нужно сделать

git revert -m 1 <merge-commit>

С -m 1 возврат git происходит по релевантности для развивающейся ветви (первого родителя слияния). Передача -m 2 приведет к возврату в соответствии с ветвью объекта xxx

В общем случае -m 1 - это тот, который вы должны использовать. Но это не так для всех случаев.

...