Работа с конфликтами слияния в будущих обновлениях - PullRequest
1 голос
/ 10 апреля 2019

Ищете лучшие практики здесь. Наш процесс состоит в том, что мы создаем новую ветку от master

master --> myBranch

сделайте наши обновления, затем нажмите dev

myBranch --> dev

Очевидно, что иногда у нас возникают конфликты слияний на dev. В этой ситуации мы проверяем наш филиал через:

git fetch origin myBranch
git checkout dev
git merge FETCH_HEAD

Затем мы разрешаем наши конфликты и ...

git push origin HEAD

Мое понимание вышеизложенного состоит в том, что я вручную сливаю myBranch в dev, а затем отправляю свои локальные изменения dev в remote.

Это обычно конец.

Но теперь мне нужно сделать дополнительные обновления в myBranch и нажать на dev, и вот тут я в тупике. Не получу ли я сейчас (вероятно) те же конфликты, что и раньше? Какова лучшая практика здесь? Должен ли я делать git pull origin dev, чтобы обновить собственную ветку, чтобы она соответствовала dev?

1 Ответ

2 голосов
/ 10 апреля 2019

Краткий ответ

Используйте эту последовательность для извлечения удаленных данных и обновления ваших веток:

git checkout myBranch
git pull

git checkout dev
git pull

git merge myBranch
... resolve conflicts ...
git push HEAD


Существует вероятность того, что подобные конфликты снова возникнут в будущем, если myBranch снова отредактирует те же части файлов. Однако конфликты никогда не будут одинаковыми. Если вы все еще хотите этого избежать - вам нужно увеличить коммит слияния до myBranch (но учтите, что все dev изменения будут myBranch):

git checkout myBranch
git merge dev
... this is a Fast-Forward merge ...
git push HEAD

Длинный ответ

Ваше понимание верно:

... Я вручную сливаю myBranch в dev, а затем отправляю свои локальные изменения в dev на удаленное устройство.

и это тоже почти правильно:

Должен ли я делать git pull origin dev, чтобы обновить собственную ветку, чтобы она соответствовала dev?

Итак, да - текущий подход действительно сливает myBranch в dev вручную, а затем dev отправляется в удаленный репозиторий. И да - лучше сначала обновить ваш локальный dev.

Есть пара предположений, которые не являются правильными, и замечательно, что вы создали вопрос SO для их проверки.

Прежде всего - git pull origin dev - не универсально правильная команда для обновления вашей локальной ветки dev. Он вытягивает удаленные dev изменения, но обновляет локальную ветку dev, только если вы уже подключены к ней. Похоже, что вы не - потому что в приведенном примере вы проверяете эту ветвь перед слиянием FETCH_HEAD. Так что советуем либо проверить ветку перед тем, как вытащить ее изменения:

git checkout dev
git pull origin dev

git fetch origin myBranch
git merge FETCH_HEAD

git push HEAD

или используйте другую команду, чтобы получить изменения и обновить локальную ветку (вы не должны быть в этой ветке в настоящее время):

git fetch origin dev:dev
git checkout dev

git fetch origin myBranch
git merge FETCH_HEAD

git push HEAD

Но, вероятно, более простым является получение всех обновлений, а затем объединение необходимых веток:

git checkout dev
git pull
git merge origin/myBranch

git push HEAD

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

git checkout myBranch
git pull

git checkout dev
git pull

git merge myBranch
git push HEAD

Второе:

Должен ли я делать git pull origin dev, чтобы обновить собственную ветку, чтобы она соответствовала dev?

Это необходимо не только для слияния, но и для вашей способности отодвигать изменения назад. Если вы не будете обновлять свой локальный dev, в то время как удаленный имеет некоторые изменения в dev, то вы буквально не сможете отправить свой коммит слияния в удаленный репозиторий, и вам нужно будет сначала разрешить еще больше конфликтов .

Третье:

Мне нужно сделать дополнительные обновления для myBranch ... Не получу ли я сейчас (вероятно) те же конфликты, что и раньше?

Это возможно, хотя конфликты не будут такими же. Чтобы получить их, myBranch потребуется изменить части кода, которые вы изменили в dev (в том числе в этом коммите слияния). Изменение кода в других файлах или даже в других частях того же файла не приведет к конфликтам. Чтобы избежать конфликтов, лучше также синхронизировать myBranch с dev (если вы можете видеть другие dev изменения, доходящие до myBranch):

... do all the pull-merge-push stuff as suggested above ...

git checkout myBranch
git merge dev
... this is a Fast-Forward merge ...
git push HEAD
...