2017-08-15 52 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