我不确定这是怎么发生的。但是在一个rebase之后,我有一个无名的分离分支,它是master的部分副本。我可能在从分支的分支重新定位时犯了一些错误。所以基本上如何删除提示为0ac0e6b的分支?
LastRow = .Cells(.Rows.Count, "C").End(xlUp).Row
ActiveCell = LastRow .Cells("C".0)
ActiveCell.Offset(2, 0).Rows("1:12").EntireRow.Insert Shift:=xlDown,
CopyOrigin:=xlFormatFromLeftOrAbove
Sheets("Sheet").Range("A1:U2").Copy
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.Offset(-12, 2) = True
[原来问题是分支中的标签似乎阻止了它被删除 - 我会留下这个,以防有人遇到同样的问题。删除标签,我案件中的分支消失了。在编辑中添加了标记。]
答案 0 :(得分:1)
如果要清理存储库,可以使用git gc
command。 gc
代表垃圾收集器,它删除不必要的(即不属于任何分支的提交)提交。
答案 1 :(得分:1)
正如您所发现的那样,要让Git首先找到提交,它必须查看提交的某些名称。在这种情况下,这是一个标签名称。
最奇怪的部分是这个git log --all --decorate --oneline --graph
输出,我将只剪切到两个关键线(和一个“......”):
* 11e604e (HEAD -> master) Some comment ... | * 0ac0e6b XController Setup
第一个向我们显示您正在使用--decorate
:提交显示的是Git 找到的名称在括号中提交的内容。
然后我们进入神秘提交。由于您使用的是--decorate
,因此应该读取:
| * 0ac0e6b (tag: sometag) XController Setup
这会告诉我们标签sometag
是Git找到这个新引入的提交流的名称。
一旦Git找到任何特定的提交,当然,它使用该提交的父哈希ID来查找提交的父级,因此:
| * a34b800
| * dccbd3b
等等并不神秘:它们是通过哈希ID找到的 - “真实名称”,因为它是提交0ac0e6b
。特别是,a34b800
是0ac0e6b
的父级,dccbd3b
是a34b800
的父级,依此类推。
值得考虑的是:Git中的分支名称不会创建提交。它只是让Git 找到提交,它通过直接指向一个 - 只有一个 -commit来实现。 Git调用这个指向提交分支的 tip 。
为了向现有分支添加新提交,Git所做的是:
写出一个新的提交,其中包含源快照,作者姓名以及您在git log
中看到的所有其他常用元数据。其中一个元数据是提交的父ID 哈希。
新提交的父ID是分支名称指向的提交:
... <--commit <--commit <--current-tip-commit <-- branchname
\
new-commit-just-made
而且,现在 new 提交存在,更改分支名称中存储的哈希值。分支名称不再指向上一个提示提交。现在它指向你刚刚提交的新提交!
... <--commit <--commit <--current-tip-commit
\
new-commit-just-made <-- branchname
当Git对分支名称进行所有这些花哨的移动时,只有一个名称实际移动。这就是git status
表示你“开启”的分支,就像在git status
中说on branch master
一样。 所有其他现有名称未受干扰。如果其中任何一个指向当前提交,它们将继续指向当前提交。
这是git rebase
最常出现的问题,它通过复制提交 - 一些由传递给git rebase
的参数计算的提交字符串 - 变为闪亮的新承诺(我们希望无论如何)是对旧的沉闷的改进。然后它移动一个分支名称。只要一个分支名称是 only 查找旧提交的方式,现在Git只能找到 new 提交,看起来提交有改变了 - 但他们没有!旧的还在那里。
我们有第二个名称 - 分支名称,标记名称,refs/stash
引用,远程跟踪名称或您出于某种原因发明的任何新内容 - Git通过它找到 old < / em>提交,但是,他们在git log --all
。现在你必须找到一些方法让那些名称移动;如果它们是标签名称,移动它们通常是一个坏主意。