git config
分成三个级别,global-system-local,低级别覆盖高级别
- --global
读写~/.gitconfig文件
- --system
读写$(preifx)/etc/gitconfig
- --local
读写.git/config
常用配置
[user]
email = 852053151@qq.com
name = xuanyizhao
[url git@github.com]
insteadOf = https://github.com/
[alias]
cin = commit --amend --no-edit
git remote
- 查看
git remote -v
- 添加
git remote add origin_ssh git@github.com:xiaoguikuaipao/xxx.git
git remote add origin_http https://github.com/xiaoguikuaipao/xxx.git
上述命令执行后,会加在.git/config文件中
- 添加(设置push和fetch不是同一个远程仓库)
git remote add origin git@github.com:others/xxx.git
git remote set-url --add --push origin git@github.com:xiaoguikuaipao/xxx.git
- 免密登陆(ssh)
-
生成密钥
ssh-keygen -t ed25519 -C "email" -
密钥默认保存在 ~/.ssh/xxx_ed25519.pub
-
将公钥添加到github仓库
git 管理原理
- git init 生成.git目录
-
objects(commit-tree-blob)
- 查看:
git cat-file -p "dirname+filename" - 在
git add后,会生成blob object,可查看文件内容 - 在
git commit后,会生成commit和tree object,形成树形管理结构,总体如下 - 在现有的commit object上做修改并且commit后,会生成一个新的commit object,他的parent commit指向原本的commit object,并且为修改了的文件生成新tree object和blob object。
- 查看:
-
refs
- heads 可以通过
git checkout -b newbranch新建分支,即克隆当前分支的内容作为新的命名空间 - refs的文件内容,其实就是上面的commit object的内容,相当于指针。
- heads表示分支branch,一般用于开发阶段,会不断变化,指向新的commit object;
- 而tag表示稳定版本,指向的commit object一般不发生变化。可以通过
git tag vx.x.x生成新tag指向当前所在的commit object。可以通过git tag -a vx.x.x -m "message"生成新tag,但是commit object会发生变化,因为多了message的元数据,他是一种tag object类型。
- heads 可以通过
历史版本修改
commmit --amend修改最近的一次commit信息(新增一个commit object 平行修改)
-
分支会指向新commit object,原object不会被删除,如果没有被指向,那么会成为悬空object。可以用
git fsck --lost-found查看。 -
针对上述情况,可以用
git gc进行垃圾回收和object,ref压缩。- 首先
git reflog expire --expire=now --all手动设置日志过期时间,否则gc不会清理。 git gc --prune=now
- 首先
-
git rebase -i HEAD~3实现对最近三个commit的修改- 合并commit
- 修改具体的commit message
- 删除某个commit
-
filter --branch删除所有commit中的某个文件
Clone&Fetch&Pull&Push
- clone. 即直接拷贝,包括.git所有内容
- fetch. 将分支加到.git/refs/remote内,如果需要对远端分支进行修改,要手动
git merge - pull. =fetch+merge
- push.
git push origin master,将当前指向的commit object推到远端,可能发生冲突,可以用-f强制覆盖. 也可以在github上设置保护策略禁止覆盖。
开源社区开发流程
git clonegit checkout -b dev,在dev上做修改git push origin dev- github会返回一个网址PR,在PR中可以进行远端的Merge
代码合并
- --ff-only(git log中没有Merge节点)
- --no-ff(git log中有Merge节点)
- 合并git log观察