2017-08-15 54 views
0

首先,我签一个分支我在忽略提交后很快恢复悬挂提交?

> git checkout -b renaming-Foo-to-Bar 

然后我编辑的文件类Foo的情况下,重命名为酒吧。随后

> git add -u 

但现在我省略运行git commit -m "renamed Foo to Bar"

认为我确实提交了,我继续将分支合并到主。

> git checkout master 
> git merge renaming-Foo-to-Bar 

这只是后,我读了合并消息 ,我意识到,我没有犯(的那种“无中生有合并”的东西)。

IIUC,我现在有一个所谓的“晃来晃去犯”,并通过运行

> git fsck --lost-found 
Checking object directories: 100% (256/256), done. 
dangling blob 03c044a..cb 
dangling commit ab8076f..47 
dangling commit 128532d..99 
dangling commit 5605e2d..4a 

我可以恢复它。但是dangling commitdangling blob消息不带有时间戳或其他标识信息。

我该如何恢复这样的悬挂提交?

不幸的是我的dangling commits/blobs有很多:

> git fsck --lost-found | wc 
Checking object directories: 100% (256/256), done. 
     52  142 2806 

Runninggit show 03c044a..cb在前几个和过去几年的SHA揭示变化深藏在我的历史,不是最近的。

回答

0

如果您没有提交并且只是暂时执行了更改并且它们现在丢失了,那么您唯一的解决方案就是搜索悬空的blob(在您进行更改时不会创建任何提交对象,也不会创建树对象:-()

您可以尝试按日期对相应文件进行排序,并使用命令git cat-file -p SHA1显示内容。

上周我做了类似的事情来挽救一位同事,将所有blob内容放在一个文件夹中的文件中,然后使用文本编辑器找到所需的文件。

+0

'git cat-file -p SHA1'非常方便,但它不会显示它输出的路径/文件名,甚至不会显示分隔符或时间戳。在一个输出中将多种语言放在一起。 – Calaf

+0

路径和文件名存储在分段时未创建的树对象中。这就是git的工作方式。所以你不会有更好的!你可以使用相同的命令,从“提交”对象开始,然后是“树”并以“blob”结尾。 >多种语言被放在一起输出。不可能。一个'blob'Sha1 =一个文件内容的版本。 – Philippe

1

只有在我阅读合并消息(类似“没有合并的东西”)之后,我意识到我没有提交。

...在这种情况下,您应该仍然对您的更改进行“上演”,即您对索引进行了更改。 git status应显示准备好提交的所有内容。

IIUC,我现在有一个所谓的“晃来晃去犯” ......

号:这些都是确实存在的(因此必须在某个时候已经作出)的提交,但现在有没有找到它们的外部名称。由于您没有提交,因此此提交不存在。

假设你仍然想提交分支上的重命名,你只需要切换回你的重命名分支,并提交。有关更多信息,请参阅Git - checkout another branch when there are uncommitted changes on the current branch