为什么Git创建一个没有文件更改的合并提交?

Ale*_*ing 30 git git-merge

我正在与某人合作开展一个项目,所以我们决定使用git.不幸的是,我们经常在没有互联网的地方编码,所以我们最终会得到这样的结果:

origin/master: A---B---C
                        \
mylocalmaster:           D---E---F
                        \
hismaster:               G---H---I
Run Code Online (Sandbox Code Playgroud)

现在,说他推动他的提交并得到这个:

origin/master: A---B---C---G---H---I
                        \
master (local):          D---E---F
Run Code Online (Sandbox Code Playgroud)

我想做的就是推动我的提交,以便在我的本地仓库和在线仓库中获取:

A---B---C---D---E---F---G---H---I
Run Code Online (Sandbox Code Playgroud)

它似乎工作,当我做git push,但是当我做的麻烦出现git fetch,然后git merge.我所要做的就是让他的提交进入我的本地仓库,但我最终得到了一个合并提交,就像Merge remote-tracking branch 'origin/master'它的消息一样.

我不想进行这种无意义的提交,因为我们的提交中没有冲突的代码.我们正在处理完全不同的文件,因此没有理由进行此提交.如何防止git创建此合并提交?

Raf*_*cki 31

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

正如@Dougal所说,如果你这样做git fetch,你可以在git rebase之后执行以将更改的基础更改为已获取的更改HEAD.

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

git pull --rebase
Run Code Online (Sandbox Code Playgroud)

或者向Git配置文件添加适当的选项(本地):

git config branch.<branch-name-here>.rebase true
Run Code Online (Sandbox Code Playgroud)

或者对于所有新的存储库和分支:

git config branch.autosetuprebase always --global
Run Code Online (Sandbox Code Playgroud)

然而,rebasing创建更清晰,更线性的历史,创建合并提交是很好的,两个分支都有大量的变化(用于git merge这样做).

  • 那么,在这种情况下实际上需要合并提交,因为git的数据模型.提交哈希包括有关其所有父提交的知识.这一点,一旦您在提交行中更改了一个提交,所有后续提交都会获得一个新哈希 - 它们会与原来的哈希不同.合并提交采用未更改的提交并引用两行(因此它有两个父项).如果你改变,你改变你的提交直接引用远程提交作为他们的父母.这与实际差异无关,但仅与历史跟踪有关. (6认同)
  • 我不想创建这些提交,因为我没有合并任何东西.如果我让git创建了一百万个没有做任何事情的提交,那么它将无缘无故地堵塞我的提交历史. (2认同)

Dou*_*gal 9

使用git rebase(在a之后git fetch)使你的提交适用于他而不是对前一个主人.也就是说,转到ABCGHIDEF你的例子中.(你不能这样做ABCDEFGHI,而不必做了push -f,因为ABCGHI已经在origin/master和你不得不重写.)