Как отменить коммит слияния с новым коммитом после него? - PullRequest
0 голосов
/ 04 апреля 2020

Я уже знаю, как отменить коммит слияния, включая выбор родителей.
Но теперь я сталкиваюсь с другой ситуацией, когда после коммита слияния возникает новый коммит.

Просмотр:

enter image description here

Вы можете видеть, что после коммита слияния "2" появляется новый коммит "1".
Все, что я хочу, это отменить слияние «3» мастеру филиала. (Я знаю, что «2» - это коммит слияния).

Вопрос:

Как я могу отменить коммит слияния с красной стрелкой? Я пронумеровал относительные коммиты, чтобы было легче сослаться в ответе.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2020

Я склонен использовать Tower в качестве моего git клиента , здесь вы можете увидеть, как я прямо возвращаю старую фиксацию .

Без переписывания истории:

Сначала отмените вещь, от которой вы хотите избавиться локально:

 git revert sha-of-2 -m X

Где X - родительский номер (в данном случае, вероятно, 1). Подробнее см. Здесь .

Устранить любые возникающие проблемы слияния. Разрешение этих потенциальных конфликтов обеспечит правильное применение 1 без необходимости сначала его отменять. затем commit и pu sh.

Результат будет:

-- 4 -- 2 -- 1 -- '2 <- master
        /
-- 3 --/

, где '2 - обратное значение 2.

С переписыванием истории:

ПРЕДУПРЕЖДЕНИЕ : принудительное нажатие на мастер после переписывания истории может оказать серьезное негативное влияние на других пользователей той же ветви.

Выполнить интерактивную перебазировку :

 git rebase -i sha-of-2

сбросить коммит слияния, оставить коммит 1, затем принудительно pu sh master.

Результат будет:

-- 4 -- '1 <- master

-- 3

Где '1 это новый коммит с исходными изменениями 1 плюс все конфликты, которые вы разрешили.

Переписывание истории с использованием новой ветки

WARNING : принудительное нажатие на master после переписывания история может оказать серьезное негативное влияние на других пользователей той же ветки.

Это может быть легче понять. Он делает то же самое, что и в примере с rebase, но вместо того, чтобы применять rebase-fairy-dust, вы выполняете тяжелую работу самостоятельно.

Вместо того, чтобы перебазировать, вы можете заново выполнить эти изменения самостоятельно. Сбросьте до 4, создайте новую ветвь, выберите вишню 1, сбросьте мастер до '1 и введите pu sh.

     /- '1 <- master
    /
-- 4 -- 2 -- 1
        /
-- 3 --/

git reset --hard sha-of-4
git checkout -B newmaster
git cherry-pick sha-of-1
# fix conflicts if any
git checkout master
git reset master --hard newmaster
git push --force

Где '1 - выбранная вишня версия 1.

0 голосов
/ 04 апреля 2020

В командной строке это должно быть так же просто, как git revert 2, хотя я знаю, что иногда откат слияний может быть затруднен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...