AI写作智能体 自主规划任务,支持联网查询和网页读取,多模态高效创作各类分析报告、商业计划、营销方案、教学内容等。 广告
## 7.7 重置揭密 **三棵树** Git 作为一个系统,是以它的一般操作来管理并操纵这三棵树的: * HEAD:上一次提交的快照,下一次提交的父节点。 * Index:预期的下一次提交。 * Working Directory:沙盒。 **HEAD** HEAD 是当前分支引用的指针,它总是指向该分支上的最后一次提交。 这表示 HEAD 将是下一次提交的父结点。 可以通过 `cat-file` 来查看快照的信息: ``` $ git cat-file -p HEAD ``` 通过 `ls-tree` 来查看快照实际的目录列表,以及其中每个文件的 SHA-1 校验和: ``` $ git ls-tree -r HEAD ``` **索引** 索引是预期的下一次提交,这个概念引用为 Git 的 “暂存区域”。 ### 7.7.1 工作流程 ![](https://img.kancloud.cn/c1/8c/c18c8a5566e9971d49df4f0f10db6cc0_800x441.png) **重置的作用** 假设现在有工作历史 ![](https://img.kancloud.cn/2a/0a/2a0a0af25c4fe13be348045397a08b01_800x658.png) 在执行了 `git reset` 命令后,移动 HEAD 的指向。 这与改变 HEAD 自身不同(`checkout`所做的),默认情况下是 `--soft` 模式,即不修改索引和工作目录中的内容。 ![](https://img.kancloud.cn/4f/41/4f41c84a916e8df1bf6514e55afbf21b_800x702.png) 如果使用 `--mixed` 选项,git 会在移动HEAD的指向的同时修改索引中的内容。 ![](https://img.kancloud.cn/89/5a/895add4c68c61323e8f086909d281bb1_800x702.png) 如果使用 `--hard` 选项,git 会在移动HEAD的指向的同时修改索引和工作目录中的内容。 ![](https://img.kancloud.cn/f6/a3/f6a30834e2747981f8a3fa0a869151fa_800x702.png) **通过路径来重置** 如果在运行 `git reset` 是附加上一个文件的路径: ``` $ git reset [file] $ git reset --mixed HEAD [file] ``` 那么 git 会跳过移动 `HEAD` 的指向,然后让索引中对应的文件看起来像 `HEAD` 的指向中的对应文件。它还有取消暂存文件的实际效果。 ![](https://img.kancloud.cn/9c/46/9c4625d783656809bec8d9922199852a_800x702.png) 如果指定选项 `--hard` ,工作目录中的对应文件也会被一并修改。 **压缩** 如果想要压缩若干次提交,可以使用 `git rest --soft [SHA-1]` 命令先将 `HEAD` 的指向这些需要被压缩的提交的父节点,但不改变索引,然后在这个父提交的基础上新建一次提交,这个提交即为若干个提交的压缩。 ### 7.7.2 检出 `checkout` 和 `reset` 的区别在于 `checkout` 只会移动 `HEAD`,而不是 `HEAD` 的指向。而如果为 `checkout` 命令指定一个路径,它的作用就和 `git reset --hard [file]` 命令一样。