为什么Git在没有文件更改的情况下创建合并提交?

为什么Git在没有文件更改的情况下创建合并提交?,git,git-merge,Git,Git Merge,我正在与某人合作进行一个项目,所以我们决定使用git。不幸的是,我们经常在没有互联网的地方编写代码,因此我们最终会遇到这样的情况: origin/master: A---B---C \ mylocalmaster: D---E---F \ hismaster: G---H---I 现在,假设他推动了他的承诺,得到了: origin/master: A-

我正在与某人合作进行一个项目,所以我们决定使用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创建此合并提交?

使用
git rebase
(在
git fetch
之后)使您的提交应用于his,而不是以前的主机。也就是说,在您的示例中转到
abcgidef
。(如果不执行
push-f
,您就无法执行
ABCDEFGHI
,因为
ABCGHI
已经在
origin/master
中,您必须覆盖它。)

您可以通过使用rebase而不是merge来忽略创建合并提交

正如@Dougal所说,如果您执行
git fetch
,您可以在之后执行
git-rebase
,以更改对已获取
头的更改的基础

通常通过从远程存储库中提取来创建那些不需要的合并提交。 在这种情况下,您可以添加
--rebase
选项:

git pull --rebase
或者将适当的选项添加到Git配置文件(本地):


但是,重定基可创建更清晰、更线性的历史记录创建合并提交很好,因为两个分支中都有大量更改(请使用
git merge

谢谢。我知道这很愚蠢,但我不太清楚是什么。当你在这种情况下推git时,你应该会出错。这似乎不太好。因为我来到这一页,试图学习如何在不更改任何文件的情况下强制git创建合并提交,我在这里要提到的是,答案是
git提交树
命令。请参见
mangit提交树
@Wildcard出于好奇,在什么情况下,您希望创建一个合并提交,而
git merge--no ff
无法解决此问题?@AlexisKing,一个您不想丢失其历史记录的功能分支,但其“内容”在过去已被重新设置和合并。你可以永远保留功能分支,或者你可以再次“合并”它,同时确保它不会改变你已经拥有的工作代码,包括功能。第一个问题的答案是——为什么?默认情况下创建合并提交是为了避免Git新手混淆,因为这是概念上更简单的情况,人们希望在合并时有合并提交。我不想创建这些提交,因为我没有合并任何内容。如果我让git创建一百万个这样的提交,而这些提交什么都不做,它只会无缘无故地阻塞我的提交历史。实际上,由于git的数据模型,在这种情况下需要合并提交。提交哈希包含有关其所有父提交的知识。这样,一旦您更改了提交行中的一个提交,所有后续提交都会得到一个新的哈希值——它们与原来的不同。合并提交接受未更改的提交并引用两行(因此它有两个父行)。如果重新设置基础,则将提交更改为直接引用远程提交作为其父级。这与实际差异无关,只与历史记录跟踪有关。@JakeKing您可以按照我的答案中的解决方案跳过创建这些提交。有什么我可以澄清的吗?不,不,我同意你的看法。我只是想澄清我为什么要这么做。
git config branch.<branch-name-here>.rebase true
git config branch.autosetuprebase always --global