1

这里的场景,首先在主树中有两个文件夹

├── foo1
│   └── index.php
└── foo2
    └── index.php

然后我创建一个分支b1并添加到另外两个文件夹中。

├── foo1
│   └── index.php
├── foo2
│   └── index.php
├── foo3
│   └── index.php
└── foo4
    └── index.php

之后,我在没有命令的情况下命令git add .并强制切换回主控。当前的树现在已经离开 foo3 和 foo4 文件夹,但仍然是分支b1git co -f mastercommit

├── foo1
│   └── index.php
└── foo2
    └── index.php

我的问题是如何从分支b1恢复文件夹 3 和 4 ?我试过git co b1了,但文件夹 3,4 仍然消失。

4

2 回答 2

1

使用 'git fsck' 查找悬空的 blob。这是一个例子:

$ 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>

我认为您需要重建目录结构。

于 2013-02-24T15:22:26.303 回答
1

正如 GoZoner 所说,您可以将它们取回,但是当您这样做时,checkout -f您告诉 git 吹走任何妨碍结帐的东西——这就是索引中的所有内容,以及工作树中在索引状态和新分支之间发生变化的任何内容.

特别是,将git add您标记foo{3,4}/index.php为跟踪的文件;在结帐期间,如果文件在当前索引中被跟踪并且在新索引中未被跟踪,那么它存在于跟踪状态而现在不存在,因此切换到匹配新的跟踪状态必然意味着从工作树中删除文件。

通常,git 将拒绝删除跟踪文件的未提交内容,并带有或多或少的解释性消息,但您指定了--force. 不要那样做。

于 2013-02-24T15:36:07.670 回答