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

时间:2011-12-14 18:01:17

标签: git github commit

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

这就是发生的事情

  1. 我们中的一个(让我们称他为开发人员A,但无论哪一个)都会向GitHub推送一组提交。
  2. 另一个(开发人员B)进行了一些本地提交。
  3. B执行git pull
  4. B执行git push
  5. 查看提交历史记录日志,我看到 github.com的合并分支'master':foo / bar
  6. 随着时间的推移,提交日志中充斥着“合并分支”消息,并且还将开发人员B显示为提交开发人员A所做的更改。我们发现阻止此问题的唯一方法是在步骤3执行git pull --rebase,但我不知道将引入什么副作用。这是我第一次使用多开发人员git仓库,这是正常行为吗?有关如何解决这个问题的任何想法?

6 个答案:

答案 0 :(得分:83)

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

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

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

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

答案 1 :(得分:45)

这个答案已被修改,因为我的理解,图表和结论都不正确。


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提交的知识。

有关合并提交的详细信息,请参阅Contributing to a Project中的ProGit-Book Private Small Team 部分显示了合并提交。

答案 2 :(得分:7)

执行git pull会插入“Merge branch”消息,这就是它的作用。通过执行git pull,您已将远程分支合并到本地分支中。

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

据我所知,这就是git的工作原理,而且没有办法解决它。

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

答案 3 :(得分:6)

你可以这样做:

git pull --rebase

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

答案 4 :(得分:6)

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

git stash
git pull
git stash pop

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

答案 5 :(得分:0)

解决方案:

如果其他开发人员已经在远程提交了他们的提交,那么您需要在提交之前获取 git pull。如果您这样做,您将永远不会在提交中收到无关的“合并分支”消息。

如果您在采取 git pull 之前提交,那么您需要采取 git pull --rebase,然后您将不会在提交中收到无关的“合并分支”消息。

此外,请了解以下事项:

  1. git pull --rebase 这里发生了什么? Git 将回退(撤消)您所有的本地提交,拉下远程提交,然后在新拉出的远程提交之上重放您的本地提交。

  2. 这就是当您将无关的“合并分支”提交与提交一起推送时提交图的外观。

commit-graph with extraneous “Merge branch” commit

  1. 而且,这就是您在提交之前采用 git pull 或在提交后采用 git pull --rebase 时提交图的外观。

commit-graph without extraneous “Merge branch” commit

注意:

  1. 您在案例和分支结构中所做的提交数量的差异。

  2. 此外,所有这些都发生在同一个分支上,分支会与自身合并。