Вот рабочий процесс, который я обычно рассматриваю на работе.
git checkout -b feature_branch
# Do some development
git add .
git commit
git push origin feature_branch
В этот момент ветвь функции просматривается у моих коллег, но я хочу продолжать разрабатывать другие функции, зависящие от feature_branch
. Итак, пока feature_branch
находится в обзоре...
git checkout feature_branch
git checkout -b dependent_branch
# Do some more development
git add .
git commit
Теперь я вношу некоторые изменения в ответ на обзор кода на feature_branch
git checkout feature_branch
# Do review fixes
git add .
git commit
git checkout dependent_branch
git merge feature_branch
Теперь у нас возникают проблемы. У нас есть политика squash на master, а это означает, что ветки функций, которые объединены в master, должны быть сжаты в один commit.
git checkout feature_branch
git log # Look for hash at beginning of branch
git rebase -i first_hash_of_branch # Squash feature_branch into a single commit
git merge master
Все круто, кроме dependent_branch
. Когда я пытаюсь переустановить зависимую ветвь на master или пытаюсь объединить в нее мастер, git путается переписанной/сжатой историей и в основном отмечает каждое изменение в depedendent_branch
как конфликт. Это PITA, чтобы пройти и в основном повторить или де-конфликтовать все изменения в dependent_branch
. Есть ли какое-то решение? Иногда я вручную создаю патч и применяю его к новой ветке мастера, но если есть какие-то реальные конфликты с этим, еще хуже, чтобы исправить.
git checkout dependent_branch
git diff > ~/Desktop/dependent_branch.diff
git checkout master
git checkout -b new_dependent_branch
patch -p1 < ~/Desktop/dependent_branch.diff
# Pray for a clean apply.
Любые идеи? Я знаю, что это происходит из-за переписанной истории во время сквоша, но это требование, которое я не могу изменить. Какое лучшее решение/обходное решение? Есть ли какая-то магия, которую я могу сделать? Или существует более быстрый способ выполнить все шаги, связанные с ручным созданием diff?