你应该知道的git

2019-04-01  本文已影响0人  Lyan_2ab3

git 起步

git 基础

gitversion.png

git 的完整性

git 工作原理

.git

.
└── .git
    ├── HEAD
    ├── branches
    ├── config
    ├── description
    ├── hooks
    │   ├── applypatch-msg.sample
    │   ├── commit-msg.sample
    │   ├── post-update.sample
    │   ├── pre-applypatch.sample
    │   ├── pre-commit.sample
    │   ├── pre-push.sample
    │   ├── pre-rebase.sample
    │   ├── pre-receive.sample
    │   ├── prepare-commit-msg.sample
    │   └── update.sample
    ├── info
    │   └── exclude
    ├── objects
    │   ├── info
    │   └── pack
    └── refs
        ├── heads
        └── tags

find .git/objects -type f

git 存储

git 存储了Blobs,tree,commit ,Tag ,References 五种对象,这些对象存储在/objects和/refs 中
这些对象的名称是一段40位的哈希值,此名称由其内容依据sha-1算法生成,具体到.git/object文件夹下,会取该hash值的前 2 位为子文件夹名称,剩余 38 位为文件名,这四类对象都是二进制文件,其内容格式依据类型有所不同。

当我们 对文件进行修改的时候,变化的文件 会生成一个 Blob 对象,记录这个版本文件的全部的内容,然后针对该文件有一个唯一的 SHA-1的校验和。针对没有变化的文件就拷贝上一个版本的指针,而不会生成一个全新的Blob 对象

每次提交可能不仅仅只有一个tree 对象,指明了项目的不同的快照,但是必须记住所有的对象SHA-1校验和才能获得完整的快照。

commit 对象的格式指明了改时间点 项目快照顶层的快照tree 对象 作者提交信息

Blobs

tree

tree 记录了文件的结构,某个tree 对象记录了某个文件的结构包含子文件,也是40位哈希值


WechatIMG198.png

commit

MacBook-Pro-9:笔记 xmly$ git cat-file -p 7374
tree 40921d92618284e2a9dc6333c0351593f2e754ff
parent ef6987c5cbbb222b8c951bed911abd0530cac9d2
author lyan.lei <lyan.lei@ximalaya.com> 1553582698 +0800
committer lyan.lei <lyan.lei@ximalaya.com> 1553582698 +0800

git
MacBook-Pro-9:笔记 xmly$ 

References

.git/refs
├── heads
│   ├── master
│   ├── 你的分支
│   └── ...
├── remotes
│   ├── origin
│   │   ├── ANDROIDBUG-4845
│   │   ├── ActivityCard-za
│   │   ├── ...
├── stash
└── tags


➜ cat .git/refs/heads/master
603bdb03d7134bbcaf3f84b21c9dbe902cce0e79

这个其实就是一个 指向当前分支最新的commit 的指针

git 的工作区域

git工作区域.png

git add * 把改动提交到 》 缓存区(Index)
git commit -m '说明' 命令就把改动提交到了仓库区(当前分支)本地仓库

WechatIMG200.png

git add [file] 发生了什么

WechatIMG199.jpeg

其中各项的含义如下:

git status

.get/HEAD 存储着仓库当前位于的分支 cat .git/HEAD

git commit 发生了什么

git cat-file -t 查看某对象的类型

git cat-file -p hash 查看某对象的内容

MacBook-Pro-9:lyan-learn xmly$ git cat-file -t 3942
commit
MacBook-Pro-9:lyan-learn xmly$ git cat-file -t bf7b
tree
MacBook-Pro-9:lyan-learn xmly$ git cat-file -p 3942
tree bf7bbedce04c0fd31a9a383303785b16cd593220
parent 9f761d649b2fc9349f1523ee037ede0919ce577a
author lyan.lei <lyan.lei@ximalaya.com> 1553592553 +0800
committer lyan.lei <lyan.lei@ximalaya.com> 1553592553 +0800

修改图片路径
MacBook-Pro-9:lyan-learn xmly$ git cat-file -p bf7bbedce04c0fd31a9a383303785b16cd593220
100644 blob b4307a84d87fc4103cb29b99a099b53ad6ff2660    .DS_Store
100644 blob e54482ba3055538efe8bc644289aab2d49b8b03a    index.html
040000 tree 6d58575858c86defeae2c0e68b5cec5243ea8aa6    node_modules
100644 blob df6e18f4798830922e757b2e4c4e5d8cf610514d    package-lock.json
160000 commit 79fa4a3aa5987e8ffb8f0f36e7da6c0a4afc3e1c  webpack-demos
040000 tree 2d0790369cb2d4bc0715828b35862cf80e8b9618    "\347\254\224\350\256\260"
MacBook-Pro-9:lyan-learn xmly$ 

git branch

cat .git/config

MacBook-Pro-9:lyan-learn xmly$ cat .git/config
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/Lyan0505/lyan-learn.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]




    remote = origin
    merge = refs/heads/master

git checkout

git merge

Git 分支合并: 快度向前合并 和三路合并

我们会遇到,怕污染主分支的代码,在主分支上拉取新的分支修改,在主分支没有修改的前提下,这样肯定不会又冲突,直接合并就行了。相当于修改 .refs/heads 下主分支内容指向的最新commit 对象
[图片上传失败...(image-d4216b-1554105124963)]

WechatIMG202.png
  • 决定不合并。这时,唯一要做的就是重置index到HEAD节点。git merge --abort用于这种情况。

git reset

MacBook-Pro-9:lyan-learn xmly$ git reset --hard
 HEAD is now at ec66ae7 update

移动HEAD 所指向的分支指向的commit ,比如:你在master分支上工作,执行git reset 6789002(假如这是commit 对象的SHA-1哈希值)
这时候master 当前指向的commit 改为6789002 的commit对象。git commit 会创建一个新的commit ,git reset 会修改HEAD 所指向的,也就是把分支的指向改成原来的指向,过程不会修改INdex 和工作目录 (reset 的本质撤销上一次的commit 命令)

git reset --hard 会恢复工作区上次commit 的快照 ,也就是清空工作区所做的更改

如果说reset 后面指定路径 git reset file.txt 其实是 git reset --mixed HEAD file.txt 的简写形式 ,会将作用范围限定在指定的文件和文件夹,此时分支指向不会移动,不过索引和工作目录的内容则是可以完成局部的更改的

git stash

使用场景: 假如你在test 上修改,但是你有紧急的bug 需要切换到别的分支修改,可以先git stash ,最后返回test 执行git stash list 查看所有的 list 执行 git stash apply,恢复最新的stash到工作区;

MacBook-Pro-9:lyan-learn xmly$ git stash save 'test-git'
Saved working directory and index state On master: test-git
MacBook-Pro-9:lyan-learn xmly$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean
MacBook-Pro-9:lyan-learn xmly$ git stash list
stash@{0}: On master: test-git
MacBook-Pro-9:lyan-learn xmly$ 

MacBook-Pro-9:lyan-learn xmly$ git stash pop
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   "\347\254\224\350\256\260/\345\205\250\351\235\242\347\220\206\350\247\243git/git.md"

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (721e2f4eb9ea605d08f8c5e7df7d839a35904700)

原理: 执行git stash 实际上 我们依据工作区,缓存区,以及HEAD 这三颗文件数 ,分别生成commit
,以这三个commit 对象 生成的新的commit 对象,代表此次stash ,并把 这个commit 存到.git/refs/stash

MacBook-Pro-9:lyan-learn xmly$ git stash list
stash@{0}: On master: test
MacBook-Pro-9:lyan-learn xmly$ cat .git/refs/stash
e607a1a61fe7e059e5501e920ff02c365d62bc20
MacBook-Pro-9:lyan-learn xmly$ git cat-file -p e607
tree 35633ee997617f747c06aa91eb040d613e663175
parent ec66ae750aceabe6b1591442941a29f50509a8cd
parent bce7ee4e66e7088c2a687832ebdd798a9dacbb4a
author lyan.lei <lyan.lei@ximalaya.com> 1554103269 +0800
committer lyan.lei <lyan.lei@ximalaya.com> 1554103269 +0800

On master: test
MacBook-Pro-9:lyan-learn xmly$ 

参考 https://www.jianshu.com/p/9f993e50caa0
https://git-scm.com

上一篇下一篇

猜你喜欢

热点阅读