3.git reset --mixed
还是这个场景:
(F)
A-B-C
↑
master
我输入了 git reset --mixed,结果是:
(F)
A-B-C
↑
master
分支指针指向上次提交点,但是文件状态还是在当前文件 C ,我看到的现象就是 C 文件还在,但是没有 add ,是红色的。
该指令特点是分支指针动,而文件状态指针不动
3、听说过git reflog?
git reflog 是一个非常有用的命令,可以展示已经执行过的所有动作的日志。包括合并、重置、还原,基本上包含我们对的我们的分支所做的任何修改。
如果我们犯了错,可以根据 reflog 提供的信息通过重置 HEAD 来轻松地重做!
假设我们实际上并不需要合并原有分支。当我们执行 git reflog 命令时,我们可以看到这个 repo 的状态在合并前位于 HEAD@{1}。那我们就执行一次 git reset,将 HEAD 重新指向在 HEAD@{1} 的位置。
Reflog操作+回退操作
二、git工作流程
执行git add后
使用cat命令打开
乱码原因是git对储存内容进行了二进制压缩,采用更有效的命令
成功读取数据,blob包含一个文件中要存储的数据和一个头部信息一起做SHA-1散列运算
乱码可以理解成数据的标识数据
上面的58c9bd等信息代表的键是位置,111是存储的数据
在之前的命令中objects新增了两个文件
然后我们发现这个objects是一个tree
tree是一个目录结构,从左往右分是文件权限 、文件类型、文件的内容对应的sha1值、文件名字
增加对应的两个文件
tree流程用图形看
同时我们还多出来一个objects,commit,存储的是快照,提交内容从左到右是,作者名、提交时间、最后一次提交的作者名和提交时间
commit流程从图形上看是这样的
分支
head、分支、普通的tag可以理解成为一个指针,指向对于conmmit的sha1值,从图形上看
问题1:为什么要把文件的权限和文件名储存在tree object里面而不是blob object呢?
想象一下修改一个文件的命名。如果将文件名保存在blob里面,那么Git只能多复制一份原始内容形成一个新的blob object。而Git的实现方法只需要创建一个新的tree object将对应的文件名更改成新的即可,原本的blob object可以复用,节约了空间。
问题2:每次commit,Git储存的是全新的文件快照还是储存文件的变更部分?
由上面的例子我们可以看到,Git储存的是全新的文件快照,而不是文件的变更记录。也就是说,就算你只是在文件中添加一行,Git也会新建一个全新的blob object。那这样子是不是很浪费空间呢?
这其实是Git在空间和时间上的一个取舍,思考一下你要checkout一个commit,或对比两个commit之间的差异。如果Git储存的是问卷的变更部分,那么为了拿到一个commit的内容,Git都只能从第一个commit开始,然后一直计算变更,直到目标commit,这会花费很长时间。而相反,Git采用的储存全新文件快照的方法能使这个操作变得很快,直接从快照里面拿取内容就行了。
当然,在涉及网络传输或者Git仓库真的体积很大的时候,Git会有垃圾回收机制gc,不仅会清除无用的object,还会把已有的相似object打包压缩。
问题3:Git怎么保证历史记录不可篡改?
通过SHA1哈希算法和哈希树来保证。假设你偷偷修改了历史变更记录上一个文件的内容,那么这个问卷的blob object的SHA1哈希值就变了,与之相关的tree object的SHA1也需要改变,commit的SHA1也要变,这个commit之后的所有commit SHA1值也要跟着改变。又由于Git是分布式系统,即所有人都有一份完整历史的Git仓库,所以所有人都能很轻松的发现存在问题。
大佬参考
- 书籍 Scott Chacon, Ben Straub - Pro Git-Apress (2014)")
- 书籍 Jon Loeliger, Matthew McCullough - Version Control with Git, 2nd Edition - O’Reilly Media (2012)")
- Rebase and the golden rule explained
B站视频链接: [中文] 这才是真正的 Git——Git 内部原理揭秘!(freeCodeConf 2019 深圳站)_哔哩哔哩_bilibili PPT 链接: 这才是真正的Git——Git原理及实用技巧
本人参考文章:
1、Git对象(objects)简介_.git/objects-CSDN博客
3、关于 git reset 命令几个常用参数的理解_git reset的各种参数意义-CSDN博客
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!