2009-12-11 32 views
8

我已經被這似乎是git的新手常見問題足以抓出恢復。從忘記的.gitignore

我忘了.gitignore一個特定的文件,並將它添加到提交後.gitignore沒有區別。

我找到了this page on gitready,它解釋瞭如何從存儲庫中刪除文件而不從工作樹中刪除文件(通過使用命令git rm --cached <file>,它工作正常,除非如果我然後嘗試合併到另一個分支,在工作樹中的文件被刪除

重現步驟,在一個空文件夾:

git init 
touch want.txt 
touch wantnot.txt 
git add . 
git commit -m "Initial" 
git checkout -b BranchForIgnore 
git rm --cached wantnot.txt 
cat > .gitignore 
wantnot.txt [Ctrl-D Ctrl-D here to exit cat] 
git add . 
git commit -m "Ignoring file" 

到這裏,一切都很好

git checkout master 
git merge BranchForIgnore 

在這一點上,我的wantnot.txt文件不再在我的主人,顯然,簽出BranchForIgnore也無濟於事。

怎麼辦?

回答

6

我忘了.gitignore一個特定的文件,並將其添加到.gitignore提交後沒有區別。

嗯,當然,事實並非如此。忽略大約未跟蹤文件(這意味着文件不受版本控制)。

我發現了一個網頁上gitready這也解釋瞭如何刪除從庫中的文件,而不從工作樹移除(通過使用命令git rm --cached <file>,該工程確定,但如果我再嘗試合併回到另一個分支,在工作樹中的文件被刪除。

Git的刪除文件,因爲你可以恢復它,因爲它是在一個分支跟蹤。

的解決辦法是調動「untracking 「一個文件(從vers中刪除文件離子控制),使用git cherry-pick或在獨立的提交分支上創建git rm --cached <file> && git commit -a,然後在所有分支中合併此主題分支(然後從跟蹤版本恢復文件)。

+0

謝謝你。鑑於具有相同名稱的文件存在於許多地方,我將如何「從追蹤版本恢復文件」? – Benjol 2009-12-15 08:33:03

+1

當您切換到缺少給定文件的分支時,可以使用例如文件恢復文件。 'git checkout HEAD^- ',或者在更一般的情況下,使用'git log -2 --full-history - '來獲得最後一個文件的提交,然後使用'git checkout來恢復文件 - '或'git show >'。 – 2009-12-15 15:35:58

+0

哇,這是一些嚴重的混帳! – Benjol 2009-12-16 06:58:20

3

將文件重命名爲臨時名稱(不使用git),提交刪除加上.gitignore文件,然後將文件重命名爲其原始名稱。

mv wantnot.txt wantnot.txt.tmp 
git rm wantnot.txt 
echo wantnot.txt >.gitignore 
git add .gitignore 
git commit -m "remove mistakenly committed wantnot.txt" 
mv wantnot.txt.tmp wantnot.txt 

您的這種使用一個單獨的分支可能是不必要的混亂的問題。

+0

謝謝。其實我的問題是,我已經創建了幾個分支出於其他原因,我不想在所有分支中執行此操作(即使我這樣做,我也不太清楚當我開始合併這些更改)。 – Benjol 2009-12-11 10:16:31

+0

我明白了。你可能需要在你的所有分支上執行類似的操作('git cherry-pick'可能對此有用)。當你在跟蹤和不跟蹤'wantnot.txt'的分支之間移動時,它可能會出現並消失,直到你對所有分支都進行了排序。如果此文件很重要,請確保保存副本。 – 2009-12-11 10:19:09

+0

哦,實際的文件是AssemblyInfo.cs,所以在我的工作樹中的每個項目中都有一個,不確定mv是否適用於此(我不是unix命令行專家,但令人驚訝的是git引誘了我) – Benjol 2009-12-11 10:19:11