我创建了一个带有提交的存储库
git init
touch 1.txt
touch 2.txt
git add .
git commit -m "POINT 1"
touch 3.txt
git add .
git commit -m "POINT 2"
在这个阶段,我们有一个包含两个提交的存储库,可以在清单中看到,然后使用命令git log转到提交POINT 1git checkout d5b633
结果,我们进入提交状态POINT 1并查看列表git log中消失的内容POINT 2,但是,可以通过使用git reflog列表输出调用另一个列表(列表)来找到它:
$ git reflog
d5b633b (HEAD) HEAD@{0}: checkout: moving from master to d5b6
ab5ba15 (master) HEAD@{1}: commit: POINT 2
d5b633b (HEAD) HEAD@{2}: commit (initial): POINT 1
我看到丢失的提交 POINT 2并使用以下命令输入其哈希:
git checkout ab5b
团队正在工作。文件系统符合提交的状态POINT 2
请解释为什么,在上述操作之后,提交从列表中消失,如git log,并且命令git status返回一条消息
HEAD detached at ab5ba15
nothing to commit, working tree clean
???
PS 我无法在此消息中添加标签“GIT”(不在列表中)
执行命令时,
checkout将指针移动HEAD到分支(分支实际上是它的顶部提交以及所有可以更深入的提交,每个提交都有指向前一个提交的链接,所有内容看起来像一个列表数据结构)。移动指针后HEAD,commitpoint 2竟然在这个分支的上面,也就是在它外面,所以它不在command的输出git log里面,里面有很多options,如果你输入command with option--all,那么你将看到提交(git log --all --graph --oneline如果需要,我使用命令查看通常不可见的内容,它还显示 stash (stash),这也是临时提交)。并且您的更改保留在第二次提交中,因此文件系统或索引中没有更改,因此该命令的输出
git status没有任何提交。一个命令不仅会移动HEAD,而且会同时更改提交、索引和文件系统 -git reset(--soft或--hard不带参数),执行它时,HEAD^您只会看到git status.