读书笔记 --《Pro Git》

栏目: 编程工具 · 发布时间: 6年前

内容简介:关于《Pro Git》的阅读笔记,查漏补缺,补充Git的相关知识。Work Directory:工作空间,就是被Git所管理的本地项目目录。Index:可以理解为Git的暂存区。

关于《Pro Git》的阅读笔记,查漏补缺,补充Git的相关知识。

资料

对象模型

Git保存的并不是文件差异,而是一系列不同时刻的被修改文件的快照。可以把Git理解为一个本地的内容寻址文件管理系统,管理着众多版本的文件。

下图是Git保存的对象,其利用树结构指向不同的版本。

读书笔记 --《Pro Git》

Blob

Blob通常用来存储文件内容,做文件镜像使用。

读书笔记 --《Pro Git》

Tree

在工作区做的变更使用树形来维护,树可以指向Blob,也就是变更文件,或者指向其他的树来关联未变更的文件。

读书笔记 --《Pro Git》

Commit对象

Commit对象指向 一个 tree对象,另外Commit中还保存着相关提交者信息,以及上一个提交,一个Commit可能存在多个parent对象,比如两个分支汇聚到一点,产生的这个commit就会有两个parent。

读书笔记 --《Pro Git》

Tag

Tag指向一个Commit对象。

读书笔记 --《Pro Git》

工作模型

Git的工作模型揭露了我们在git项目中所采取的操作造成的影响。

读书笔记 --《Pro Git》

Work Directory:工作空间,就是被Git所管理的本地项目目录。

Index:可以理解为Git的暂存区。

Head:当前所在的分支,其指向当前已经commit的最新内容。

1. 本地添加文件

本地添加只会改变 work directory
读书笔记 --《Pro Git》

2. git add

添加到暂存区,本质上是把本地目录修改的文件copy一份到Index区域。

读书笔记 --《Pro Git》

3. git commit

Commit之后Head对应的本地分支中也会多一份文件镜像。

读书笔记 --《Pro Git》

了解了这些那么很多命令就很好理解了。

1. git status

status实际上就是比较三个空间的差异,Index区域使用绿色,work directory使用红色。

2. git reset

reset操作有三个等级, --soft 下只会回滚HEAD区域的文件内容。 --mixed 会回滚HEAD以及INDEX区域的内容。 --hard 则会回滚全部区域的内容。

3. git revert

revert的操作可以理解在Work Directory把对应commit的修改全部撤销掉,然后添加到INDEX区域 ,最后合并到HEAD区域产生一个新的commit。

操作

删除已提交文件

git rm --cached <文件名>   # 从已提交的内容中删除文件,删除后重新提交即可删除远程仓库的该文件。
git rm <文件名>  # 与上述类似,不过会连本地文件一起删除

修补提交

工作中经常遇到提交了commit之后发现有东西忘记提交了,然后又起了一个commit,实际上可以通过修改最后一次提交方式搞定。

# 该命令本质是把暂存区的文件和最后一次提交并入一起,如果指定了文件名,则把该文件与最后一次提交并入一起。
git commit --amend [文件名]

变基Rebase

读书笔记 --《Pro Git》 当前在experiment分支,执行 git rebase master ,Git会进行如下操作:

  1. 找到C4,C3最近的共同祖先C2
  2. 找到C2-C4之间的所有变更文件,存为临时文件。
  3. 将当前分支Head指向C3
  4. 依次把临时文件应用在C3,这个过程中会产生冲突,产生则需要手动订正,然后 git rebase --continue 继续apply
    读书笔记 --《Pro Git》

Rebase原则:“只对尚未推送或分享给别人的本地修改执行变基操作清理历史,从不对已推送至别处的提交执行变基操作”

pull –rebase

普通的 pull = fetch + mergepull --rebase = fetch + rebase

reset –hard误操作

一个迭代分支可能是 C1 -> C2 -> C3 ,然后执行 git reset --hard C1 ,那么C2和C3的修改 就会丢失,此时没有指向他们的引用,不过因为Git每次都是镜像存储,因此只需要找到C2和C3对应的提交ID,即可恢复。

使用 git reflog 查看HEAD指针改变的历史记录,从中找到对应的CommitId,使用 “git branch newbranch commitId” 创建一个新的分支,指向该次提交,找回丢失的文件。

引用日志会被清理的,如果没有则可以使用 git fsck --full ,该命令列出所有未被其他对象指向的commitId。

大文件删除

假设某人误操作向Git中提交了大文件,产生了一个commit,然后删除了该大文件,又产生了一个commit,对于之后的人clone,由于要拉下来完整的变更,因此每次都需要下载含有大文件的镜像。

解决方案是找到大文件的历史提交,然后重写对应的提交以及之后的提交。

  1. git verify-pack -v .git/objects/pack/压缩pack.idx | sort -k 3 -n | tail -3 ,pack指定你自己的,该命令列出比较大的一些commitId
  2. git rev-list --objects --all | grep commitId ,使用该命令查看该次commitId提交的大文件名称
  3. git log --oneline --branches -- 文件名 ,使用该命令查看对该文件进行过改动的提交,记录下第一个改动的id
  4. git filter-branch --index-filter \ 'git rm --ignore-unmatch --cached 文件名' -- 第一次改动Id^.. ,执行该命令,重写第一次提交大文件之后的所有相关修改,使用 git rm --cached 来删除之前的提交记录。
  5. rm -rf .git/refs/originalrm -rf .git/logs , git gc ,移除包含有旧提交指针的文件,并且 重新打包。

撤销合并

有时候已经合并到了master分支,但是需要回滚代码,那么就涉及撤销操作。

revert方式

在git提交信息中,commit分为两种,一种是开发提交的commit,一种是merge产生的commit,对于merge commit一般会有两个parent节点。 git revert 一般有两种形式:

git revert <commit id> ,撤销指定的commit,Git会把该commit的修改全部撤销,并产生一个新的commit。

git revert -m 1 <merge commit id> ,-m参数表示两个合并父节点的第一个还是第二个,该操作会把对应的合并内容全部撤销,并产生一个新的commit。

注意revert掉的分支在此合并会出现无法合并的现象,因为撤销后被撤销的分支实际上与当前仓库没有文件关联,解决方案是撤销Revert节点,然后再次合并该分支。


以上所述就是小编给大家介绍的《读书笔记 --《Pro Git》》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

第二曲线:跨越“S型曲线”的二次增长

第二曲线:跨越“S型曲线”的二次增长

[英]查尔斯·汉迪(Charles Handy) / 苗青 / 机械工业出版社 / 2017-6 / 49.00

S型曲线是每个组织和企业在预测未来时一定会参考的工具,一切事物的发展都逃不开S型曲线(“第一曲线”)。 然而,从公司组织、企业治理、市场的变化,到个人职业发展、社会人际关系以及未来的教育与社会价值,多维度地探讨这个世界需要重新以不同的角度来思考问题,不能够总是停留在“第一曲线”的世界。 如果组织和企业能在第一曲线到达巅峰之前,找到带领企业二次腾飞的“第二曲线”,并且第二曲线必须在第一曲......一起来看看 《第二曲线:跨越“S型曲线”的二次增长》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具