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 操作。