git reset checkout

来源:互联网 发布:淘宝联盟优惠券怎么用 编辑:程序博客网 时间:2024/05/16 12:59

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 :重置暂存区和工作区。


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




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指向的位置移动了,我们还是可以移回来。


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它的。
原创粉丝点击