massef
@massef

Как откатиться в старой ветке?

Привет. Суть в следующем.

Внешний разработчик создал ветку условно [branch-1] внес в нее изменения и запушил в удаленный репозиторий.
Далее я сфечил все новые ветки и переключился на появившуюся ветку [branch-1], внес много изменений и запушил. Параллельно другие разработчики выполняли свои задачи и в конечном итогде все это смержилось в мастер, в том числе и ветка [branch-1] с моими изменениями.

Выявили баг. Просто откатит мастер не выйдет, есть риск что-то сломать т.к было затронуто много кодовой базы, фиксить в текущей версии тоже сложно. Нужно откатить ветку [branch-1] до начального состояния и запушить как есть. У меня сомнения как правильно это сделать.
1. Создать ветку от текущего мастера/дева, откатить ветку [branch-1] локально путем git reset --hard HEAD^ до нужно коммита и смержить ее в новую ветку?
2. Тоже самое, только вместо git reset переключиться к нужному коммиту по его хешу?
3. ....?

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

Во всех других случаях высокий шанс что-то сломать, а заодно придётся произвести форспуши как минимум в 2 ветках, в т.ч. в мастер.
Ответ написан
Lobotomist
@Lobotomist
Software Developer
Коротко

В вашем случае нужно ответвиться от текущего мастера, сделать реверт ненужных изменений (всех изменений ветки, видимо) и смерджить с мастером. Если после ответвления "ветки отката" в мастере появились новые изменения - стоит сначала влить их в ветку, решить возможные конфликты, протестировать и только после этого вливать эту ветку в мастер.

Подробно

git reset --hard commitref, выполненный в master перенесет его указатель на коммит commitref и это в вашем случае не вариант ни при каких условиях, так как master публичная ветка и перезаписывать историю в ней нельзя.

Убрать коммиты из мастера вы уже никак не можете. Остается только вариант создать коммит(ы), который откатывает часть изменений. Именно это и делает команда git revert. Если откатить нужно всё, что было влито в мастер при слиянии branch-1 и master можно использовать опцию -m для того, чтобы указать относительно какого коммита нужно откатывать изменения.

Сначала узнаете, какой номер у предыдущего (перед вливанием branch-1) коммита master. Один из вариантов выполнить команду, где branch-1-mergeTo-master - коммит слияния branch-1 и master.
git log -3 --graph branch-1-mergeTo-master

В информации о коммите будет строчка, типа такой:
*   commit 5788ae1df77ce0911f802530b1208f1709c102d4
|\  Merge: 04d469b 57ed6bd


Предположим, что коммит мастера имеет id = 04d469b. Тогда его номер - 1. Делаем реверт. Примерные команды:

git checkout master
git checkout -b branch-1-revert

git revert -m 1 branch-1-mergeTo-master

git commit -m "branch-1 reverted from master"

git merge master
git checkout master
git merge branch-1
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы