2011-09-14 48 views
7

假設我有一個包含數百個文件的目錄。我修改了其中的幾個,但之後我發現我的變化很糟糕。如果我這樣做:我怎樣才能恢復git結帳修改的文件?

git checkout whole_folder 

然後再次檢查所有東西,我必須重新編譯一切。有沒有辦法讓結帳隻影響修改過的文件,還是我需要分別在每個文件上運行checkout

+0

如果你'git的結帳 - '(稍微更安全的'git的結帳版本whole_folder')時間戳保持對於那些未被該命令更改的文件也是如此。這意味着您的構建過程應該仍然只是重建基於mtimes的最低限度認爲需要的文件。 –

+0

你確定git檢查了一切嗎? IIRC git會嘗試真正難以檢出只有修改過的文件,而且在執行git checkout - whole_folder或git reset --hard HEAD時不會觸及其他任何內容。 – holygeek

+0

那麼,我應該做'git checkout - whole_folder'? – Geo

回答

13

試試這個:

$ git checkout `git ls-files -m` 

-m只列出了修改過的文件。

+0

是否有可用的跨平臺解決方案?我有時從標準的'cmd.exe'外殼使用Windows。 – Geo

2

你在做什麼是正確的,但你可能要添加一個非模糊--以防萬一你有這一樣一個分支名稱的目錄名,即:

git checkout -- whole_folder 

git會只更新它實際上需要更改的文件的時間戳,所以如果您的基於依賴關係的構建工具正確使用mtimes,則應該重建最小安全文件數量。如果你看到不同的行爲,那將是一個錯誤。

2

git checkout -- $(git ls-files -m) 

也checksout被刪除的文件。

如果只想籤修改過的文件這個工作對我來說:

git checkout -- $(git status -uno | grep --colour=never '#' | awk '{ print $2 $3 }' | grep --colour=never ^modified: | cut -c10-) 
+0

謝謝@TheFox。它幾乎奏效。它必須稍微修改一下命令,以使其適用於我。這裏是我使用的行: '''git checkout - $(git status | grep modified:| cut -c14-)''' – user1029978