推送后,为什么远程删除的分支没有删除?

时间:2012-06-21 06:33:45

标签: git version-control branch dvcs git-flow

我正在使用git-flow,它的作用是每当我删除我的feature/abc分支时:

git flow feature abc finish

在将feature/abc分支与develop分支合并后,它将删除develop分支。之后,我推动git push origin develop 分支。

feature/abc

现在,在遥控器上我可以看到{{1}}分支,但不能在本地看到。那么,这是否意味着它从本地仓库删除了,并且删除没有被带到远程?

根据我的理解:

  • 由于git是分布式的,因此所有机器上都存在整个存储库。
  • 所以,如果我在我的本地仓库进行更改并将其推送到遥控器。
  • 然后,我的所有更改都应该推送到远程,包括删除。

冲突:

  • 推送后本地和远程git repo如何不同。

=>假设我是代码的唯一开发人员。

更新

我的问题是我在合并后本地删除了分支。然后我推动了我合并的分支,然后为什么没有反映在遥控器上? 因为,GIT是DVCS,在推/拉时应该是相同的。 [考虑到我是唯一的开发者]

我也没有要求创建它。它使分支进行了我的更改,将其合并,然后删除了分支并推送了我更新的开发分支。那么,如果它自动检测到那些分支的创建,那么为什么不删除?

1 个答案:

答案 0 :(得分:5)

  

因为,GIT是DVCS,在推/拉方面应该是相同的。

不,那不是真的。它是分布式的,因此网络中的每个存储库或多或少都包含相同的数据,但只包含更多或更少的数据。当您使用推拉时,您明确指定要推送的内容。

git push remote branch仅将分支指针branch推送到远程存储库,并传输远程存储库构建它所需的所有提交,但不是更多。这意味着只有分支指向的提交才真正推送到所有父节点,直到远程存储库找到它已经拥有的公共父节点(在最坏的情况下,这是特殊的零提交,即空父节点)。 p>

同样,git pull remote branch仅获取在本地构建远程分支remote/branch所需的更改。

要真正获得所有提交,您可以使用git fetch,并推送您可以使用git push --all的所有本地分支。但同样,它只获取/推送构造分支(或标记)所需的提交,而不是存储库所拥有的所有提交。

现在,当您将分支推送到远程存储库时,它将仅更新您实际推送的分支,因此当您删除本地远程并使用--all进行推送时,只会推送您的本地分支,这样做不包括已删除的一个。因此,您的本地Git不再知道您在本地删除了哪些分支(因为它们已合并),因此无法自动将该信息提供给远程存储库。然而,它可以做的是告诉远程存储库本地的每个分支,以便远程可以找出哪些被删除。您可以使用选项--prune执行此操作。但请注意,这将删除本地不存在的所有分支,因此在处理多个推送不同分支但不拉动其他分支的用户时可能会出现问题(尽管我实际上从未测试过)。

最明显的是直接删除本地删除的分支:

git push remote :branch