Вот рабочий процесс, с которым я обычно сталкиваюсь на работе.
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
Вот здесь и возникают проблемы. У нас есть политика сжатия для мастера, что означает, что ветки функций, которые объединены в мастер, должны быть объединены в одну фиксацию.
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 или попытаться слить с ней master, git смущен переписанной / сжатой историей и в основном отмечает каждое изменение depedendent_branch
как конфликт. Это PITA, чтобы пройти и, по сути, переделать или разрешить конфликты всех изменений вdependent_branch
. Есть ли какое-то решение? Иногда я вручную создаю патч и применяю его к новой ветке master, но если с этим есть какие-то реальные конфликты, исправить это еще хуже.
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.
Есть идеи? Я знаю, что это происходит из-за переписывания истории во время сквоша, но это требование я не могу изменить. Какое лучшее решение / обходной путь? Могу ли я творить волшебство? Или есть более быстрый способ выполнить все шаги, связанные с созданием разницы вручную?
git add .
это полностью зло и в конечном итоге укусит вас, когда вы закончите совершать поступки, которых не хотели. Вы должны использоватьgit add -p
или, по крайней мере,git add -u .