[英]How do I delete a Git branch that has no name
我不确定这是怎么发生的。 但是,在重新设置基准之后,我有一个无名称的分离分支,它是母版的部分重复。 从分支的某个分支重新定位时,我可能会犯一些错误。 那么,基本上我该如何删除尖端为0ac0e6b的分支?
* 11e604e (HEAD -> master) Some comment
* a50932a Another comment
....
....
* 0d85332 Activities: service <-- dupes below
* 5323616 Activities: setup <--
* e4f5063 Results: fix <--
* 5bf3ec0 Composer: update
| * 0ac0e6b XController Setup (tag: sometag) <-- THIS BRANCH HAS NO NAME
| * a34b800
| * dccbd3b
| * 020b15e Activities: service <-- dupes above
| * f4231cf Activities: setup <--
| * 118536f Results: fix <--
|/
* c42ad6f Some comment
[结果表明,问题是分支中的一个标签,似乎阻止了它的删除-如果有人遇到相同的问题,我将其保留在此处。 删除标签,我的分支消失了。 在编辑中添加了标签。]
如果要清理存储库,可以使用git gc
命令 。 gc
代表垃圾收集器,它删除不必要的提交(即不属于任何分支的提交)。
当你发现,对于Git的发现摆在首位提交,就必须寻找一些名称提交。 在这种情况下,这就是标签名称。
最奇怪的部分是此git log --all --decorate --oneline --graph
输出,我将其git log --all --decorate --oneline --graph
为仅两条关键行(和一条“ ...”):
* 11e604e (HEAD -> master) Some comment ... | * 0ac0e6b XController Setup
第一个向我们显示您正在使用--decorate
:提交显示的名称与Git在括号中找到该提交的名称相同。
然后我们进行神秘的提交。 由于您使用的是--decorate
,因此应显示为:
| * 0ac0e6b (tag: sometag) XController Setup
这将告诉我们标签sometag
是Git找到这个新引入的sometag
的名称。
当然,一旦Git找到任何特定的提交,它将使用该提交的父哈希ID查找该提交的父,因此:
| * a34b800
| * dccbd3b
等等并不是什么难事:它们是通过提交0ac0e6b
的哈希ID(即“真实名称”) 0ac0e6b
。 特别是, a34b800
是0ac0e6b
的父级, dccbd3b
是a34b800
的父级,依此类推。
值得考虑:在Git中,分支名称不会创建提交。 它只是让Git 找到提交,并通过直接指向一个(仅一个)提交来做到这一点。 Git将此称为指向分支的尖端 。
为了向现有分支添加新的提交,Git要做的是:
写下一个新提交,包括其源快照,作者名称以及您在git log
看到的所有其他常见元数据。 元数据的这些位之一是提交的父ID哈希。
新提交的父ID是分支名称指向的提交:
... <--commit <--commit <--current-tip-commit <-- branchname \\ new-commit-just-made
并且,既然新提交已存在,请更改分支名称中存储的哈希。 分支名称不再指向上一个提示提交。 现在,它指向您刚刚做出的新提交!
... <--commit <--commit <--current-tip-commit \\ new-commit-just-made <-- branchname
当Git对分支名称进行所有这些花哨的移动时, 实际上只有一个名称移动 。 那是git status
表示您“处于” git status
on branch master
,就像git status
表示on branch master
。 现有的所有其他名称不受干扰 。 如果其中任何一个指向当前提交,则它们将继续指向当前提交。
这就是git rebase
最常见的问题,它通过将提交(由传递给git rebase
的参数计算的一些提交字符串) 复制到闪亮的新提交(无论如何,我们希望是对旧的沉闷的提交的改进)来工作。 然后,它移动一个分支名称。 只要一个分支名称是查找旧提交的唯一方法,那么Git现在只有一种查找新提交的方法,而且看起来提交已更改,但是并没有! 旧的仍然在那里。
一旦有了第二个名称(分支名称,标签名称, refs/stash
引用,远程跟踪名称或您出于某种原因而发明的任何新事物),Git便可以通过它找到旧的提交,但是,在git log --all
。 现在,您必须找到某种方式来移动这些名称。 如果它们是标签名,则移动它们通常不是一个好主意。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.