git的常用命令和内部存储模式

  • git常用命令
  • 常用命令
  • git内部存储模式


git常用命令

git常用命令包括直接使用bash的命令和git gui的对应用法

常用命令

  1. git status :查看当前HEAD指向哪个branch;
  2. git branch查看分支,如果写上名字,则是创建分支,如“copy_branch", -m 可以改分支的名字;-d 删除分支
  3. git checkout切换分支
  4. git merge进行分支合并,但是首先要切换到Master,从master合并其他分支
  5. git tag big_cats 51d54ff -a -m “Big Cats are comming”,设置标签,有轻量标签和附注标签两种,标签与分支都是一种指示标,也都存放在.git/refs目录下,只是分支是在heads目录中,而标签则是在tags目录中。标签与分支的区别是,分支会随着Commit而移动,但标签不会。
  6. git stash, git stash pop stash@{2},将工作状态暂存,然后切换到别的任务,完成后再从堆栈中恢复状态。
  7. ** git push**将文件推向远端服务,每个本地的branch可以指定一个upstream,指定远端的branch
  8. git fetch/pull从远端获取文件
  9. git clone,,Clone与Pull这两个指令仅从字面上理解,都有“把文件下载到我的计算机”的意思,两个指令的应用场景是不同的。如果这个项目你是第一次看到,想要下载到自己的计算机中,应使用Clone指令;如果已经下载了,只是想更新为最新的在线版内容,则使用Pull(或Fetch)指令。

git内部存储模式

git的主要思想是将内容通过SHA-1算法,计算Hash Code,通过此数据比较是否存在不一致的数据。

$ echo “hello, 5xRuby” | git hash-object --stdin通过此命令,可以算hello, 5xRuby的hash值30ab28d3acb37f96ad61ad8be82c8da46d0a7307,存储在.git/object内容做比较,同时也提示文件的存储位置。

$ git cat-file -t 30ab28d3acb37f96ad61ad8be82c8da46d0a7307 可以通过此命令可以看到类型,不如Tree或者Blob对象

$ git cat-file -p 30ab28d3acb37f96ad61ad8be82c8da46d0a7307可以解压缩文件存储的内容,比如可能是目录/config或者对象index.txt

Tree对象中存储的都是Directed Acyclic Graph(DAG),中文翻译为有向无环图

git的四种对象之间的关系如图

gitlab存储位置转移_gitlab存储位置转移


(1)把文件加入Git之后,文件的内容会被转成Blob对象存储。

(2)目录及文件名会存放在Tree对象内,Tree对象会指向Blob对象或者其他的Tree对象。

(3)Commit对象会指向某个Tree对象。除了第一个Commit,其他的Commit都会指向前一次的Commit对象。

(4)Tag对象(Annotated Tag)会指向某个Commit对象。

(5)分支虽然不属于这4种对象之一,但它会指向某个Commit对象。

(6)往Git服务器上推送之后,在.git/refs下就会多出一个remote目录,里面放的是远端的分支,基本上与本地的分支类似,同样也会指向某个Commit对象。

(7)HEAD也不属于这4种对象之一,它会指向某个分支。

git不是差异备份,也就是说如果一个文件就算只是修改了一个字符,因为SHA-1算法算出的值不同,也会用不同的文件存储。有些版控系统会备份每次Commit之间的“差异”,如这次加了2行、下次删了5行之类的历史记录,然后通过这些信息,像拼图一样一个一个地把文件还原成它该有的样子。git add命令把文件加到暂存区时,即使文件的内容只改了一个字,因为算出来的SHA-1值不同,所以Git也会为它做出一个全新的Blob对象,而不是只记录“差异”。而Git在切换Commit时会像“拎葡萄”一样整串抽出来,不需要一个一个去拼凑历史记录,所以在进行Checkout时效率相对较高。

Git提供了资源回收机制。当启用该机制时,Git会用非常有效率的方式压缩对象及制作下标。Git的资源回收机制通常会在它觉得对象太多时自动触发,也可直接执行git gc命令手动触发:$ git gc 这个命令会把原本放在.git/objects目录下的那些对象全部打包到.git/objects/pack目录下。
$ find .git/objects -type f
.git/objects/info/packs
.git/objects/pack/pack-ea00f1558d67a7df25bf9744f3d83a17a7a2bf43.idx
.git/objects/pack/pack-ea00f1558d67a7df25bf9744f3d83a17a7a2bf43.pack
Git中还有一个比较底层的命令git veryfy-pack,可以用它来查看打包的情况:
$ git verify-pack -v .git/objects/pack/pack-ea00f1558d67a7df25bf9744f3d83a17a7a2bf43.idx
触发回收机制
(1)当.git/objects目录的对象或打包过的packfile数量过多时,Git会自动触发资源回收命令。
(2)当执行git push命令把内容推至远端服务器时(如果仔细观察过Push命令的信息,就会发现这一点)
使用PullRequest(PR)
在GitHub上有非常多的开源项目,有些项目你很感兴趣,也很想帮忙,于是联系项目的原作者跟他说:“我觉得你的项目很有趣,开个权限给我吧,我来帮你加一些功能”。想想看,如果你是原作者,有不认识的人让你开权限给他,你愿意吗?
在GitHub上有个有趣的机制。
(1)先复制(Fork)一份原作者的项目到自己的GitHub账号下。
(2)因为复制的项目已经在自己的GitHub账号下,所以就有了完整的权限,可以随意更改。
(3)改完后,将自己账号下的项目推送(Push)上去。
(4)发个通知,让原作者知道你帮忙做了一些事情,请他看一下。
(5)原作者看完后如果觉得可以,就会把你做的这些修改合并(Merge)到他的项目中。
其中,步骤(4)中的那个“通知”,就是发送一个请原作者拉回去(Pull)的请求(Request),称为PR(Pull Request)。