Git使用 | 青训营笔记

156 阅读5分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第5篇笔记

Git基本命令

  • 配置
    • git config
    • git remote
  • 提交代码
    • git add
    • git commit
  • 远端同步
    • 拉取代码
      • clone
      • pull
      • fetch
    • 推送代码
      • push 整体架构(参考知乎): image.png 常见问题:
  • 明明配置了Git配置,但依然无法拉取代码:没有配置密钥,或者没有权限,或者instead of配置没有配,配的ssh免密配置,但是使用的还是http协议访问
  • Fetch了远端分支,但本地当前的分支历史没有变化:fetch会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化

Git目录介绍

项目初始化

先创建一个文件mkdir demo,然后进入到这个文件中cd demo,使用git init命令初始化。(命令在git bash中)

git init命令可以有其他参数,

  • --inital-branch:初始化的分支,原本默认是master分支,可以通过这个参数制定分支
  • --bare:创建一个裸仓库(纯Git目录,没有工作目录)
  • --template:通过模板来创建预先构建好的自定义git目录

Git Config

不同级别的Git配置

  • --global:全局,存在与当前用户的config下
  • --system:系统,存在/etc/config下
  • --local:本地,存在当前本地的.git文件下的config文件下 每个级别的配置可能会重复,但是低级别的配置会覆盖高级别的配置,级别最高的是系统级别,然后是全局,最后是本地。

Git Remote

用于在远程仓库的操作git remote -v显示所有远程仓库,remote一般分为http和ssh两种。

将自己的仓库连接到某个远程服务器:git remote add origin <server>

SSH Remote

考虑到安全性,一般不推荐使用HTTP Remote,而使用SSH免密配置。SSH可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问。目前的Key类型默认使用rsa,但是由于一些安全问题,已经优先推荐使用ed25519。命令:

ssh-keygen -t ed25519 -C "github注册邮箱"

密钥默认存在~/.ssh/id_ed25519.pub,然后在浏览器找到个人profile下的SSH and GPG keys,点击New SSH key,将密钥复制进去即可。

Git Add

git add file将工作区的文件添加到暂存区

Git Commit

git commit -m "说明文字"将暂存区的文件提交到本地仓库

Object

commit/tree/blob在git里统称为Object,除此之外还有个tag的object

  • Bob:存储文件的内容
  • Tree:存储文件的目录信息
  • Commit:存储提交信息,一个Commit可以对应唯一版本的代码 这三个信息的串联:
  1. 通过Commit寻找到Tree信息,每个Commit都会存储对应的Tree ID
  2. 通过Tree存储的信息,获取到对应的目录树信息
  3. 从tree中获得blob的ID,通过Blob ID获取对应的文件内容

Refs

Refs文件存储的内容就是对应的Commit ID,因此把ref当做指针,指向对应的Commit来表示当前Ref对应的版本。有不同种类的ref,refs/heads前缀表示的是分支,refs/tags前缀表示的是标签

  • branch分支:git checkout -b可以创建一个新分支,分支一般用于开发阶段,是可以不断添加Commit进行迭代的
  • Tag标签:标签一般表示的是一个稳定版本,指向的Commit一般不会变更。通过git tag命令生成tag

追溯历史版本

通过Ref指向的Commit可以获取唯一的代码版本,Commit里面会存有parent commit字段,通过commit的串联获取历史版本代码。

修改历史版本

  1. commit -amend:通过这个命令可以修改最近一次commit信息,修改之后commit id会变
  2. rebase:通过git rebase -i HEAD~3可以实现对最近三个commit的修改:
    1. 合并commit
    2. 修改具体的commit message
    3. 删除某个commit
  3. filter -branch:删除所有提交中的某个文件或全局修改邮箱地址等操作。

Git GC

  • GC:通过git gc命令,可以删除一些不需要的object,以及会对object进行一些打包压缩来减少仓库的体积
  • Reflog:reflog是用于记录操作日志,防止误操作后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期。
  • 指定时间:git gc prune=now,指定的是修剪多久之前的对象,默认是两周前。

Git Clone & Pull & Fetch

  • Clone:拉取完整的仓库到本地目录,可以指定分支,深度
  • Fetch:将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,如果需要和本地代码合并,需要手动操作。
  • Pull:拉取远端某分支,并和本地代码进行合并,操作等同于git fetch+git merge,也可以通过git pull --rebase完成git fetch+git rebase操作,可能存在冲突,需要解决冲突。

Git Push

将本地代码同步至远端,一般使用git push origin master命令即可完成

冲突问题:

  1. 如果本地的commit记录与远端的commit历史不一致,则会产生冲突,比如git commit --amendgit rebase都有可能导致这个问题。
  2. 如果该分支就自己一个人使用,或者团队内确认过可以修改历史,则可以通过git push origin master -f来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后,再进行推送。