为什么Git会将一个分支合并到自己?

45

今天早上我醒来后查看了 BitBucket 上我的开发团队私有仓库的提交历史记录,看到了这样的内容:

匿名用户 提交了 fcde879 MERGE

将分支 'develop' 从 https://bitbucket.org/abc/xyz 合并到 develop 分支

这有点儿不寻常。我猜测可能是从一个未配置 git 的新机器上推送的。但是我还不确定它为什么会这样做。在 BitBucket 上,它显示两个独立的哈希值作为提交父级,但没有其他提交的“查看原始提交”选项。

我切换到了那个分支,拉取了最新代码,并手动查看了提交日志。

sidious@DS-1:/path/to/repo$ git log -1 --format=raw
tree 2931d14f48e61eaf0bbe0660af5b5dd76c07f063
parent 6bb38dee681df7620ffa42b6790641a7873166f2
parent f59c82e19e3e79310a53e273bab78139c49ff063
author root <root@somemachine> 1437069530 +0000
committer root <root@somemachine> 1437069530 +0000

Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop
据我所知,6bb父提交在develop分支上,而f59父提交似乎来自另一个分支。很难说出发生了什么。
我搜索了但找不到答案,我需要回到工作中,因此我在这里提出我的问题:为什么git将一个分支合并到自身?或者,为什么这个术语被用作提交信息?
4个回答

91

这种情况并不罕见。

关键在于合并的分支是不同的:它是远程仓库的 develop 分支合并到开发者本地(工作)develop 分支。

在开发者本地仓库中有两个独立的分支:

  • develop = 他/她当前正在工作的分支。新提交的内容会在这里。
  • origin/develop = 这实际上是当前仓库对于远程服务器上 develop 分支状态的快照。当你执行fetchpull时,它会得到远程更改的更新,当成功push后,还会得到本地更改的更新。

现在,当你执行git pull时,会发生两件事情。因为git pull实际上是另外两个git操作的别名:fetchmerge

  • fetch - 将所有新提交(如果有)从远程仓库带到本地的origin/develop分支。
  • merge - 将新提交应用到本地的工作develop分支上。这可以通过两种方式之一完成:
    • 如果本地工作分支不包含出现分叉的历史记录(远程不知道的新提交),则它仅将develop分支指针向前推进,使其指向origin/develop中的最新提交。这称为fast-forward merge
    • 如果开发者有一些自己的新提交不在远程库中,因此也不在origin/develop分支中,则执行常规合并,意味着有一个新的提交,其中包含来自两个分支的更改。默认情况下,git会将这样的提交分配给这样的消息:Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop

所以,这种情况相当普遍。

如果这种情况经常发生,而且你不喜欢看到包含这种提交的非常复杂的提交历史记录图表,请尝试查看使用rebase而不是合并

在从远程服务器获取更改时,有两种方法可以做到这一点:

  • git fetch; git rebase
  • git pull --rebase

谢谢!我现在明白了幕后发生的事情。干杯! - jsmtslch
感谢您的完美答案。就个人而言,我仍然不喜欢这个。我喜欢 SVN 的简单直接。 - Joey.Lu

16

所有者在本地 develop 分支上有些提交,但并未将它们推送到远程仓库。之后,执行了 git pull 命令,从远程仓库中获取并合并了 develop 分支的新提交。


2
我更喜欢这个简短的答案。 - aerin

5
如果您想避免这种合并,可以在拉取之前进行存储,如下所示:
git stash
git pull
git stash pop

1
我收到了相同类型的消息。 Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into develop,目前还没有出现任何问题...所以不要惊慌。它只是将远程develop分支合并到您的本地develop分支。只要没有冲突出现,您就可以继续进行 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接