github - Git pull在提交日志中导致无关的“合并分支”消息

我正在与一个项目的另一位开发人员合作,我们正在使用Github作为我们的远程仓库。 我使用git 1.7.7.3在Mac上,他在Windows上使用git 1.7.6。

这就是发生的事情

  1. 我们其中一个人(让他们称他为开发人员A,但这并不重要)将一组提交推送给GitHub。
  2. 另一个(开发人员B)进行一些本地提交。
  3. B做了git pull --rebase
  4. B做了git pull --rebase
  5. 查看提交历史记录日志,我看到Merge分支' master' github.com:foo/bar

提交日志中充斥着"合并分支" 消息随着时间的推移,并且还显示开发人员B提交开发人员A所做的更改。 我们发现防止此问题的唯一方法是在步骤3中执行git pull --rebase,但我不知道将引入哪些副作用。 这是我第一次使用多开发人员git仓库,这是正常行为吗? 有关如何解决这个问题的任何想法?

mshafrir asked 2019-08-12T14:19:59Z
5个解决方案
81 votes

你看到的提交完全没问题。 pull有效运行git fetch然后git merge,因此运行git pull时通常会发生合并。

使用变基而不是合并的替代方案是可行的,但通常你应该避免使用。 重新定位允许您保留线性历史记录,但也会删除有关最初发生的分支的任何信息。 它还将导致重写当前分支的历史记录,重新创建目标分支中未包含的所有提交(在您的情况下,远程)。 由于重新创建的提交是不同的提交,因此在与其他人一起开发时会引起很多混乱,特别是当人们在重写之前已经检查了部分提交时(例如使用功能分支)。 因此,根据经验,您不应该重写已经推送的任何提交。

您看到的提交可以组合两个(或更多)分支。 提交除了合并多个分支之外什么都不做,完全没问题。 实际上,当您在查看历史记录时进行合并提交并组合分支时,它会非常清楚。 与变基相比,合并还允许您有效地查看原始历史,包括共存的实际分支。

所以,长话短说:是的,合并提交完全没问题,你不应该担心它们。

poke answered 2019-08-12T14:20:44Z
45 votes

由于我的理解,图表和结论不正确,因此修改了这个答案。


git pull导致合并提交,因为git正在合并。 这可以通过将分支设置为使用rebase而不是merge来更改。 在pull上使用rebase而不是merge为共享存储库提供了更线性的历史记录。 另一方面,merge commits显示了分支上的并行开发工作。

例如,两个人正在同一个分支上工作。 分支开头为:

...->C1

第一个人完成他们的工作并推向分支机构:

...->C1->C2

第二个人完成他们的工作并希望推动,但不能因为他们需要更新。 第二个人的本地存储库看起来像:

...->C1->C3

如果将pull设置为merge,则第二个人员库将如下所示。

...->C1->C3->M1
      \      /
       ->C2->

其中M1是合并提交。 这个新的分支历史将被推送到回购。 相反,如果将pull设置为rebase,则本地repo将如下所示:

...->C1->C2->C3

没有合并提交。 历史变得更加线性。

两种选择都反映了分支的历史。 git允许您选择您喜欢的历史记录。

确实存在rebase可能导致远程分支出现问题的地方。 这不是其中之一。 我们更喜欢使用rebase,因为它简化了已经很复杂的分支历史记录,并显示了相对于共享存储库的历史版本。

您可以设置branch.autosetuprebase = always让git自动将远程分支建立为rebase而不是master。

git config --global branch.autosetuprebase always

此设置使git自动为每个远程分支创建配置设置:

branch.<branchname>.rebase=true

您可以自己为已设置的远程分支设置此项。

git config branch.<branchname>.rebase true

我要感谢@LaurensHolst提出质疑并继续我之前的发言。 我当然学到了更多关于git如何使用pull和merge提交的知识。

有关合并提交的更多信息,您可以阅读ProGit-Book中的项目贡献。 私有小团队部分显示合并提交。

Bill Door answered 2019-08-12T14:23:39Z
7 votes

做一个git pull会插入&#34; Merge分支&#34; 消息,这就是它的作用。 通过执行git pull,您已将远程分支合并到本地分支中。

当您执行git pull并且存在冲突时,git日志将显示冲突文件的更新来自解决冲突的用户。 我假设这是因为修复冲突的人重新提交文件。

据我所知,git是如何工作的,而且没有办法绕过它。

重新定位将吹走git历史记录,因此您无法查看合并发生的时间。

kclair answered 2019-08-12T14:24:35Z
6 votes

你可以做:

git pull --rebase

但是,这将始终将您的更改置于协作者之上#39; 但是你不会得到任何污染性的合并消息。

gaborous answered 2019-08-12T14:25:12Z
6 votes

实际上有一个更简单的答案。 让开发人员B在提交之前做一个拉动。 这将阻止那些合并提交,因为它们是由您在本地提交的本地存储库上创建的历史记录导致尝试与远程存储库上的提交历史记录合并而造成的。 如果您收到一条消息,说明某些内容会被覆盖,那么更改将会被覆盖&#39; 拉动时,它只是意味着你们都触摸了同一个文件,所以:

git stash
git pull
git stash pop

那么你可以解决任何合并冲突,如果有的话。

Luke answered 2019-08-12T14:25:48Z
translate from https://stackoverflow.com:/questions/8509396/git-pull-results-in-extraneous-merge-branch-messages-in-commit-log