Почему Git создать компиляцию слияния без изменений файла?
Я совместно работаю над проектом с кем-то, поэтому мы решили использовать git. К сожалению, мы часто кодируем в местах без Интернета, поэтому в итоге получим что-то вроде этого:
origin/master: A---B---C
\
mylocalmaster: D---E---F
\
hismaster: G---H---I
Теперь, скажем, он толкает свои коммиты и получает следующее:
origin/master: A---B---C---G---H---I
\
master (local): D---E---F
Все, что я хочу сделать, это нажать мои коммиты, чтобы получить это как в моем локальном репо, так и в онлайн-режиме:
A---B---C---D---E---F---G---H---I
Кажется, что работает, когда я делаю git push
, но проблема возникает, когда я делаю git fetch
, а затем git merge
. Все, что я пытаюсь сделать, это получить свои коммиты в моем локальном репо, но в итоге я получаю сообщение об объединении с сообщением типа Merge remote-tracking branch 'origin/master'
.
Я не хочу иметь эту бессмысленную фиксацию, поскольку в наших коммитах нет противоречивого кода. Мы работаем над совершенно разными файлами, поэтому нет причин для этого. Как я могу предотвратить git от создания этого коммита слияния?
Ответы
Ответ 1
Вы можете опустить создание коммитов слияния, используя rebase вместо merge.
Как сказал @Dougal, если вы выполните git fetch
, вы можете выполнить git rebase
после этого, чтобы изменить базу своих изменений на выбранный HEAD
.
Обычно вы создаете эти нежелательные комманды, вытаскивая их из удаленного репозитория.
В этом случае вы можете добавить опцию --rebase
:
git pull --rebase
или добавьте правильную опцию в файл конфигурации Git (локально):
git config branch.<branch-name-here>.rebase true
или для всех новых репозиториев и ветвей:
git config branch.autosetuprebase always --global
Тем не менее, rebasing создает более чистую, более линейную историю , хорошо создавать транзакции слияния, где в обеих ветвях есть значительные изменения. (используйте git merge
).
Ответ 2
Используйте git rebase
(после git fetch
), чтобы ваши коммиты применялись против него, а не против предыдущего мастера. То есть перейти к ABCGHIDEF
в вашем примере. (Вы не можете сделать ABCDEFGHI
без необходимости делать push -f
, потому что ABCGHI
уже находится в origin/master
, и вам придется переопределить это.)