如何恢复特定的git分支

时间:2013-02-24 14:42:59

标签: git

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

├── 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仍然消失了。

2 个答案:

答案 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。不要那样做。