Git - reset, checkout, revert 总结

本文最后更新于:2021年11月1日 中午

在git版本管理中,经常有将其他提交与当前代码环境内容交互的需求,其中git resetgit checkoutgit revert是与此类需求有关的一些命令,它们可以用来调整代码仓库中的某些更改;而且git resetgit checkout两个命令不仅可以作用于提交,还可以作用于特定文件,本文介绍上述三个命令的区别与工作原理。

git 基础内容

git 相关基础概念与常用命令使用方法在 Git - 使用教程 中有介绍,本文在此基础上进行展开。

作用域

这三个命令可以作用于提交文件

命令 可用于提交 可用于文件
git reset
git checkout
git revert ×

下面从这两个作用域的角度分别介绍相关命令的功能。

作用于提交

三个命令常用的用法均为回退,但是三个命令的实现细节事实上有很大的区别。

git reset

  • 工作原理:

    当 reset 的作用对象为提交时,reset将一个分支的末端指向另一个提交。

    • 通过传入这些标记来修改你的缓存区或工作目录:

      –soft – 缓存区和工作目录都不会被改变

      –mixed (默认选项) 缓存区和你指定的提交同步,但工作目录不受影响

      –hard – 缓存区和工作目录都同步到你指定的提交

  • 实例应用:

    1
    git reset HEAD~2

    把当前分支reset到HEAD~2。

    1
    git reset --mixed HEAD

    将当前的改动从缓存区中移除,但是这些改动还留在工作目录中。

    1
    git reset --hard HEAD

    完全舍弃还没有提交的改动

checkout

  • 工作原理:

    checkout命令以提交为参数时,将当前工作区、暂存区、仓库均切换到目标提交时的状态。

  • 实例应用:

    1
    git checkout <branch>

    切换到指定分支

    1
    git checkout <commit>

    切换到指定提交

revert

  • 工作原理:

    通过创建一次新的 commit 来撤销一次 commit 所做出的修改。这种撤销的方式是安全的,因为它并不修改 commitm history

  • 实例应用:

    1
    git revert HEAD~2

    将会查出倒数第二次(即当前commit的往前一次)提交的修改,并创建一个新的提交,用于撤销当前提交的上一次 commit

作用于文件

git reset

  • 工作原理:

    当检测到文件路径时,git reset 将缓存区同步到指定的提交。

  • 实例应用:

    1
    git reset HEAD~2 foo.py

    将文件 foo.py 在缓冲区的状态更改为HEAD之前2个的提交。

注: --soft、–mixed和–hard对文件层面的git reset毫无作用,缓存区中的文件一定会变化,而工作目录中的文件一定不变。

checkout

  • 工作原理:

    提取某个已经缓存的文件状态(缓存区、提交)用于覆盖当前工作区的文件。

    与reset作用于文件相比,不同的是checkout更改的文件位置为工作区,reset为暂存区

  • 实例应用:

    1
    git checkout HEAD~2 foo.py

    将工作目录中的foo.py同步到了倒数第二个提交中的foo.py

    1
    git checkout -- foo.py

    当不指定特定提交时,checkout 优先从暂存区中提取文件副本覆盖工作区文件;当文件没有在暂存区提交过(没有add过)时,从仓库中(当前提交)提取文件副本覆盖工作区文件。

    也就是说,该命令会提取最近的一次保存的副本覆盖当前工作区的文件。

参考资料:


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!