Восстановление из ветки git, где было выполнено несколько сбросов и отправлено в источник (например, Atlassian Stash)

Несмотря на все усилия, мы попали в затруднительное положение с функциональной веткой в ​​нашем репозитории Git. Конечным результатом является то, что git diff develop..feature-branch показывает совершенно неожиданную разницу.

Например, один файл, который был добавлен при разработке, отображается как удаленный в файле diff. Многие другие файлы показывают аналогичные проблемы, некоторые отсутствуют, некоторые добавлены, много неожиданных изменений. Некоторые файлы, которые должны были быть в develop, даже не отображаются в diff. Впервые мы заметили проблему в Atlassian Stash, когда отправились проверять код с помощью запроса на слияние. Ожидающее слияние полностью и совершенно неверно и не может быть разрешено с помощью стандартного разрешения конфликтов во время слияния.

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

  1. Ветка Feature создана из разработки
  2. Работа, выполненная на функциональной ветке
  3. Запрос на вытягивание, созданный в Atlassian Stash (PR выглядит нормально, но предлагаются некоторые незначительные правки)
  4. Разработчик использует сброс, чтобы отменить некоторые изменения, и отправляет их в исходное состояние.
  5. Тем временем замечены небольшие конфликты между ветками разработки и фичей.
  6. Обновления для разработчиков включают ветку от разработки для разрешения конфликтов и отправки к источнику.
  7. Запрос на включение (diff) показывает неожиданный diff, резко отличающийся от предыдущего. Файлы, которые должны быть зафиксированы, отсутствуют, и наоборот
  8. Я пытаюсь отменить (вернуть, а не сбросить) «плохое» слияние и повторить попытку. Однако PR/diff показывает те же неправильные изменения для ожидающего слияния.
  9. Затем я узнаю, что разработчик использовал сброс где-то до первого слияния из разработки.

Итак, у меня три вопроса.

  1. Как нам нужно «восстановить» исправленную ветку функций, чтобы мы могли правильно объединить наши изменения в разработку? Моя идея состоит в том, чтобы создать новую «хорошую» ветку функций из фиксации в нашей ветке функций, которая, как известно, происходит до сброса. Затем я могу выбрать нужные коммиты из «плохой» ветки функций в «хорошую», чтобы воссоздать их. Наконец, я могу объединить «хорошую» ветвь функции с разработкой и удалить «плохую».

  2. Если бы я объединил «плохую» ветвь функций с разработкой, помимо неправильного состояния файлов, не было бы других «повреждений», просочившихся в ветку разработки. То есть, будет ли загрязненная «плохая» ветка функций еще больше загрязнять ветку разработки и все, что ниже по течению от нее? Я не планирую этого делать, конечно, но я хочу понять последствия.

  3. Будут ли сбросы, как я их описал, вызывать проблемы, которые я вижу, или это, возможно, связано с чем-то другим?


person Ryan Taylor    schedule 20.07.2014    source источник
comment
Единственный способ, которым мог бы произойти этот сценарий, — это если бы другой разработчик сделал принудительную отправку в источник на шаге № 4 (поскольку отправка была бы отклонена из источника, если бы это не было ускоренное слияние). Вы знаете, так ли это?   -  person Patrick    schedule 21.07.2014
comment
Патрик, нет. Разработчик не делал принудительной отправки в источник, однако изменения были отправлены.   -  person Ryan Taylor    schedule 21.07.2014


Ответы (1)


«Сброс» разработчика, вероятно, не повлиял на источник, если он / она не сделал «принудительный толчок» к источнику. По моему опыту, подобные вещи происходят из-за плохого слияния или процесса разрешения конфликтов (т. е. я подозреваю, что что-то в шаге № 6 выше является виновником). Инстинкты верны; лучше всего создать новую ветку перед неудачным слиянием (например, "feature-branch2") и отказаться от исходной ветки (поскольку трудно отменить слияния или любые другие изменения, которые уже были отправлены в источник) и повторить попытку слияния что пошло плохо.

Я не уверен, что «возврат» - это действительно то, что вы хотите сделать, чтобы отменить плохое слияние. Я так понимаю, что «revert» в обратном порядке применяет патч из одной фиксации, и попытка обратного применения слияния звучит липко, поскольку слияния — это 2 различия в 1 фиксации (у меня нет большого опыта с «revert», поэтому может быть, это можно сделать, я не уверен). Самый безопасный и надежный способ решить эту проблему — создать новую ветку и прекратить использовать ветку с неправильным слиянием.

person Patrick    schedule 21.07.2014
comment
Ответом было создание новой ветки из последней удачной фиксации. Мы решили, что нам не нужно выбирать какие-либо коммиты из последнего известного хорошего коммита, и просто объединились в новой ветке без проблем. - person Ryan Taylor; 21.07.2014