这是我参与「第三届青训营 -后端场」笔记创作活动的第6篇笔记。
1.查看git仓库结构
tree .git //linux
winpty tree.com .git //git bash,另一种办法是下载tree.exe文件
2.查看git仓库中当前分支信息
cat .git/HEAD
3.常见git配置
//查看git仓库中配置信息
cat .git/config
//不同的配置级别,由高到低,低级别的配置会覆盖高级别的配置
--system //存在/etc/gitconfig目录下
--global //存在~/.gitconfig目录下,用户目录
--local //存在.git目录下
//用户名配置
git config --global user.name "name"
git config --global user.email xxxx@xxx.com
//instead of配置
//对协议的替换,比如将http换成https
git config --global usl.git@github.com:.insteadOf https://github.com/
//别名配置
//例:将 --amend --no-edit 命令简化为 cin
git config --global alias.cin "commit --amend --no-edit"
4.git remote
配置本地和远端的一些关联信息
//查看remote
git remote -v
//添加remote源,同时从这个源上fetch和push
git remote add orgin_ssh git@github.com:git/git.git
git remote add orgin_http https://github.com/git/git.git
//设置这个源push时的url,实现fetch和push可以不在同一个仓库
git remote set-url --add --push origin git@github.com:new_repo/git.git
//配置也可以直接通过vim更改
HTTP Remote(不推荐,不够安全)
URL
免密配置
//内存
git config --global credential.helper 'cache --timeout=3600'
//硬盘
git config --global credential.helper "store --file /path/to/credential-file"
//不指定目录时默认是~/.git-credentials
SSH Remote
URL
git@github.com:git/git.git
免密配置
SSH通过公私钥的方式,生成公钥放在服务端,从而实现免密访问
目前Key有四种:dsa、rsa、ecdsa、ed25519
默认使用rsa,dsa和rsa不够安全,优先推荐使用ed25519。
ssh-keygen -t ed25519 -C "591923227@qq.com"
//密钥默认存在~/.ssh/id_ed25519.pub
5.git add
//创建文件
touch readme.md
//查看当前状态
git status
//将文件从工作区添加至暂存区
git add .
//提交commit
git commit -m "add readme"
//查看变更日志
git log
6.Objects
commit / tree / blob 在git里被统称为Object,除此之外还有个tag的object
-
Blob: 存储文件内容
-
Tree: 存储文件的目录信息
-
Commit: 存储提交信息,一个Commit可以对应唯一版本的代码
悬空的Object
修改Commit之后,object会新增文件,但之前的commit object并未被删除,出现了没有ref指向的object,即悬空的Object
git fsck --lost-found //查找悬空的object
这种不需要的object,可以通过git GC来删除
7.Refs
Refs存储的内容是对应的Commit ID
ref为一个指针指向对应的Commit来表示当前Ref对应的版本
8.Tag
标签一般表示一个稳定版本,指向的Commit一般不会变更
git tag v0.0.1
Annotation Tag(附注标签)
git tag -a v0.0.2 -m "信息" //也会生成一个object的tag,存在tagger信息
9.查看文件内部信息
git cat-file -p a03fab0cd625da260077ee7e68d0f9dcf8dbde0e2b//最后为文件全名
10.修改历史版本
1.commit --amend
通过git commit --amend修改最近一次的commit信息,修改后commit id会变
2.rebase
通过git rebase -i HEAD~3可以实现对最近三个commit的修改
可执行的操作:
1.合并commit
2.修改具体的commit message
3.删除某个commit
3.filter
通过filter --branch指定删除所有提交中的某个文件或者全局修改邮箱地址等操作
11.GC
通过git gc命令删除一些不需要的object,以及会对object进行一些打包成pack,将refs打包成pack-refs压缩来减少仓库的体积。
Reflog
记录操作日志,防止误操作后数据丢失。
通过reflog来找到丢失的数据,手动将日志设置为过期。
git reflog expire --expire=now --all //设置日志的过期时间
git gc --prune=now //指修建多久以前的对象,默认是两周前
12.Branch
//创建新分支
git checkout -b test
//切换分支
git checkout branchName
13.Clone & Pull & Fetch
clone
拉取完整的仓库到本地目录,可以指定分支和深度。
Fetch
将远端某些分支最新代码拉取到本地,不执行merge操作
会修改refs/remote内的分支信息,如果需要和本地代码合并需要手动操作
Pull
拉取远端某分支,并和本地代码进行合并,操作等同于git fetch + git merge
也可以通过git pull --rebase完成git fetch + git rebase操作
可能存在冲突,需要解决冲突
Push
常用命令:
git push origin master
冲突:
如果本地的commit记录和远端的commit历史不一致,则会产生冲突
如果该就一个人使用,可以通过git push orgin master -f来完成强制推送
14.分支管理工作流-Github Flow
只有一个主干分支,基于Pull Request往主干分支中提交代码。
团队合作的方式:
1.owner创建好仓库后,其他用户通过fork来创建自己的仓库,并在fork的仓库上进行开发(没有提交权限)
2.owner创建好仓库后,同意给团队内成员分配权限,直接在同一个仓库内开发