Предположим, следующая история:
* 99a48ee (feature_branch) Add feature a
* 499665a (HEAD -> dev, master) Initial commit
Слияние с feature_branch с dev создаст коммит слияния:
git merge --no-ff feature_branch
* 8aa6422 (HEAD -> dev) Merge branch 'feature_branch' into dev
|\
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a (master) Initial commit
После завершения тестирования, разработчик откроет пулл-запрос из feature_branch в master.
Это необычный бит. Вы получите следующее:
git checkout master
git merge --no-ff feature_branch
* 9a3f2e7 (HEAD -> master) Merge branch 'feature_branch'
|\
| | * 8aa6422 (dev) Merge branch 'feature_branch' into dev
| | |\
| |/ /
|/| /
| |/
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a Initial commit
Это уже выглядит неправильно! dev
теперь [ahead 1, behind 1]
, потому что он включает в себя 8aa6422 и пропускает 9a3f2e7.
dev 8aa6422 [ahead 1, behind 1] Merge branch 'feature_branch' into dev
feature_branch 99a48ee [behind 1] Add feature a
* master 9a3f2e7 Merge branch 'feature_branch'
Вместо того, чтобы объединять ветку объектов в master, нужно было объединить dev в master. Давайте попробуем это с состоянием хранилища перед последним слиянием, описанным выше.
git reset --hard HEAD^ # rollback the merge we just did above
git merge --no-ff dev
* c59be01 (HEAD -> master) Merge branch 'dev'
|\
| * 8aa6422 (dev) Merge branch 'feature_branch' into dev
| |\
|/ /
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a Initial commit
Это выглядит лучше, без перекрывающихся строк! dev
больше не впереди и сзади, а позади, так как у него нет слияния с мастером.
dev 8aa6422 [behind 1] Merge branch 'feature_branch' into dev
feature_branch 99a48ee [behind 2] Add feature a
* master c59be01 Merge branch 'dev'
Они не одинаковы, но они только позади, так что если вы сделаете то же самое, в будущем это произойдет просто.
Если вы действительно хотите, чтобы они были одинаковыми, вам нужно будет выполнить ускоренное слияние вместо создания коммита слияния. Давайте снова перемотаем и посмотрим, как это выглядит:
git reset --hard HEAD^ # rollback again
git merge dev # without --no-ff will default to --ff (fast forward)
* 8aa6422 (HEAD -> master, dev) Merge branch 'feature_branch' into dev
|\
| * 99a48ee (feature_branch) Add feature a
|/
* 499665a Initial commit
Теперь master и dev идентичны!
dev 8aa6422 Merge branch 'feature_branch' into dev
feature_branch 99a48ee [behind 1] Add feature a
* master 8aa6422 Merge branch 'feature_branch' into dev