当前位置:   article > 正文

git 高阶分享_git 分享

git 分享

一、git对象的压缩

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信息))

二、git “pack“的压缩

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的命令。

三、git “pack”的解压缩

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/589112
推荐阅读
相关标签
  

闽ICP备14008679号