从忘记恢复.gitignore

时间:2009-12-11 10:08:11

标签: git

git newbies似乎是一个常见的问题,我已经被抓住了。

我忘了.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也无济于事。

怎么办?

2 个答案:

答案 0 :(得分:7)

  

我忘了.gitignore一个特定的文件,并在提交之后将其添加到.gitignore没有任何区别。

嗯,当然不是。忽略是关于未跟踪文件(这意味着文件不受版本控制)。

  

我在gitready上找到了一个页面,该页面解释了如何从存储库中删除文件而不将其从工作树中删除(使用命令git rm --cached <file>,该工作正常,除非我尝试要将其合并回另一个分支,工作树中的文件将被删除。

Git删除文件是因为你可以恢复它,因为它是在一个分支中跟踪的。

解决方案是使用git cherry-pick在所有分支中提交“取消跟踪”文件(从版本控制中删除文件),或在单独的提交分支上创建git rm --cached <file> && git commit -a,然后合并此主题分支在所有分支中(然后从跟踪版本中恢复文件)。

答案 1 :(得分:4)

将文件重命名为临时名称(不使用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

您对此使用单独的分支可能会不必要地混淆问题。