Я склонен использовать 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
.