为什么我可以签出已删除的Git分支,为什么它仍然可以在GitHub上使用?

时间:2011-08-24 07:58:26

标签: git git-branch

一开始,我只有分支。

然后我使用以下命令创建一个新分支:

git branch 'branch1'

然后我将一些文件添加到branch1并将其合并到master。然后执行以下命令删除 branch1

git branch -d branch1

然后在本地,我现在只能看到主分支。但是在GitHub上,我仍然可以在分支列表中看到branch1。

我仍然可以检查branch1虽然我删除了它。

为什么?

3 个答案:

答案 0 :(得分:3)

这是因为你将分支推送到github而git branch -d BRANCHNAME只在本地删除分支,而github指针保持不变。如果你想在github上删除它,你可以git push origin :BRANCHNAME(注意冒号,这也就是假设“origin”是你的github repo,afaik是默认的)

有关该命令的更多信息,请参阅this

答案 1 :(得分:3)

如果您是唯一使用此GitHub存储库的人,则必须在某个时刻推送branch1,可能使用git push origin branch1或类似内容。

作为Alexander says,您可以使用以下命令从GitHub中删除分支branch1

git push origin :branch1

...但是要删除您应该执行的远程跟踪分支origin/branch1

git remote prune origin

有趣的是,您仍然可以结帐branch1,大概是:

git checkout branch1

...即使您删除了本地分支。事实证明,这是因为,从v1.6.6开始,当你试图检查一个不存在的分支时,git会尝试猜测你的意思,但是只存在一个具有匹配名称的远程跟踪分支。这是由git维护者Junio C Hamano在this commit中引入的:

  

DWIM“git checkout frotz”改为“git checkout -b frotz origin / frotz”

     

当'frotz'不是有效的对象名称而不是跟踪的文件名时,   我们曾经抱怨并且失败了这个命令。什么时候才有   一个遥控器将'frotz'作为其跟踪分支之一,我们可以   将它作为创建本地分支'frotz'forking的请求进行DWIM   匹配的远程跟踪分支。

这对我来说有点意外,git checkout手册页中没有提及。

答案 2 :(得分:1)

Git中的分支只是提交树中的指针(引用),每个存储库都有自己的引用集。如果GitHub上出现“branch1”,它只意味着在GitHub上有一个名为“branch1”的引用,它指向你的树(在GitHub上)(它甚至需要指向同一个提交)。