Git的使用 | 青训营笔记

113 阅读3分钟

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

Git 命令基本使用方式和原理

快速开始

mkdir test
cd test
git init 
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin 仓库地址
git push -u origin "master"

Git 配置

  • Git Config

Git 配置,分成本地,用户,系统基本的配置

  • Git Remote

Git Remote 配置,分成 SSH 和 HTTP 两种协议实现,不同协议有不同的免密配置方式

代码提交

  • Git Add

将代码从工作区提交到暂存区

  • Git Commit

将暂存区代码提交到 Git 存储

Git 存储基本概念

  • Ref

    • Tag 仓库标签
    • Branch 仓库分支
  • Object

    • Blob 存储文件内容信息
    • Tree 存储目录树信息
    • Commit 存储提交信息
    • Tag 存储附注标签信息

image.png

image.png

代码同步

  • Git Clone

将代码从远端拉取到本地

  • Git Fetch & Git Pull

将远端仓库代码同步到本地仓库

  • Git Push

将本地代码同步到远端仓库

课中问题

  • 为什么配置了Git配置,但是依然没有办法拉取代码呢?

    • 没有配置密钥,或者没有权限
    • instead of 配置没有配,配置类ssh免密配置,但是使用的还是http协议访问
  • 为什么Fetch了远端分支,但是我看本地当前的分支历史还是没有变化?

    • Fetch会把代码拉取到本地的远程分支,但是并不会合并到当前分支,所以当前分支历史没有改变
  • Clone

拉取完整的仓库代码到本地目录,可以指定分支,深度。

  • Fetch(不清楚远端情况)

将远端的某些分支最新代码拉取到本地,不会执行merge操作,会修改refs。remote内的分支信息,如果需要和本地代码合并需要手动操作。

  • Pull(清楚远端情况)

拉取远端分支,并和本地代码进行合并,操作等同于git fetch + git merge,也可以通过git pull --rebase 完成 git fetch + git rebase操作。可能存在冲突,需要解决。

  • Git init

image.png

追溯历史版本

image.png 通过使用git log命令可以获取最新提交版本代码的Commit Id。

image.png

使用git cat-file -p命令可以在显示的结果中找到当前commit版本的parentCommit Id,可以用于获取历史版本的代码

image.png

修改历史版本

image.png 通过git fsck --lost-found命令可以查看当前是否有悬空的Object(没有ref指向的object),通过上述操作,git commit --amend命令使得之前的那个commit id指代的代码版本已经没有作用了。

image.png

Git GC

  • GC

通过git gc命令,可以删除一些不需要的object,以及对object进行一些打包压缩来减少仓库的体积

  • Reflog

reflog用于记录操作日志,防止误操作之后数据丢失,通过reflog来找到丢失的数据,手动将日志设置为过期

  • 指定时间

git gc prune=now指的是修剪多久之前的对象,默认是两周前

Git 研发流程

集中式工作流

  • Gerrit 平台

围绕主分支进行开发

分支管理工作流

  • Git Flow
  • Github Flow
  • Gitlab Flow

如何合并代码

  • Three Way Merge
  • Fast Forward Merge

选择合适的工作流

  • 少量多次提交
  • 保证 CR / CI 等流程通过后才可合入
  • 尽量保证主分支整洁