Краткий ответ
Используйте эту последовательность для извлечения удаленных данных и обновления ваших веток:
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