git reset、git revert 和 git checkout 有什么区别

发布于 2023-10-08 04:29:21 字数 2036 浏览 30 评论 0

这个问题同样也需要先了解一下 git 仓库的三个组成部分:

  1. 工作区(workspace): 在 git 管理下的正常目录都算是工作区,我们平时的编辑工作都是在工作区完成的
  2. 暂存区(stage):临时区域。里面存放将要提交文件的快照
  3. 历史记录区(history):git commit 后的记录区域

三个区的转换关系以及转换所使用的命令:

gitresetrevert

git resetgit revertgit checkout 的共同点:用来撤销代码仓库中的某些更改。

不同点:

从 commit 层面说起:

  • git reset 可以将一个分支的末端指向之前的一个 commit。然后下次 git 执行垃圾回收的时候,会把这个 commit 之后的 commit 都扔掉。 git reset 还支持三种标记,用来标记 reset 指令影响的范围:

    • --mixed: 会影响到暂存区和历史记录区。也是默认选项
    • --soft:只影响历史记录区
    • --hard:影响工作区、暂存区和历史记录区

注意: 因为 git reset 是直接删除 commit 记录,从而会影响到其它开发人员的分支,所以不要在公共分支比如(develop)做这个操作

  • git checkout 可以将 HEAD 移到一个新的分支,并更新工作目录。因为可能会覆盖本地的修改,所以执行这个指令前,你需要 stash 或者 commit 暂存区和工作区的更改。
  • git revertgit reset 的目的是一样,但做法不同,他会以创建新的 commit 的方式来撤销 commit,这样能保留之前的 commit 历史,比较安全。另外,同样因为可能会覆盖本地的修改,所以执行这个指令前,你需要 stash 或者 commit 暂存区和工作区的更改。

然后,从文件层面来说:

  • git reset 只是把文件从历史记录区拿到暂存区,不影响工作区的内容,而且不支持 --mixed、--soft、--hard

  • git checkout 则是把文件从暂存区拿到工作区,不影响暂存区的内容。

    • 当执行 git rm --cached 命令时,会直接从暂存区删除文件,工作区则不会做出改变
    • 当执行 git checkout . 或者 git checkout -- 命令时,会用暂存区全部指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动
    • 当执行 git checkout HEAD . 或者 git checkout HEAD 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区以及工作区的文件。这个命令也是具有危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动
  • git revert 不支持文件层面的操作

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

贱贱哒

暂无简介

0 文章
0 评论
520 人气
更多

推荐作者

13886483628

文章 0 评论 0

流年已逝

文章 0 评论 0

℡寂寞咖啡

文章 0 评论 0

笑看君怀她人

文章 0 评论 0

wkeithbarry

文章 0 评论 0

素手挽清风

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文