差异
reset 与 checkout 命令都可能会对 工作区、暂存区、提交历史区 产生因素,它们之间的区别主要在于命令是否会接文件路径参数
不带文件路径参数
git ckeckout [branch]
git reset --hard [branch]
- 相同
这两个命令都会将三个区都恢复成 branch 的样子。 - 不同
- 更新三个区的方式不同:reset 会直接用 branch 指向的快照覆盖掉这三个区;checkout 运行前会检查冲突,如果没有冲突但又更新,它会在工作区中做试着做简单合并,否则该命令会停止运行。
- 更新 HEAD 的方式不同:reset 会连同 HEAD 指向的分支一起移动;checkout 仅移动 HEAD 自身指向目标分支。
带文件路径参数
git checkout [commit] <paths>
git reset --hard [branch] file 次命令无法运行,但这两个命令的含义类似
- 相同
- 都不会移动 HEAD 指向
- 都是用 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 |
[参考]
Comments | NOTHING