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也无济于事。
怎么办?
答案 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
您对此使用单独的分支可能会不必要地混淆问题。