git基本原理介绍

视频链接 https://space.bilibili.com/364122352/channel/collectiondetail?sid=290009

1.代码仓库初始化

mkdir git-demo
cd dit-demo


注:执行git init 前

注:执行git init 后

注:执行rm -rf .git/hooks/.sample命令之前

注:执行rm -rf .git/hooks/
.sample命令之后

注:当前git的配置文件

注:git 的global 配置文件
可以通过下面命令获取 git config --global -l

# 修改当前配置文件
git config user.name "demo"
git config user.email "demo@demo.com"
# 查看当前配置文件 
git config  -l

2.git add 背后发生了什么




注:前后多了1个目录,2个文件


注:没有生成新的blob,说明blob 不存储文件名称。


~ > echo -e "blob 10\0hello git" | shasum         #注:10为内容长度值                                                                                                                                                           15:52:21
8d0e41234f24b6da002d962a26c2495ea16a425f  -

3. 聊聊blob和SHA1哈希





注:反向解析压缩文件内容

4.聊聊工作区和索引区



注:git ls-files 会将当前在索引区里面的文件列出来



注:修改对应的blob 对象发生了变化

5. git commit 背后发生了什么


注:执行commit 前

注:执行commit 后
git commit 后生成了两个对象,一个tree 对象,一个commit 对象
git commit 后除了会生成2个对像,logs 和refs 文件也有变化


文件内容为commit 对象

6.继续梳理commit

修改文件file2,执行git add *,和git commit -m "haah" 后


注:说明git里面,空文件夹不算任何内容


注:只增加了一个blob 对象

注:本次commit生成了3个对象,一个commit, 2个tree对象
git commit 不会生成blob对象

7. git的文件状态

8. branch 和head


分支:有名字的指针,指向特定的commit

注:head 指向当前工作分支最新的commit

9.分支操作的背后

git branch 查看分支
git branch <branch_name> 创建分支
git branch -D <branch_name> 删除分支(注 -D为强制删除,-d会帮我们确认依赖关系,然后删除)
git checkout 更改当前工作分支

注:上图中指针实际上是指向master 分支,只不是dev当时也是同一个commit


注:以上命令是git checkout dev 后,显示当前工作分支为dev 分支


注:删除前会确认有没有被merged.

注:不能删除当前处于的分支

注:删除分支,不会删除对应的tree和blob 对象。所遗留的对像也可以称为垃圾对像

10 checkout 特定的commit

git log




注:git checkout -b 创建并进入分支



注:git reflog 会将我们之前进行的git 相关操作全部记录下来

11. 聊聊git diff


注:右边是工作区,左边是索引区

注:- 索引区 + 工作区
git diff --cached 会对比索引区和代码仓库的不同

远程仓库的添加




注:执行后.git的文件数量和目录数量没有任何变化



注:增加了4个目录,2个文件 。4个目录分别为refs/remotes refs/remotes/origin logs/remotes logs/origin 2个文件分别为 refs/remotes/origins/master logs/origin/master

13. 远程仓库到底"长啥样"


注:一个仓库多一个目录


14. git对象的压缩

主要是对blob 对象的压缩

注:对于文档文件重复的内容多的话有明显效果。对于二进制文件压缩后可能比原始文件还大。

注:多次修改少量内容后 执行git add 和git commit 后,每个blob文件都很大
git gc

注:都压缩到了.git/objects/pack 文件里面了

15. 关于sha1的小插曲

sha1已经不安全了


注:对于git来说还是相对安全的

16. git pack 压缩




注:idx 为索引文件 ,用于定位压缩的对象

注:后面可以是idx文件或者pack文件都可以

17. git pack的解压缩

git unpack-objects
git help unpack-objects


18. git垃圾对象的清理



git prunel

注:-n 表示 dry-run

另一种垃圾对象的产生方法



git fast foward





注:git merge 后多了一个文件名叫ORIG_HEAD

20. 什么是3way merge




然后wq后保存退出


21. 带冲突的3 way merge








22. 什么是git rebase


注:隐藏了分支的结构



gitrebase 简单说就是让分支有master的最新commit,自己分支的commit sha1值也会改变。
注:尽量不要在master上面做git rebase。

23. 标签tag 到底怎么回事



注:执行git tag v1.0.0 后,在.git/refs/tags目录下多了一个文件



注:多了一个目录 ,2个文件
在.git/refs/tags目录下多了一个文件,及tag 类型的对象



注:执行git tag -d v1.0.0 命令后,对像的tag类型的对象并没有被删除。

注:再次创建标签后,同时又会创建一个对象。原因为对象里面有时间戳。

24. 本地分支和远程分支1








注:git remote show origin 会连接网络检查本地分支和远程分支的连接情况。
更改master分支并提交后,再查看

注:packed-refs 压缩文件不会实时。
git log 后

远端超前本地一个commit

git branch 查看本地分支
git branch -r 查看远端分支
git branch -a 查看本地分支和远端分支
git remote -v

git fetch 同步远程分支代码





注:git fetch 只同步远程有,而本地没有的分支。远端删除的分支同步不到本地。
可以通过 git remote prune 或git fetch --prune 来处理


git merge origin/master 将远端分支merge 到本地

git pull 这个命令等同于git pull 加 git merge origin/master 。

26. git fetch & git pull

如果很确定没有冲突的话,可以直接用git pull 。方便快捷
如果不确定是否有冲突,或者确定有的话,先然后 git fetch
然后执行 git difff /origin/master 可以查看详细差别。

27. 什么是fetch_head

远端增加分支并提交一个commit,然后在本地执行git fetch 后
增加了3个目录,6个文件


注:在某一个分支上去执行git fetch后,FETCH_HEAAD文件的第一行就是分支所对应的远程分支对应的commit对象。

28. git pull 详解


注:git reset --hard ORIG_HEAD 将上一步git merge 回滚

29. 详细聊聊git push 命令







注:--set-upstream 参数为和远端仓库进行关联。下图是没有加此参数的情况

git push --set-upstream origin feature-1 也可以简写为
git push -u origin feature-1


git push origin -d feature-1 #删除远端仓库









注:-d 不能删除是因为分支有一些操作没有merge到master

30. 聊聊本地的git hooks

可以实现在特定操作之前或之后来触必一些动作

31. pre-commit 钩子

对于git 来讲,默认不会对hooks里面的所有文件堆送到服务器。

32. git hook 和python









33. 结尾

官方文档 https://git-scm.com/
https://git-scm.com/book/en/v2

34. git submodule

  1. 在远端先创建一个仓库

  2. 本地初始化并commit一个仓库

    3.给当前代码仓库添加一个子module


  3. 进入子模块目录,后add 及commit


5. 创建新的仓库,并git push


注:克隆时不会直接获取submodule的内容


注:上述命令为从远端仓库第一次拉取,后面再次列新时将--init 参数去掉即可,如下图





注:多用于依赖于另外一个仓库的东西,现在很少用了,被包管理工具替代。

35. git worktree

用于一个分支,没有修改完成提交。需要切换到另一个分支时

也可以用git stash 实现,下面先演示git stash


下面演示git worktree 来实现

注:上图命令的意思是将master分支代码checkout 到 ../awx-ansible-demo-master目录里去


36. git cherry-pick




注:此操作叫Backport
下面演示git cherry-pick






git cherry-pick 可以cherry-pick一个或多个commit

37. git patch & apply

日常工作应用不是很多


注:文件为新增的,是执行git format patch -1 后新增的





38. 再谈pre-commit


这是一个python项目,可以用在编程语言里面





git代码上传到github python代码

from git import Repo
import time
FILEPATH='/Users/lifei/lifeitest/gittest'
repo=Repo(FILEPATH)
#remote = repo.create_remote(name='github', url='git@github.com:lifei188022/gittest.git')
repo.index.add("*")
repo.index.commit('configs auto saving at %s' %time.asctime())
remote = repo.remote()
remote.push()

git config credential.helper store # 此命令可以存储远端仓库密码,避免多次输入。

posted @ 2023-10-12 18:05  lifei888  阅读(35)  评论(0)    收藏  举报