git 学习笔记 | 青训营

40 阅读3分钟

git config

分成三个级别,global-system-local,低级别覆盖高级别

  1. --global

读写~/.gitconfig文件

  1. --system

读写$(preifx)/etc/gitconfig

  1. --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)
  1. 生成密钥 ssh-keygen -t ed25519 -C "email"

  2. 密钥默认保存在 ~/.ssh/xxx_ed25519.pub

  3. 将公钥添加到github仓库

git 管理原理

  1. git init 生成.git目录

  1. objects(commit-tree-blob)

    1. 查看:git cat-file -p "dirname+filename"
    2. git add后,会生成blob object,可查看文件内容
    3. git commit后,会生成commit和tree object,形成树形管理结构,总体如下
    4. 在现有的commit object上做修改并且commit后,会生成一个新的commit object,他的parent commit指向原本的commit object,并且为修改了的文件生成新tree object和blob object。
  2. refs

    1. heads 可以通过git checkout -b newbranch新建分支,即克隆当前分支的内容作为新的命名空间
    2. refs的文件内容,其实就是上面的commit object的内容,相当于指针。
    3. heads表示分支branch,一般用于开发阶段,会不断变化,指向新的commit object;
    4. 而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类型。

历史版本修改

  1. commmit --amend 修改最近的一次commit信息(新增一个commit object 平行修改)

  1. 分支会指向新commit object,原object不会被删除,如果没有被指向,那么会成为悬空object。可以用git fsck --lost-found 查看。

  2. 针对上述情况,可以用git gc进行垃圾回收和object,ref压缩。

    1. 首先 git reflog expire --expire=now --all 手动设置日志过期时间,否则gc不会清理。
    2. git gc --prune=now
  3. git rebase -i HEAD~3实现对最近三个commit的修改

    1. 合并commit
    2. 修改具体的commit message
    3. 删除某个commit
  4. filter --branch 删除所有commit中的某个文件

Clone&Fetch&Pull&Push

  1. clone. 即直接拷贝,包括.git所有内容
  2. fetch. 将分支加到.git/refs/remote内,如果需要对远端分支进行修改,要手动git merge
  3. pull. =fetch+merge
  4. push. git push origin master,将当前指向的commit object推到远端,可能发生冲突,可以用-f强制覆盖. 也可以在github上设置保护策略禁止覆盖。

开源社区开发流程

  1. git clone
  2. git checkout -b dev,在dev上做修改
  3. git push origin dev
  4. github会返回一个网址PR,在PR中可以进行远端的Merge

代码合并

  1. --ff-only(git log中没有Merge节点)

  1. --no-ff(git log中有Merge节点)

  1. 合并git log观察