Git 的正确使用姿势与最佳实践 | 青训营笔记

67 阅读3分钟

Git 是什么

1.1 版本控制

版本控制:记录每一次的版本变化

为什么:更好的关注变更,了解每个版本的改动,方便检查,预防事故发生;随时切换,回滚问题代码

image.png

1.1.1 本地版本控制

RCS基本原理:本地保存所有的变更 Diff

1.1.2 集中版本控制

SVN 基本原理:

  1. 提供一个远端服务来保存文件,所有用户的提交都提交到该服务器中
  2. 增量保存每次提交的 Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突

优点:

  1. 学习简单,更容易操作
  2. 支持二进制文件,大文件友好

缺点:

  1. 本地不存储版本管理的概念,所有提交都只能联上服务器后才可以提交
  2. 分支上的支持不够好,对于大型项目团队合作比较困难
  3. 用户本地不保存所有版本的代码,如果服务端故障容易导致历史版本的丢失。

1.1.3 分布式版本控制

Git 基本原理:

  1. 每个库都存有完整的提交历史,可以直接在本地进行代码提交
  2. 每次提交记录的都是完整的文件快照,而不是记录增量
  3. 通过 Push 等操作来完成和远端代码的同步

优点:

  1. 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
  2. 分支管理功能强大,方便团队合作,多人协同开发
  3. 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失

缺点:

  1. 相对 SVN 更复杂,学习成本更高
  2. 对于大文件的支持不是特别好 (git-lfs 工具可以弥补这个功能)

1.2 Git 发展历程

  • Github
  • Gitlab:便于服务器搭建
  • Gerrit:Andriod

Git 基本命令

Git基础使用指南-命令详解 - 会飞的一棵树 - 博客园 (cnblogs.com)

  • 配置
    • git config
    • git remote
  • 提交代码
    • git add
    • git commit
  • 远端同步
    • 拉取代码
      • clone
      • pull
      • fetch
    • 推送代码
      • push

明明配置了 Git,还是不能拉取代码?

  1. 没有配置免密认证
  2. 配的 SSH 免密配置,但使用 HTTP 协议访问

Fetch 了远端分支但是本地的分支没有变化?

  • Fetch 会拉取代码到本地的远端分支,但不会合并到当前分支

2.1 Git 目录介绍

项目初始化:git init

其他参数:

  • --initial-branch=main / -b main 初始化的分支名称(默认是 master)
  • --bare 创建一个裸仓库
  • --template 通过模板来创建构建好的自定义git目录

2.1.1 Git Config

不同级别:

  • global: ~/.gitconfig
  • system: $(prefix)/etc/gitconfig
  • local: .git/config

2.1.2 常见 Git 配置

  • 用户名配置
    git config --global user.name "xxx"
    git config --global user.email xxx@bytedance.com
  • Instead of配置
    git config --global url.git@github.com:.insteadOf https://github.com/
  • Git命令别名配置(简化命令)
    git config --global alias.cin "commit --amend --no-edit"

2.2 Git Remote

  • 查看:git remote -v
  • 添加:
    • git remote add origin_ssh git@github.com:xxx/xxx.git
    • git remote add origin_http https://github.com/xxx/xxx.git
  • 同一个 origin 设置不同的 push 和 fetch url
    git remote set-url --add --push origin git@github.com:yyy/xxx

也可以直接修改 .git/config

2.2.1 HTTP Remote

相对不安全

2.2.2 SSH Remote

怎么给Git配置多个SSH Key? - 知乎 (zhihu.com)

详解:为GitHub、Gitlab账号同时添加、管理多个SSH-Key_gitlab key 多个_Web Boy的博客-CSDN博客

2.3 Git Add

工作区 -> 暂存区

2.4 Git Commit

暂存区 -> git 目录

git log

git checkout -b xxx:切换分支

2.10 Objects

commit --amend修改后会出现悬空commit

2.11 Git GC

  1. git reflog expire --expire=now --all
  2. git gc --prune=now

保护:Branch protection rules