2011-08-05 114 views
8

我在一家小公司工作,我們的Git回購有點混亂。我剛剛做了一個git pull,我今天早些時候做出的更改都沒有了!Git正在丟失單個文件的歷史記錄/內容

當我在主分支HEAD工作,git log顯示我上次在歷史上犯下b94940c63ef965ce45b0d64ccfba4359134d2552

現在,如果我爲git log filename爲有問題的文件丟失了我的更改,則不會顯示該提交(僅顯示先前的提交)。

表演git log --follow filename,我犯b94940c63ef965ce45b0d64ccfba4359134d2552顯示爲最近。

而且果然如我這樣做:

git checkout b94940c63ef965ce45b0d64ccfba4359134d2552 
git log filename 

然後提交顯示我的變化是在文件中!

換句話說,我所做的提交顯示在分支歷史記錄中(阻止分支合併),但單個修改後的文件在其歷史記錄中沒有提交! (除非我明確簽出提交)。

問題:

  1. 如何在地球上出現這種情況?

  2. 我該如何解決? (我們有多個文件的問題在我們的回購)所有的

回答

0

首先,你應該得到什麼Git的命令做了抓地力和什麼樣的數據存儲在倉庫中。

  • 獲取歷史可視化工具,像Giggle或Gitk看到你的提交歷史,看到的是基於什麼犯了什麼承諾。

  • git pull做了兩兩件事:讀新提交從遠程倉庫,它融合了當前的頭遠程倉庫的頭部(當前分支)。

所以鑑於此,您可能希望在將來更加小心。您可以做git fetch而不是使用git pull,並手動合併需要合併的內容。這樣你可以控制你正在編輯的內容。

至於你目前的情況,我不認爲Git會丟失數據。你說你的文件還在歷史中。因此,現在您可能需要做一些創意重設(恢復到舊版本)或修補程序(可能需要手動)才能使項目文件進入您希望的狀態。

+0

感謝您的傻笑和Gitk建議。他們是有用的,但只告訴我相同的控制檯顯示;該分支有正確的歷史記錄 - 文件沒有。不知怎的,這些文件是錯誤的版本。幸運的是,沒有數據丟失,所以我可以重置。但我只是擔心其他事情正在發生(事情很快就會再次破裂) - 這就是爲什麼我想知道事情如何發展的原因。 – UsAaR33

1

這應該只是一條評論,但它很難閱讀。檢查出的主後:

git checkout master 

什麼的

git status 

git whatchanged -m -p <path> 

git log --graph --oneline b94940c63ef965ce45b0d64ccfba4359134d2552..master 

輸出?

+0

未來評論者的注意事項:whatchanged從git日誌中獲取diff - 關注 – UsAaR33

4

好了解決了這個問題。當同事拉動時,他發生了一些衝突。而不是解決,他git重置每個階段的文件。這類似於在單箇舊文件上執行git checkout old_version。所以主人的HEAD最後提到了一些old_version的文件。

現在我手動恢復他吹掉的東西。

道德故事:修改單個文件上的git操作(checkout,reset等)是相當危險的。

+6

這不是道德。道德是:「學會解決合併衝突。」它適用於任何VCS,並且它似乎是開發人員基於其周圍存在多少問題而實踐最少的技能。 –

+1

@ Ryan不能同意更多,@Ryan,而且這個問題經常被人們「手動恢復他所吹掉的東西」而延長,而不是回覆這個改變並使他正確地合併。 –

0

實際上,你可以要查看哪些文件可能已經失去了他們提交的文件夾中使用bash腳本:

#!/bin/zsh 
 
for f in $(find . -name '*.php') 
 
do 
 
\t follow=$(git log --oneline -1 --pretty=format:"%h" -- $f) 
 
\t log=$(git log --follow --oneline -1 --pretty=format:"%h" -- $f) 
 
\t 
 
\t if [ $log != $follow ]; then 
 
    \t \t echo "follow $follow , log $log => $f" 
 
    \t fi 
 

 
done

相關問題