git rebase после большого рефакторинга - PullRequest
3 голосов
/ 31 мая 2011

У меня есть 2 ветки, master и featureA. В ветке featureA я написал кучу нового кода в CoolFile.m. Эта функция еще не реализована, поэтому этот код еще не готов к объединению с мастером. CoolFile был очень плохо написан в прошлом, поэтому в ветке разработки я внес в него кучу изменений (в основном переупорядочивание методов, добавление комментариев и удаление пробелов).

Теперь я хочу перебазировать функцию А с мастера, чтобы получить выгоду от очищенного кода. Проблема состоит в том, что, поскольку все методы были перемещены, rebase пытается поместить весь новый код в неправильные места. Какой лучший способ это исправить? Должен ли я просто подождать, пока функция не будет выполнена для рефакторинга?

Ответы [ 2 ]

1 голос
/ 31 мая 2011

Вы можете объединить изменения из основной ветви в свою ветку featureA,

A--B--F--G--H master
   \
    \-C--D--E featureA

Предположим, что вы создали FeatureA из коммита B на мастере, и что C, D и E - коммиты, сделанные на FeatureA, а F и G - коммиты, которые переупорядочили методы и т. Д. Теперь вы хотите объединить F и G в ветку featureA.

$ git checkout featureA
$ git merge G (G is the sha1)

Или вы можете выбрать коммиты F и G в featureA. Помните, что вы все равно будете получать конфликты, и это всего лишь альтернативы вашему варианту ребазирования.

В будущем я бы порекомендовал вам выполнить рефакторинг либо непосредственно в FeatureA, либо из другой ветви, ответвляясь от FeatureA:

A--B--F--G--H master
   \
    \-C--D--E featureA
         \
          \-I--J--K refactorFeatureA

Тогда объединить ветвь рефакторинга с FeatureA очень просто, поскольку объединение будет тривиальным.

1 голос
/ 31 мая 2011

Я могу ошибаться, являясь чем-то вроде git newb, но способ перебазирования работает так: он находит самого последнего общего предка дочерней ветви из ветви источника (в данном случае master), а затем применяет новые коммиты источник, а затем новые коммиты дочерней ветви на дочернюю ветвь (другими словами, это как если бы вы получили самый последний мастер, а затем воссоздали свою ветвь, commit by commit). Так что ожидание не принесет вам пользы, поскольку оно будет применять все коммиты из обеих веток.

Я считаю, что лучший способ - просто прикусить пулю и выполнить слияние. Обратитесь к другим разработчикам, чтобы вы могли выбрать, какой код вы хотите разрешить при конфликтах слияния.

Я также считаю, что выполнение небольших коммитов облегчает перебазирование / слияние. Так что не делайте рефакторинг функций x, а затем фиксируйте, фиксируйте после каждого рефакторинга. На самом деле речь идет о поиске баланса - не фиксируйте каждое изменение строки, но делайте коммиты как можно меньше, когда это имеет смысл.

...