在省略提交后,如何立即恢复悬空提交?

时间:2017-08-15 23:44:21

标签: git

首先我结帐分行

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

然后我编辑文件以将类Foo的实例重命名为Bar。随后

> 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

Running git show 03c044a..cb在前几个和最后几个SHA中揭示了我历史深处的变化,而不是最近的变化。

2 个答案:

答案 0 :(得分:1)

  

只有在我读完合并消息(某种类似“无需合并”之后)之后才意识到我没有提交。

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

  IIUC,我现在有一个所谓的“悬挂提交”......

否:这些是确实存在的提交(因此必须在某些时候进行),但现在没有外部名称可以找到它们。由于您没有提交,因此该提交尚不存在。

假设你仍想在分支上提交重命名,你应该只需要切换回你的重命名分支,然后提交。有关您目前所做的工作的详情,请参阅Git - checkout another branch when there are uncommitted changes on the current branch

答案 1 :(得分:0)

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

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

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