13. reset 与 revert 与 checkout 有什么区别?
首先是它们的共同点:用来撤销代码仓库中的某些更改。
然后是不同点:
1)从 commit 层面来说:
git reset,可以将一个分支的末端指向之前的一个 commit 。然后再下次 Git 执行垃圾回收的时候,会把这个 commit 之后的 commit 都扔掉。git reset还支持三种标记,用来标记 reset 指令影响的范围:--mixed:会影响到暂存区和历史记录区。也是默认选项;--soft:只影响历史记录区;--hard:影响工作区、暂存区和历史记录区。注意:因为
git reset是直接删除 commit 记录,从而会影响到其他开发人员的分支,所以不要在公共分支(比如 develop)做这个操作。
git checkout,可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。git revert,和git reset的目的是一样的,但是做法不同,它会以创建新的 commit 的方式来撤销 commit ,这样能保留之前的 commit 历史,比较安全。另外,同样因为可能会覆盖本地的修改,所以执行这个指令之前,你需要 stash 或者 commit 暂存区和工作区的更改。
2)从文件层面来说
git reset,只是把文件从历史记录区拿到暂存区,不影响工作区的内容,而且不支持--mixed、--soft和--hard。git checkout,则是把文件从历史记录拿到工作区,不影响暂存区的内容。git revert,不支持文件层面的操作。
总的来说,回答关键点:
- 对于 commit 层面和文件层面,这三个指令本身功能差别很大。
git revert不支持文件层面的操作。- 不要在公共分支做
git reset操作。
