无论你是使用git branch -d 还是git branch -D 删除,git 都不会删除提交,而只会删除分支引用。请继续阅读以了解这意味着什么。
首先,我们将设置一个简单的演示历史记录。
$ touch initial ; git add initial ; git commit -m 'Initial commit'
[master (root-commit) 2182bb2] Initial commit
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 initial
$ git checkout -b mybranch
Switched to a new branch 'mybranch'
此时,master 和 mybranch 都指向同一个
提交,我们至少可以通过两种方式进行验证。
$ git lola
* 2182bb2 (HEAD -> mybranch, master) Initial commit
请注意,git lola 是一个非标准但非常有用的别名,
相当于
$ git log --graph --decorate --pretty=oneline --abbrev-commit --all
* 2182bb2 (HEAD -> mybranch, master) Initial commit
在mybranch 上创建新提交后,我们将查看另一种方式。
$ touch mybranch ; git add mybranch ; git commit -m 'My branch'
[mybranch 7143aa4] My branch
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 mybranch
这样做之后,我们确实在多个分支上进行了多次提交。
$ git lola
* 7143aa4 (HEAD -> mybranch) My branch
* 2182bb2 (master) Initial commit
我们现在可以窥探一下 git 如何在后台实现这一点。
$ ls -R .git/refs
.git/refs:
heads tags
.git/refs/heads:
master mybranch
.git/refs/tags:
很好奇有与我们的分支同名的文件。
往里面看,我们看到了
$ cat .git/refs/heads/master .git/refs/heads/mybranch
2182bb2d5a0a7f57d0b74e95d37e208dac41f95b
2182bb2d5a0a7f57d0b74e95d37e208dac41f95b
所以 git 将 refs 实现为名称匹配的特定位置的文件
包含 SHA1 的分支名称
某些提交的哈希值。请注意,git lola (2182bb2) 输出中的缩写散列是上述 cat 输出的前导前缀。
将 git refs 视为简单的指针,为存储库历史记录中的特定提交提供人类可读的名称。
现在,如果我们切换回 master 和 zap mybranch
$ git checkout master ; git branch -D mybranch
Switched to branch 'master'
Deleted branch mybranch (was 7143aa4).
我们看到 ref 不见了
$ ls -R .git/refs
.git/refs:
heads tags
.git/refs/heads:
master
.git/refs/tags:
但提交仍然存在。
$ git show --pretty=oneline 7143aa4
7143aa477735382e7a0ed11c9e4b66c1f27583df My branch
diff --git a/mybranch b/mybranch
new file mode 100644
index 0000000..e69de29
如果你想返回mybranch,你只需要运行
$ git checkout -b mybranch 7143aa4
Switched to a new branch 'mybranch'
或
$ git branch mybranch 7143aa4
取决于,正如它们各自输出的差异所表明的那样,
是否要切换到分支。在后一种情况下,
你留在当前分支的地方,git lola 看起来像
$ git lola
* 7143aa4 (mybranch) My branch
* 2182bb2 (HEAD -> master) Initial commit
是的,即使在您删除了使它们保持活动状态的指针之后,您的提交也会短暂停留。这在意外删除的情况下非常有用。另见git reflog 和git gc。
请注意,您的存储库中的 SHA1 哈希值会有所不同
因为您的姓名和电子邮件地址至少会有所不同
从我用过的。
为了完整起见,-d 和 -D 之间的区别是小写版本稍微安全一些。
-d
--delete
删除一个分支。如果没有使用--track 或--set-upstream 设置上游,则该分支必须完全合并到其上游分支中,或者在HEAD 中。
-D
--delete --force 的快捷方式。
-f
--force
如果 branchname 已经存在,则将 branchname 重置为 startpoint。没有-f git 分支拒绝更改现有分支。结合-d(或--delete),允许删除分支,无论其合并状态如何……