git stash恢复被忽略的文件

时间:2013-11-14 15:18:27

标签: git gitignore git-stash

我过去曾向git提交了一些错误的文件。之后我排除并忽略了这些文件:

git rm --cached -r config.php
git reset config.php
echo "config.php" >> .gitignore
git update-index --assume-unchanged config.php

现在git commit很棒。未提交config.php中的更改。

但是:如果我存储工作目录,例如切换分支,则从本地存储库恢复config.php。

如何在不更改忽略(以及从索引排除)文件的情况下使用git stash

2 个答案:

答案 0 :(得分:0)

已编辑的答案

您执行了git rm --cached -r config.php,但没有提交更改。

接下来你做了git reset config.php,这清除了你以前做过git rm的效果。所以你现在回到你开始的地方。

然后,您将config.php添加到.gitignore。这不会有任何影响,因为现在仍然会跟踪config.php

最后,您执行了git update-index --assume-unchanged config.php,因此如果您执行git status / git diff,则无法在本地看到任何更改。这些步骤给出了git rm.gitignore在没有这些步骤时正常工作的错觉。

相反,这样做(-r标志是多余的,这不是目录)

git rm --cached config.php
echo config.php >> .gitignore && git add .gitignore
git commit -m "removing config.php"

原始答案

  

但是:如果我存储工作目录,例如切换分支,则从本地存储库恢复config.php。

好吧,您刚从当前分支中删除了config.php(我们称之为master),但另一个分支other仍在跟踪它。这就是你看到它的原因。它与git stash无关。

您可能应该将分支master合并到other以将提交带入分支other

答案 1 :(得分:0)

我在https://help.github.com/articles/remove-sensitive-data找到了解决方案:

git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch config.php' \
--prune-empty --tag-name-filter cat -- --all

可能需要reset才能将其从以后的提交中排除:

git reset config.php

在从本地分支机构删除config.php的所有信息之后,我强行推送更新远程回购:

git push origin master --force

现在,我的藏匿区工作正常。