git reset checkout
程序员文章站
2022-03-21 16:28:01
...
git手册:点击打开链接
Git里有三个区域很重要
-
HEAD 默认指向最近一次commit里的所有snapshot(快照)。
-
Index 缓存区域,只有Index区域里的东西才可以被commit。
-
Working Directory (Working Tree)用户操作区域。
注意:一般会误解为,Index中的内容是空的,只有git add后才会有东西。实际上不是,Index里一直是有东西的。所以,Git的所有操作就是对这三个区域的状态(或内容)的操作。 下文的<commit> 代表提交的hush值 通过git log --oneline 可以查看历史提交记录。
一、reset
1、不加文件名参数
git reset [--hard|soft|mixed|merge|keep] [<commit> | HEAD] :将当前的分支重设(reset)到指定的<commit>或者HEAD(默认,如果不显示指定commit,默认是HEAD,即最新的一次提交)。我们可能reset到任何一个版本, 这样就会出现一个问题:暂存区待提交的文件如何处理,工作区还没有add的文件如何处理。
这时可以通过--soft、mixed、--hard来指定如何处理。–mixed是默认参数,也就是说执行reset的时候不给就认为是--mixed。
--soft :保留暂存区和工作区。
--mixed :重置暂存区(暂存区的所有内容都会丢失);保留工作区。
--hard :重置暂存区和工作区。
target代表想要将git指向到哪个commit
2、加文件名参数
如果带上文件参数,那么效果会是怎样的?
1、HEAD不会动
2、将那个commit的snapshot里的那个文件放到Index区域中 只有index区域中的内容发生改变
1、HEAD不会动
2、将那个commit的snapshot里的那个文件放到Index区域中 只有index区域中的内容发生改变
需要注意的是带文件参数的git reset没有--hard, --soft这两个参数。只有--mixed参数。
git reset [--mixed] [<commit> | HEAD] filename
恢复到历史版本
下面这个命令就是将某个文件恢复到历史版本上。
eb43bf 为版本号
下面这个命令就是将某个文件恢复到历史版本上。
git reset eb43bf file.txt
二、checkout
1、不加文件名参数
git checkout [<commit>|head] :将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git强制你提交所有的更改,这与reset是不同的,这种方式就可以有效避免了工作区和暂存区的文件处理问题。reset版本回退会丢失一前的版本。而checkout不会,只是就head指向的位置移动了,我们还是可以移回来。2、加文件名参数
Checkout一个文件和带文件路径git reset 非常像,它同样不会移动HEAD引用。
checkout 不加版本, 将暂存区将会覆盖工作区。 git checkout . "."是通配符表示所有文件。
checkout 加版本, 将某个版本下的信息复制到工作区和暂存区。
checkout 不加版本, 将暂存区将会覆盖工作区。 git checkout . "."是通配符表示所有文件。
checkout 加版本, 将某个版本下的信息复制到工作区和暂存区。
三、revert
上图可以看到git reset是会修改版本历史的,他会丢弃掉一些版本历史。
而git revert是根据那个commit逆向生成一个新的commit,版本历史是不会被破坏的。
已经push到远程仓库的commit不允许reset
上面已经讲了,git reset是会丢弃掉commit的。
如果commit已经被push到远程仓库上了,也就意味着其他开发人员就可能基于这个commit形成了新的commit,这时你去reset,就会造成其他开发人员的提交历史莫名其妙的丢失,或者其他灾难性的后果。
因此,一旦commit已经被push到远程仓库,那么是坚决不允许去reset它的。
而git revert是根据那个commit逆向生成一个新的commit,版本历史是不会被破坏的。
已经push到远程仓库的commit不允许reset
上面已经讲了,git reset是会丢弃掉commit的。
如果commit已经被push到远程仓库上了,也就意味着其他开发人员就可能基于这个commit形成了新的commit,这时你去reset,就会造成其他开发人员的提交历史莫名其妙的丢失,或者其他灾难性的后果。
因此,一旦commit已经被push到远程仓库,那么是坚决不允许去reset它的。