git - 一旦忽略的文件在 git reset --hard 后消失

标签 git

这个问题有点难以解释,让我一步步告诉你。

首先,我有一个空文件夹,添加一些文件(a&b)和一个忽略文件 b 的 .gitignore 文件。

work@Work-PC:~/gitTest$ ls -a
.  ..
work@Work-PC:~/gitTest$ echo "123" > a
work@Work-PC:~/gitTest$ echo "456" > b
work@Work-PC:~/gitTest$ echo "b" > .gitignore

然后,我执行 git init、git add 和 git commit。

work@Work-PC:~/gitTest$ git init
Initialized empty Git repository in /home/work/gitTest/.git/
work@Work-PC:~/gitTest$ git add -A
work@Work-PC:~/gitTest$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   .gitignore
#   new file:   a
#
work@Work-PC:~/gitTest$ git commit -m "c1"
[master (root-commit) 5e032d6] c1
 2 files changed, 2 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 a

您可以看到文件 b 被忽略。

但现在我突然意识到我不应该一开始就忽略b。所以我清空 .gitignore 并再次 git add&commit。

work@Work-PC:~/gitTest$ echo "" > .gitignore
work@Work-PC:~/gitTest$ git add -A
work@Work-PC:~/gitTest$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   .gitignore
#   new file:   b
#
work@Work-PC:~/gitTest$ git commit -m "c2"
[master 0c25718] c2
 2 files changed, 2 insertions(+), 1 deletion(-)
 create mode 100644 b

到目前为止一切都很顺利。

但现在我想回到我第一次提交时的版本,所以我 git reset --hard 。

work@Work-PC:~/gitTest$ git reset --hard HEAD^
HEAD is now at 5e032d6 c1
work@Work-PC:~/gitTest$ ls
a

我发现文件b丢失了!这不是我想要的。

我希望文件b在.gitignore被清空之前保持原始版本,并且只有在.gitignore被清空之后才能被git跟踪。

我认为文件 b 消失的原因是,当我清空 .gitignore 后第二次提交时,git 认为创建了一个新文件 b,因此当我重置到之前的提交时,git 会删除该文件。

如何解决这个问题?在实际情况中,我在“清空.gitignore”之前已经提交了很多次,“首先清空.gitignore并重做所有内容”是不可能的。

我用关键字“git .gitignore reset”在 stackoverflow 上进行了搜索,但一无所获。如有任何建议,我们将不胜感激。

最佳答案

对于 Git 来说,这是正确且理想的行为。如果您不希望它删除更改,请不要使用 --hard .

只需使用 git reset <commit id>然后手动选择要放弃的更改。

关于git - 一旦忽略的文件在 git reset --hard 后消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26857177/

相关文章:

git gc --aggressive 推送到服务器?

git - 我的 Git bash 忘记了我的别名。我能做些什么?

git - 如何删除已删除的文件,使其不显示在我的本地 git 状态中?

git diff 没有按预期进行比较

django - Git - 如何将代码从我的中央 Git 存储库部署到我的生产服务器?

git - 如何在 Git 2.23 中禁用 "git checkout"?

git - .gitignore 文件应该位于 IntelliJ 中的什么位置?

git filter-branch 只改变受影响的提交

git - 如何使用 gpg-agent 批量签署 git 标签

git - 有没有一种方法可以在不使用个人访问 token 的情况下从脚本向 github 进行身份验证?