【发布时间】:2017-05-14 05:06:23
【问题描述】:
我有一个小仓库,里面有几个提交:
* a0fc4f8 (HEAD -> testbranch) added file.txt
* e6e6a8b (master) hello world now
* f308f53 Made it echo
* f705657 Added hello
* 08a2de3 (tag: initial) initial
还有:
$ git status
On branch testbranch
nothing to commit, working directory clean
我无法理解以下行为。在这种状态下,我运行:
$ git reset initial
我现在看到了:
* e6e6a8b (master) hello world now
* f308f53 Made it echo
* f705657 Added hello
* 08a2de3 (HEAD -> testbranch, tag: initial) initial
我所期待的:提交 a0fc4f8 将被删除,因为它无法访问。
发生了什么:
1) 做git show a0fc4f8 仍然显示提交
2) 执行 git status 会将提交 a0fc4f8 添加的 file.txt 显示为未跟踪,提交 f705657 添加的文件 hello 也显示为未跟踪。
3) 运行 git gc 或 git gc --prune=all 不会删除 a0fc4f8,尽管它不再可访问并且没有与之关联的名称/标签。
为什么会出现这些情况?
更新:
$ git fsck
Checking object directories: 100% (256/256), done.
Checking objects: 100% (15/15), done.
更新 2:
$ git log --all --decorate --graph --oneline
* e6e6a8b (master) hello world now
* f308f53 Made it echo
* f705657 Added hello
* 08a2de3 (HEAD -> testbranch, tag: initial) initial
$ git gc --force
Counting objects: 15, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (15/15), done.
Total 15 (delta 1), reused 15 (delta 1)
$ git log --all --decorate --graph --oneline
* e6e6a8b (master) hello world now
* f308f53 Made it echo
* f705657 Added hello
* 08a2de3 (HEAD -> testbranch, tag: initial) initial
$ git show a0fc4f8 仍然显示提交
更新 3:
$ git reflog testbranch
08a2de3 testbranch@{0}: reset: moving to initial
a0fc4f8 testbranch@{1}: commit: added file.txt
e6e6a8b testbranch@{2}: branch: Created from HEAD
【问题讨论】:
-
git fsck在git gc --prune=all之后说了什么? -
@MichałWalenciak:请检查更新
-
如果您运行
git reset (--mixed) initial,那么您的工作目录不会受到影响,这就是为什么您的所有更改都包含在a0fc4f8提交中的原因。 -
@C1sc0:我没有跑
(--mixed) -
@Jim --mixed 是默认值
标签: git git-branch git-reset git-gc