Skip to content

Git-reset当中的soft和hard

cite: https://stackoverflow.com/questions/3528245/whats-the-difference-between-git-reset-mixed-soft-and-hard

1. git的三棵树

  • workspace/source tree: 就是本地物理意义上的文件树
  • index/staged/staging tree:用过git add添加进去的“暂存区”
  • commit tree:持久化写入

2. reset回退的三种状态

  1. soft:影响commit tree
  2. mixed:影响commit tree + staged tree
  3. hard:影响commit tree + staged tree + workspace

image.png|450

3. git reset --soft

  • 只影响commit tree
  • 比如以下场景: image.png|400
  • 想要回退红框里面的提交,但是希望添加进去的file11.md这个文件,依然处在staged tree当中,所以需要使用不影响当前暂存区状态(staged tree) 的命令git reset --soft 4a4fa3a
  • 使用之后,commit tree如下所示: image.png|425
  • staged tree如下所示:状态不变image.png|325image.png

4. git reset --mixed

  • 这是reset的默认状态
  • 暂存区(staged tree)会改变,但是 工作区(workspace)不变
  • 示例如下所示:
    • 工作区有“未暂存的更改”:tmp-file.md
    • 完成提交 c14d7c8d,现在希望将此提交回退到 44542fb5 状态

image.png|425

  • 回退之后,staged tree 应该是空的,因为 44542fb 状态对应的 staged tree 就是空的
  • workspace 保持不受影响,那么之前添加的 tmp-file.md 依然得到了保留,并且 file12.md 会回退到workspace当中(被从staged tree 当中清理出来了) image.png|575