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

时间:2015-07-16 19:35:54

标签: git version-control merge branching-and-merging

我今天早上醒来,看了一下我的开发团队在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将一个分支合并到自身?或者说,为什么这个命名法被用作提交消息?

4 个答案:

答案 0 :(得分:48)

这种情况并不罕见。

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

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

  • develop =他/她目前正在进行的分支。新的提交就在这里。
  • develop =这实际上是当前存储库保存的有关远程服务器上origin/develop分支状态的快照。当您执行developfetch时,它会通过远程更改进行更新,并在成功pull后通过本地更改进行更新。

现在,当你做push时,会发生两件事。这是因为git pull本质上是其他两个git操作的别名:git pullfetch

  • merge - 将所有新提交(如果有)从远程存储库提供给本地fetch分支。
  • origin/develop - 接受新提交并将其应用于本地工作merge。这可以通过以下两种方式之一发生:
    • 如果本地工作分支不包含不同的历史记录(远程不知道的新提交),那么它只是向前推进develop branch分支指针,以便它指向{{{}中的最新提交。 1}}。这称为快进合并
    • 如果开发人员有一些他自己的新提交,而这些提交在远程仓库中不存在,因此不在develop分支中,那么就会进行定期合并,这意味着有新的提交。 commit,包含来自两个分支的更改。默认情况下,git会将类似这样的消息分配给此类提交:origin/develop

所以,这个场景很常见。

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

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

  • origin/develop
  • Merge branch 'develop' of https://bitbucket.org/abc/xyz into develop

答案 1 :(得分:8)

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

答案 2 :(得分:0)

我收到了同样类型的消息。 Merge branch 'feature/customfeature' of https://mylocalrepo.com/project.git into develop它还没有破坏任何东西大声笑......所以不要惊慌失措。它只是将远程开发分支合并到您的本地开发分支中。只要不出现冲突,你应该好去:)

答案 3 :(得分:0)

如果你想在拉动之前避免这种类型的合并藏匿,像这样:

git stash
git pull
git stash pop