2012-07-12 275 views
1

我得到了一個項目文件,就像這樣:跟蹤更改

MyProject/ 
    a.txt 
    b.txt 
    c.txt 

我在目錄初始化一個Git回購,但(愚蠢)沒有添加所有文件到開始回購。相反,在我意識到需要更改它們之前,我將文件添加到回購中。

git add a.txt; git commit -m "Pristine A" 
<awesome changes to a.txt> 
git commit -am "Awesome Changes" 

不幸的是,在我瘋狂的編輯狂熱中,我忘了爲某些文件做這件事。 (閱讀:幾十文件在多個目錄中,這將是很難用明確的路徑找到)

<awesome changes to b.txt> 
git status # Uh oh, new file b.txt 

我可以在我真棒變化獲得該項目的快照,這樣的Git能告訴我哪自那時起文件發生了變化。但是,我不想丟失我已經添加的數十次提交(帶有描述)。

如何獲得「原始」快照,並讓Git計算哪些文件與我的工作目錄相比發生了變化,而不會丟失我現有的提交,也不會爲那些已更改但已記錄的文件獲得誤報在提交?

FWIW我原來的「正當理由」在一開始不添加整個目錄,是因爲有成千上萬無關我的工作文件,目錄是唯一可用的高延遲SMB,我認爲那我知道哪些文件很重要。

+0

這是全部在一個分支上嗎? – vergenzt 2012-07-12 17:14:57

+0

@vergenzt是的,所有在主分支。 – Phrogz 2012-07-12 17:19:43

+0

此外,只是爲了澄清,這是準確的:你目前的回購顯示'b.txt'和'c.txt'已被創建在後來的提交中,但你希望它顯示它們已被創建(作爲初始提交中的原始副本),以下提交只是更改它們? **編輯:**沒關係,我想我現在明白你的問題。 – vergenzt 2012-07-12 17:20:14

回答

3

使用您的原始快照並創建一個新的git存儲庫(添加所有文件並提交它們)。

在當前的倉庫,做

git remote add pristine /path/to/pristine/repository 

事後

git remote update pristine 

現在,您可以參考原始倉庫的主人在git diff

git diff pristine/master 

看到之間的完全差異你的工作目錄和原始提交。如果您只需要變更集,--summary應該是您正在尋找的選項。 git diff手冊頁詳細介紹了所有其他交換機。

這應該會導致一個變更集,其中已經添加的文件與已經修改但未添加的文件不同。

你以後要做什麼取決於你,但應該可以採用原始提交併使用rebase,將其放在樹的開頭,添加每個文件,然後重播每個提交。

+1

如果你使用'git remote update pristine'來獲取原始的repo,那麼你可以使用'pristine/master'來引用它的主分支,而不是在某處亂寫hash:可能會使得這個過程更加簡單和強壯。 – araqnid 2012-07-12 17:32:50

+0

謝謝,編輯它。 – Femaref 2012-07-12 17:54:20