Вопрос по git – Почему Git создал коммит слияния без изменений файла?
Я совместно работаю над проектом с кем-то, поэтому мы решили использовать git. К сожалению, мы часто пишем код в местах, где нет интернета, поэтому в итоге получается что-то вроде этого:
<code>origin/master: A---B---C \ mylocalmaster: D---E---F \ hismaster: G---H---I </code>
Теперь, скажем, он выдвигает свои коммиты и получает это:
<code>origin/master: A---B---C---G---H---I \ master (local): D---E---F </code>
Все, что я хочу сделать, это нажать мои коммиты, чтобы получить это как в моем локальном репо, так и в онлайн:
<code>A---B---C---D---E---F---G---H---I </code>
Кажется, работает, когда я делаюgit push
, но проблема возникает, когда яgit fetch
а потомgit merge
, Все, что я пытаюсь сделать, это получитьhis фиксирует в моем локальном репо, но я получаю коммит слияния, говоря что-то вродеMerge remote-tracking branch 'origin/master'
как его сообщение.
Я не хочу иметь этот бессмысленный коммит, так какno conflicting code in our commits, Мы работаем над совершенно разными файлами, поэтому нет никаких причин для этого коммита. Как я могу помешать git создать этот коммит слияния?
git merge --no-ff
не мог бы решить?
git commit-tree
команда. Увидетьman git-commit-tree
.
Вы можете опустить созданиеmerge commits, используяrebase вместоmerge.
Как сказал @Dougal, если вы делаетеgit fetch
Вы можете выполнитьgit rebase
потом поменять базу ваших изменений на выбраннуюHEAD
.
Обычно вы создаете нежелательныеmerge commitsПотянув из удаленного хранилища.
В этом случае вы можете добавить--rebase
опция:
git pull --rebase
или добавьте соответствующую опцию в конфигурационный файл Git (локально):
git config branch.<branch-name-here>.rebase true
или для всех новых репозиториев и веток:
git config branch.autosetuprebase always --global
Тем не менее, перебазирование создает более чистую, более линейную историюit is good to create merge commits, where there are massive changes in both branches (использованиеgit merge
сделать это).
использованиеgit rebase
(послеgit fetch
) сделать ваши коммиты применимыми против его, а не против предыдущего мастера. То есть идти вABCGHIDEF
в вашем примере. (Вы не можете сделатьABCDEFGHI
без необходимости делатьpush -f
, так какABCGHI
уже вorigin/master
и вам придется это переопределить.)