为啥 git 会将分支合并到自身中?

Posted

技术标签:

【中文标题】为啥 git 会将分支合并到自身中?【英文标题】:Why does git merge a branch into itself?为什么 git 会将分支合并到自身中? 【发布时间】:2015-10-06 10:03:55 【问题描述】:

我今天早上醒来,查看了我的开发团队在 BitBucket 上的一个私有存储库的提交历史记录。我看到了这个:

匿名提交fcde879 MERGE

将https://bitbucket.org/abc/xyz 的“develop”分支合并到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 父级位于开发分支,而 f59 父级似乎来自不同的分支。很难说到底发生了什么。

我搜索但找不到答案,我需要重新开始工作,因此我在这里提出我的问题:为什么 git 将一个分支合并到自身中?或者,更确切地说,为什么将这个命名法用作提交消息?

【问题讨论】:

【参考方案1】:

这种情况并不罕见。

这里的关键是被合并的分支是不同的:它是远程存储库的develop 分支被合并到开发人员的本地(工作)develop 分支。

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

develop = 他/她目前正在处理的分支。新的提交放在这里。 origin/develop = 这本质上是当前存储库保存的关于远程服务器上develop 分支状态的快照。当您执行fetchpull 时,它会随远程更改而更新,并在成功push 后随本地更改而更新。

现在,当您执行git pull 时,会发生两件事。这是因为git pull本质上是其他两个git操作的别名:fetchmerge

fetch - 将所有新提交(如果有)从远程存储库带到本地 origin/develop 分支。 merge - 接受新的提交并将它们应用到本地工作的develop branch。这可以通过以下两种方式之一发生: 如果本地工作分支不包含不同的历史记录(远程不知道的新提交),那么它只是将develop 分支指针向前推进,使其指向origin/develop 中的最新提交。这称为快进合并。 如果开发人员有一些他自己的新提交不在远程仓库中,因此不在origin/develop 分支中,则进行常规合并,这意味着有一个包含更改的新提交从两个分支。默认情况下,git 将此类消息分配给此类提交:Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop

所以,这个场景很常见。

现在,如果这种情况经常发生,并且您不希望看到包含我们正在讨论的提交的非常复杂的提交历史图表,请尝试查看 using rebase instead of merge。

您可以通过两种方式进行此操作(从远程服务器获取更改时):

git fetch; git rebase git pull --rebase

【讨论】:

【参考方案2】:

所有者在开发中有一些他们没有推送的提交,然后运行git pull 并从远程仓库中的开发中获取/合并新提交。

【讨论】:

我更喜欢这个简短的回答。【参考方案3】:

如果你想在拉取之前避免这种类型的合并存储,像这样:

git stash
git pull
git stash pop

【讨论】:

【参考方案4】:

我收到了相同类型的消息。 Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into develop 它还没有破坏任何东西,哈哈……所以不要惊慌。它只是将远程开发分支合并到您的本地开发分支。只要没有发生冲突,您应该一切顺利 :)

【讨论】:

以上是关于为啥 git 会将分支合并到自身中?的主要内容,如果未能解决你的问题,请参考以下文章

为啥“合并后删除分支”只删除远程GIT分支而不是本地?

git:为啥我不能在壁球合并后删除我的分支?

为啥合并后GIT会说“已经是最新的”,但分支之间的差异仍然存在?

git分支合并为啥会发生冲突

git merge 单一文件

git命令中 怎么把 git远程上的分支合并到远程主分支上