这个问题有点难以解释,让我一步一步向你展示。
首先,我有一个空文件夹,我添加了一些文件(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&amp; 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并且什么也没得到。任何建议都表示赞赏。
答案 0 :(得分:2)
这是Git方面的正确和理想的行为。如果您不希望删除更改,请不要使用--hard
。
只需使用git reset <commit id>
,然后手动选择要丢弃的更改。