这里的场景,首先在主树中有两个文件夹
├── foo1
│ └── index.php
└── foo2
└── index.php
然后我创建一个分支 b1 并添加到另外两个文件夹中。
├── foo1
│ └── index.php
├── foo2
│ └── index.php
├── foo3
│ └── index.php
└── foo4
└── index.php
之后我命令git add .
并强制切换回主git co -f master
而没有commit
命令。现在的树已经离开了foo3和foo4文件夹,但仍然是分支 b1
├── foo1
│ └── index.php
└── foo2
└── index.php
我的问题是如何从分支 b1 恢复文件夹3和4?我试过了git co b1
,但文件夹3,4仍然消失了。
答案 0 :(得分:1)
使用'git fsck'查找悬空斑点。这是一个例子:
$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling blob 54578ea3b3fb8d790bc5e19e36b52e601ec5433a
dangling blob f719efd430d52bcfc8566a43b2eb655688d38871
您可以直接列出它们:
$ ls .git/lost-found/other/
54578ea3b3fb8d790bc5e19e36b52e601ec5433a
f719efd430d52bcfc8566a43b2eb655688d38871
然后逐个恢复它们。
$ cat .git/lost-found/other/54578ea3b3fb8d790bc5e19e36b52e601ec5433a
<contents of file>
$ mv .git/lost-found/other/54578ea3b3fb8d790bc5e19e36b52e601ec5433a <my-file-one>
我认为你需要重建目录结构。
答案 1 :(得分:1)
你可以像GoZoner所说的那样让他们回来,但是当你{J}被告知git吹走任何妨碍结账的东西时 - 这就是索引中的所有内容,以及工作区中的任何内容都发生了变化索引状态和新分支之间。
特别是,checkout -f
标记了git add
作为跟踪文件;在结账时,如果在当前索引中跟踪文件并且在新索引中未跟踪,则它在跟踪状态下存在而现在不存在,因此切换到匹配新跟踪状态必然意味着从工作树中删除文件。
通常情况下,git会拒绝删除已跟踪文件的未提交内容,但会有一条或多或少的解释性消息,但您指定了foo{3,4}/index.php
。不要那样做。