git reset 与 git checkout 的差异

发布于 2021-07-28  69 次阅读


差异

reset 与 checkout 命令都可能会对 工作区、暂存区、提交历史区 产生因素,它们之间的区别主要在于命令是否会接文件路径参数

不带文件路径参数

git ckeckout [branch]

git reset --hard [branch]
  • 相同
    这两个命令都会将三个区都恢复成 branch 的样子。
  • 不同
    1. 更新三个区的方式不同:reset 会直接用 branch 指向的快照覆盖掉这三个区;checkout 运行前会检查冲突,如果没有冲突但又更新,它会在工作区中做试着做简单合并,否则该命令会停止运行。
    2. 更新 HEAD 的方式不同:reset 会连同 HEAD 指向的分支一起移动;checkout 仅移动 HEAD 自身指向目标分支。

带文件路径参数

git checkout [commit] <paths>

git reset --hard [branch] file 次命令无法运行,但这两个命令的含义类似
  • 相同
    1. 都不会移动 HEAD 指向
    2. 都是用 commit 提交中的那个文件来 覆盖工作区(和暂存区)的文件,所有都是不安全的操作

对比表

HEAD 对暂存区是否有影响 对工作区是否有影响 对工作区是否安全?
Commit Level
reset --soft [commit] REF NO NO YES
reset [commit] REF YES NO YES
reset --hard [commit] REF YES YES(直接覆盖) NO
checkout HEAD YES YES(无冲突自动合并,否则无法工作) YES
File Level
reset [commit] NO YES NO YES
checkout [commit] NO YES YES(直接覆盖) NO

[参考]

  1. Git-工具-重置揭密