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
-
在远端先创建一个仓库
-
本地初始化并commit一个仓库
3.给当前代码仓库添加一个子module
-
进入子模块目录,后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 # 此命令可以存储远端仓库密码,避免多次输入。