Git 中 Reset、Revert、Checkout的区别

更新日期: 2018-12-17阅读量: 1952标签: git

git reset 、 git checkout 和 git revert 是Git中常用命令。经常傻傻分不清他们之间的区别。最近工作不忙,抽出时间参考了其他文档,对其总结了下。


提交层面的操作

传给 git reset 和 git checkout 的参数决定了它们的作用域。如果其后参数不是 filename,这些操作对所有提交生效。注意,git revert没有文件层面的操作。

Reset

在提交层面上,reset 将一个分支的末端指向另一个提交。这可以用来移除当前分支的一些提交。例:

git checkout hotfix
git reset HEAD~2

hotfix分支末端的两个提交现在变成了悬挂提交。下次Git执行垃圾回收的时候,这两个提交会被删除。

如果你的更改还没有共享给别人,git reset是撤销这些更改的简单方法。

除了在当前分支上操作,你还可以通过传入这些标记来修改你的缓存区或工作目录:

  • –soft – 缓存区和工作目录都不会被改变
  • –mixed – 默认选项。缓存区和你指定的提交同步,但工作目录不受影响
  • –hard – 缓存区和工作目录都同步到你指定的提交


Checkout

常见于切换不同分支。

git checkout hotfix

这个命令做的是将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git强制你提交或者缓存工作目录中的所有更改,不然在checkout的时候这些更改都会丢失。和git reset不一样的是,git checkout没有移动这些分支。

除了分支之外,你还可以传入提交的引用来checkout到任意的提交。这和checkout到另一个分支是完全一样的:把HEAD移动到特定的提交。

git checkout HEAD~2

这对于快速查看项目旧版本来说非常有用。但如果你当前的HEAD没有任何分支引用,那么这会造成HEAD分离。这是非常危险的,如果你接着添加新的提交,然后切换到别的分支之后就没办法回到之前添加的这些提交。因此,在为分离的HEAD添加新的提交的时候你应该创建一个新的分支


Revert

Revert撤销一个提交的同时会创建一个新的提交。这是一个安全的方法,因为它不会重写提交历史。比如,下面的命令会找出倒数第二个提交,然后创建一个新的提交来撤销这些更改,然后把这个提交加入项目中。

git checkout hotfix
git revert HEAD~2

相比git reset,它不会改变现在的提交历史。因此,git revert 可以用在公共分支上,git reset 应该用在私有分支上。

你也可以把git revert 当作撤销已经提交的更改,而git reset HEAD 用来撤销没有提交的更改。

就像git checkout 一样,git revert 也有可能会重写文件。所以,Git会在你执行 revert 之前要求你提交或者缓存你工作目录中的更改。


文件层面的操作

git reset和git checkout 命令也接受文件路径作为参数。这时它的行为就大为不同了。

Reset

当检测到文件路径时,git reset 将缓存区同步到你指定的那个提交。比如,下面这个命令会将倒数第二个提交中的foo.py加入到缓存区中,供下一个提交使用。

git reset HEAD~2 foo.py

和提交层面的git reset一样,通常我们使用HEAD而不是某个特定的提交。运行git reset HEAD foo.py 会将当前的foo.py从缓存区中移除出去,而不会影响工作目录中对foo.py的更改。

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


Checkout

Checkout一个文件和带文件路径git reset 非常像,除了它更改的是工作目录而不是缓存区。不像提交层面的checkout命令,它不会移动HEAD引用,也就是你不会切换到别的分支上去。

比如,下面这个命令将工作目录中的foo.py同步到了倒数第二个提交中的foo.py。

git checkout HEAD~2 foo.py

和提交层面相同的是,它可以用来检查项目的旧版本,但作用域被限制到了特定文件。

如果你缓存并且提交了checkout的文件,它具备将某个文件回撤到之前版本的效果。注意它撤销了这个文件后面所有的更改,而git revert 命令只撤销某个特定提交的更改。

和git reset 一样,这个命令通常和HEAD一起使用。比如git checkout HEAD foo.py等同于舍弃foo.py没有缓存的更改。这个行为和git reset HEAD --hard很像,但只影响特定文件。


总结

命令作用域常用情景
git reset提交层面在私有分支上舍弃一些没有提交的更改
git reset文件层面将文件从缓存区中移除
git checkout提交层面切换分支或查看旧版本
git checkout文件层面舍弃工作目录中的更改
git revert提交层面在公共分支上回滚更改
git revert文件层面木有

来源:http://yuanhehe.cn/2016/10/31/Git-中-Reset、Revert、Checkout的区别/


站长推荐

1.云服务推荐: 国内主流云服务商,各类云产品的最新活动,优惠券领取。地址:阿里云腾讯云华为云

链接: https://www.fly63.com/article/detial/1627

200条Git常用命令大全

整理了一些 常用和不常用的一些 Git 命令,希望能帮助到大家更好的掌握 Git 的使用。创建一个新的 git 版本库。这个版本库的配置、存储等信息会被保存到.git 文件夹中

Git忽略规则文件.gitignore_关于.gitignore配置

.gitignore 文件的作用就是告诉git, push的时候忽略指定的文件夹或者文件,例如:vue-cli脚手架创建的项目,push到github上时,不会上传node依赖文件夹,这是因为vue-cli脚手架创建的时候,自动为我们创建了 .gitignroe文件,并且为我们写好了规则。

vscode git 全局忽略文件和文件夹

windows 中先在当前用户根目录下创建一个全局要忽略的文件列表.gitignore_global,window下 只有扩展名的文件不让保存,可以在 git bash中创建文件;二、 然后在命令行下执行下面git 命令

总结Git 不同情况下撤销和如何回滚

在未进行git push前的所有操作,都是在“本地仓库”中执行的。我们暂且将“本地仓库”的代码还原操作叫做“撤销”,进行git push,即已推送到“远程仓库”中。我们将已被提交到“远程仓库”的代码还原操作叫做“回滚”!注意:对远程仓库做回滚操作是有风险的,需提前做好备份和通知其他团队成员!

Git 如何优雅地回退代码? | 案例分析

今天给大家推荐一篇 Git 回滚代码的案例文章,相信大家在日常工作中,也会面临突发情况,需要紧急回滚到之前某个版本的代码,那本篇文章就有了一定的参考意义。另外一个规范的 Gitflow 工作流程

当我们git merge的时候到底在merge什么?

用git add、git commit、git branch等命令的时候,Git在背后究竟做了什么,我是答不上来的。好在互联网上有许多这方面的资料可供学习,现在,我试着循序渐进地讲解一遍吧。

如何在Git提交大小写敏感的文件

大意是说, 忽略大小写敏感是为了在不同的文件系统上更好的工作。比如APFS,HFS +,FAT,NTFS等。例如,如果在目录列表里, Git期望找到一个文件叫Makefile,却找到了makefile,这时候,Git就假定它是同一文件,并继续将其记住为Makefile。

git提交代码commit失败的解决方法

不同操作系统下处理行尾结束符的方法是不同的,windows下是CRLF(句尾使用回车和换行),unix下是LF(只换行),mac下是CR(只回车)

git同步源码到gitee和github

如何把我们的源码同步到gitee或github远程仓库中,同步方式分以下几种:先查看下我们是否有远程仓库:git remote -v,如有就要删除远程仓库或是同命令覆盖,如全新安装就不需要!

git 常用命令

在当前目录新建一个Git代码库;新建一个目录,将其初始化为Git代码库;下载一个项目和它的整个代码历史

点击更多...

内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!