欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

git reset checkout

程序员文章站 2022-03-21 16:28:01
...

git手册:点击打开链接


Git里有三个区域很重要

  1. HEAD 默认指向最近一次commit里的所有snapshot(快照)。

  2. Index 缓存区域,只有Index区域里的东西才可以被commit。

  3. 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 :重置暂存区和工作区。
git reset checkout

target代表想要将git指向到哪个commit

git reset checkout


2、加文件名参数

如果带上文件参数,那么效果会是怎样的?
1、HEAD不会动
2、将那个commit的snapshot里的那个文件放到Index区域中      只有index区域中的内容发生改变

需要注意的是带文件参数的git reset没有--hard, --soft这两个参数。只有--mixed参数。

git   reset   [--mixed]    [<commit> | HEAD]    filename


恢复到历史版本
下面这个命令就是将某个文件恢复到历史版本上。
git reset   eb43bf    file.txt

eb43bf 为版本号



二、checkout

1、不加文件名参数  

git  checkout   [<commit>|head]  :将HEAD移到一个新的分支,然后更新工作目录。因为这可能会覆盖本地的修改,Git强制你提交所有的更改,这与reset是不同的,这种方式就可以有效避免了工作区和暂存区的文件处理问题。reset版本回退会丢失一前的版本。而checkout不会,只是就head指向的位置移动了,我们还是可以移回来。

git reset checkout

2、加文件名参数

Checkout一个文件和带文件路径git reset 非常像,它同样不会移动HEAD引用。
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它的。