这个问题有点难以解释,让我一步步告诉你。
首先,我有一个空文件夹,添加一些文件(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/