赞
踩
1. 原理:对文件进行压缩,转换成blob存放
2. 关联命令
2.1. git add
2.1.1. 用途:将文件内容添加到索引存放位置为.git/objects/
2.1.2. 把文本文件压缩成blob
2.1.3. 把二进制文件压缩成blob(压缩后的文件略大于源文件)
2.2. git gc
用途:清理不必要的文件并优化本地存储。压缩后的文件如:.git/objects/pack/pack-xxxxx.pack
2.3. git ls-files -s
作用:显示有关索引和工作树中文件的信息。(blob信息))
1.原理:对.git/objects/中的blob进行压缩,最后生成.git/objects/pack/pack-xxxx.pack。压缩后占用空间小,便于传输。
2.关联的命令
2.1. git gc
2.1.1. 作用:对.git/objects/中的对象进行压缩
2.1.2. 效果:压缩并在.git/objects/pack中生成2个文件。
pack-xxxx.idx :这是存放索引的文件(例如git log或者git cat-file -p看到的信息)。
pack-xxxx.pack :这是对象压缩的实体文件
2.2. git verify-pack
2.2.1. 作用: 验证pack中的包含的对象
2.2.2. 用法:这里可以对pack-xxxx.idx/pack-xxxx.pack 进行验证,效果是一样的。
2.3.命令:
git verify-pack -v 路径/pack-xxxx.idx(pack)
3. pack中的看到的奥秘
3.1. 我们可以从git verify-pack中看到,我们存储的blob很多都有同一个祖先blob(同一文件修改)。(大的文本文件的修改很直观)
3.2. pack的压缩效果明显,就是因为这些存储差异的blob,他们占用的空间很小。
3.3. 对于二进制文件,因为生成不了差异的blob,每个blob都是完整的文件, 所以压缩几乎没有效果。
3.4. 由于被压缩成pack,我们checkout其他分支的时候,速度会受影响。(因为需要从pack中取文件出来)
4. 实例
直接在库中进行git gc的命令。
1.原理:把xxxx.pack中的对象解压到.git/objects/中。
2.关联命令
git unpack-objects
2.1. 用途:从打包好的pack文件中解压缩对象。
2.2 注意:仓库中已经存在的对象不会从pack中解压出来。
如果需要实验,则需要mv .git/objects/pack/pack-xxx.pack 到其他目录。
2.3. 用法:git unpack-objects -v <xxx.pack
3.实例
3.1.实际用途暂时不详???????
3.2. 用例操作:
a. mv .git/objects/pack/pack-xxx.pack .git
b. git unpack-objects -v <.git/xxx.pack
就会把对象解压到.git/objects中。
c. 再次执行git gc,就会被压缩至./git/objects/pack中。
d. 解压前,压缩后的pack的哈希值一致。
1.原理:把unreached的对象删除
2.关联的命令
2.1. git gc
用途:清理不必要的文件并优化本地存储。
压缩后的文件如:.git/objects/pack/pack-xxxxx.pack
执行的原理:
2.1.1.把松散的对象压缩到存档文件pack中。
2.压缩由2部分组成:commit及关联的对象;以及暂存区存在的对象。
3.对暂存区的对象A(已经打包在pack中),如果对其进行修改并git add(产生新对象B),A被踢出暂存区;执行git gc 后A被提出pack,B进入pack。
2.git prune
用途:从对象数据库中删除所有不可访问的对象。
这里说的不可访问是:没有commit号关联的对象,以及不在暂存区中的对象。
通常情况:git gc会自动调用git prune
git prune-packed
删除已经在pack包文件中的不可访问的对象。
3.git fsck
用途:验证数据库中对象的连通性和有效性
git fsck --unreacheable --no-reflogs :罗列出不可达的对象
4.git verify-pack
用途:验证打包的git存档文件。
打包后的文件如:.git/objects/pack/pack-xxxxx.pack
实际命令:
git verify-pack -v .git/objects/pack/pack-xxxx.pack.
罗列出pack中所包含的对象(commit、tree、blob)
3.实例
1.查看unreacheable的信息命令
git fsck --unreacheable --no-reflogs
2.删除unreacheable的信息命令
git -c gc.reflogExpire=0 -c gc.reflogExpireUnreachable=0 -c gc.rerereresolved=0 -c gc.rerereunresolved=0 -c gc.pruneExpire=now gc
git merge
19.fast forward合并
原理:指针快速冲刺,没有产生merge信息。没有新的对象生成。
前提:
master分支: master的指针保持不变
bugfix分支:基于master分支拉出来的,并且有新的提交。
操作及输出:
xx@xx:/data2/local_gerrit/test$ git merge bugfix
Updating e54b213..801c4a1
Fast-forward
444 | 1 +
1 file changed, 1 insertion(+)
create mode 100644 444
关联命令
git merge
用途:把2个或者多个分支合并为一个分支
git merge 后会生成一个.git/ORIG_HEAD。可以方便回退merge。
特殊用法:
1.git merge -s ours :直接忽略合并分支的任何内容,只做简单的合并,保留分支改动的存在。(只带入提交信息)
git merge -s theirs: 现在的git 版本中不存在了。
2.git merge -s recursive -X ours : 真实合并,遇到冲突以ours的改动为主。
20.3 way merge
原理:合并两个有分叉的分支,会产生merge信息,生成新的对象。
无冲突
前提:
master分支: master的指针保持不变
bugfix分支:基于master分支拉出来的,并且有新的提交。
dev1分支:基于master分支拉出来的,并且有新的提交。
bugfix与dev1修改的非相同文件。
操作及输出:
git checkout dev1
git merge bugfix
会产生一个merge的提交信息
有冲突
前提:
master分支: master的指针保持不变
bugfix分支:基于master分支拉出来的,并且有新的提交。
dev1分支:基于master分支拉出来的,并且有新的提交。
bugfix与dev1修改的是相同文件同一位置。
操作及输出:
git checkout dev1
git merge bugfix
会产生一个merge的提交信息,并且有冲突残生,需要手动解决冲突。
21.带冲突的3 way merge
1.merge冲突的产生必要条件:
1.对同一个文件进行了修改。
2.修改的位置相同
2.关联命令
git ls-files -s
作用:显示有关索引和工作树中文件的信息。(blob信息))
git cat-file -p
作用:查看对象的详细信息。
3.解决冲突的工具:
git merge tool $file_name
常用的工具有
meld
vimdiff
22.git rebase
1.原理:把rebase对象的提交记录做为base,然后把自己的提交重新基于base做commit。(变基)
2.关联命令
git rebase $base_branch
作用:把当前分支的提交,基于$base_branch重新做commit。 哈希值会变化。
3.优缺点
优点:
1.提交都是线性的
2.可以方便看出修改的先后顺序
3.提交记录很干净
缺点:
无法看出分支与分支之间的关系。
23.git tag
1.lightweight
git tag v1.0.0
只产生一个tags信息,保存在.git/refs/tags中
2.annotated
git tag -a v1.0.0 -m "version 1.0.0"
1.产生tag信息:保存在.git/refs/tags中
2.产生一个tag的哈希值:保存在.git/objects中
1.保存tag的message信息
2.保存作者和时间信息
24.本地分支与远程分支
关联命令
git remote
git remote -v
查看远程库的地址信息
git remote show origin
查看远程库和本地库的关联情况
git remote prune
清理本地已经tracked的,但是远程已经删除的分支。
git branch
git branch -r
查看远程分支
git branch -a
查看所有分支
git branch
查看本地分支
git branch -vv
查看本地分支与远程分支的关联
git log
git log --no-decorate
不显示log信息关联的branch、tags信息
27.什么是FETCH_HEAD
在当前分支执行fetch,.git/FETCH_HEAD的第一行就会指向当前分支的远程分支。
.git/FETCH_HEAD
跟着git fetch变化。
这个是给git pull用的。因为git pull还包含了git merge的动作。
34.git-submodule
1.应用场景:当代码需要引用第三方库、软件包的时候,需要把三方库的文件放在submodule中。
关联命令
git submodule add <url> <path>
添加submodule库到当前的库。
submodule 是不会随同git clone把内容clone下来的。
git submodule update --init --recursive
clone后检出子模块的内容
git submodule update --remote
更新子模块的内容
35.git worktree
1.应用背景:紧急切换工作分支,需要保存当前的工作现场。
2.关联命令
git stash
用途:将更改存储在脏的工作目录中。
生成的stash信息存放在./git/refs/stash
在当前的目录工作
命令集:
git add .
git stash [save] 可对stash的内容加comments
git stash list
git stash pop 默认是堆栈,但可以选择pop对象
git worktree
用途:管理多个工作树
生成的worktree信息存放在.git/worktrees/中
新的工作目录为$new_path,需要切换到新目录进行紧急任务开发。
命令集:
git worktree add $new_path $branch_name 创建新的worktree
git worktree list :列举worktree信息
git worktree remove $new_path :删除worktree
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。