繁体   English   中英

如何删除没有名称的Git分支

[英]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 特别是, a34b8000ac0e6b的父级, dccbd3ba34b800的父级,依此类推。

这实际上是对Git的关键见解

值得考虑:在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM