Вопрос по git – Почему Git создал коммит слияния без изменений файла?

30

Я совместно работаю над проектом с кем-то, поэтому мы решили использовать 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 создать этот коммит слияния?

@AlexisKing, ветвь функции, историю которой вы не хотите потерять, кроме "мяса" из которых уже были перебазированы и слиты в прошлом. Вы можете сохранить ветвь функции навсегда или "объединить" это снова & # x2014; при этом он гарантирует, что он не изменит рабочий код, который у вас уже есть, чтоincludes особенность Wildcard
Когда вы делаете git push в этой ситуации, вы должны получить ошибку. Это не должно работать нормально. bames53
@Wildcard Из любопытства, в какой ситуации вы хотите создать коммит слияния, которыйgit merge --no-ff не мог бы решить? Alexis King
Так как я прибыл на эту страницу, пытаясь научитьсяforce git, чтобы создать коммит слияния без каких-либо изменений в файле, я упомяну здесь, что ответом на этот вопрос являетсяgit commit-tree команда. Увидетьman git-commit-tree. Wildcard

Ваш Ответ

2   ответа
31

Вы можете опустить создание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 сделать это).

Нет, нет, я согласен с вами. Я просто объяснял, почему я хочу сделать это в первую очередь. Alexis King
@JakeKing вы можете пропустить создание этих коммитов, следуя решениям из моего ответа. Есть что-то, что я могу уточнить?
И ответ на ваш первый вопрос - почему? Коммиты слияния создаются по умолчанию, чтобы избежать путаницы для новичков Git, потому что это концептуально более простая ситуация, и люди ожидают, что коммиты слияния при слиянии.
Я не хочу создавать эти коммиты, потому что я ничего не объединяю. Если я позволю git создать миллион таких коммитов, которые ничего не делают, он просто забьет мою историю коммитов без какой-либо причины. Alexis King
Ну, на самом деле, в этом случае необходимы коммиты слияния из-за модели данных git. Хеш коммита включает в себя знания обо всех его родительских коммитах. Таким образом, когда вы меняете один коммит в ряду коммитов, все последующие коммиты получают новый хэш - они становятся отличными от того, чем они были изначально. Коммит слияния принимает неизмененные коммиты и ссылается на обе строки (следовательно, у него два родителя). Если вы перебазируете, вы измените свои коммиты, чтобы напрямую ссылаться на удаленные коммиты как на их родителей. Это не имеет ничего общего с реальными различиями, а только с отслеживанием истории.
9

использованиеgit rebase (послеgit fetch) сделать ваши коммиты применимыми против его, а не против предыдущего мастера. То есть идти вABCGHIDEF в вашем примере. (Вы не можете сделатьABCDEFGHI без необходимости делатьpush -f, так какABCGHI уже вorigin/master и вам придется это переопределить.)

Благодарю. Я знал, что это было что-то глупое, но я не совсем знал, что. Alexis King

Похожие вопросы