为什么git将分支合并到自身?

Jon*_*oss 27 git version-control merge branching-and-merging

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

匿名犯了fcde879MERGE

https://bitbucket.org/abc/xyz的分支"开发"合并到开发中

这有点不寻常.我的猜测是,这是从没有正确配置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
Run Code Online (Sandbox Code Playgroud)

据我所知,6bb父级在开发分支上,而f59父级似乎来自不同的分支.很难说出发生了什么.

我搜索但找不到答案,我需要回到研究中,因此我在这里提出我的问题:为什么git将一个分支合并到自身?或者说,为什么这个命名法被用作提交消息?

Cri*_*scu 60

这种情况并不罕见.

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

在开发人员的本地存储库中有两个不同的分支:

  • develop=他/她目前正在进行的分支.新的提交就在这里.
  • origin/develop=这实际上是当前存储库保存的有关develop远程服务器上分支状态的快照.当您执行fetch或更改远程更改时,它会更新pull,并在成功后使用本地更改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.

因此,该场景非常常见.

现在,如果这种情况经常发生并且您不希望看到包含我们正在讨论的提交的非常复杂的提交历史图表,请尝试使用rebase而不是合并.

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

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

  • 谢谢,非常有用。现在一切都变得如此清晰。 (3认同)

mip*_*adi 10

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

  • 我更喜欢这个简短的答案。 (2认同)

小智 5

如果您想在拉取之前避免这种类型的合并存储,如下所示:

git stash
git pull
git stash pop
Run Code Online (Sandbox Code Playgroud)