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

184 阅读5分钟

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

1.Git的基本原理:

  1. 每个库有完整的提交历史,可以直接在本地进行代码提交
  2. 每次提交的记录都是完整的文件快照,而不是记录增量,所以对于大文件容易使得仓库膨胀,推荐使用git-lfs工具
  3. 通过push等操作完成和远端的代码同步 注:一般只添加数据,很少执行删除操作

2.Git基本使用

详细使用操作可见Git 使用工作总结 - 掘金 (juejin.cn)

2.1初始化

image.png 项目初始化:

  • 本地环境 git init
  • 服务器 git init --bare 创建一个纯git目录,没有工作目录,又称裸仓库

image.png

2.2配置

git config分为global(全局)、system(系统)和local(本地)三个等级

  1. --global
  • git config --global user.name "yumo"配置用户名
  • git config --global user.email "1304960237@qq.com" 配置用户邮箱
  • git config --global alias.cin "commit --amend --no-edit" 配置命令别名
  1. --system 在 /etc/gitconfig
  2. --local 在本地仓库的 .git/config

git remote Git Remote 配置,本地与远端仓库的一些关联信息,分成 SSH 和 HTTP 两种协议实现,不同协议有不同的免密配置方式

  • 查看remote git remote -v

  • 添加remote

    • git remote add origin_ssh git@github.com:git/git.git
    • git remote add origin_http https://github.com/git/git.git

    image.png 注:可通过配置不同的源的方式连接不同的平台

  • 为同一个origin设置不同的push和fetch的url,例如在拉别人仓库代码,再push到自己仓库时,设置一个而不是两个orgin

    • git remote add origin git@github.com:git/git.git
    • git remote set-url --add --push origin git@github.com:my_repo/git.git

    image.png

SSH Remote

  • URL : git@github.com:git/git.git

  • 免密配置 : SSH可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问。

    • 目前的Key的类型有四种:dsa、rsa、ecdsa、ed25519
    • 默认使用的是rsa,由于一些安全问题,现在不推荐使用dsa和rsa,优先推荐使用ed25519
    • 新版本的windows代码可能会禁用dsa、rsa,从而导致本地无法拉取远程代码
    • 生成公私钥ssh-keygen -t ed25519 -C "17853142875@163.com" 密钥默认存在~/.ssh/id_ed25519.pub

github 配置过程见 git clone ssh-key image.png image.png

2.3提交代码【写的不全】

  1. git add 将代码从工作区提交到暂存区
  2. git commit 将暂存区代码提交到 Git 存储

image.png

2.4远端同步

拉取代码

  • git clone 拉取完整的仓库到本地目录,可以指定分支、深度

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

  • git fetch远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,若需要和本地代码合并则需要手动操作

推送代码

  • git push 将本地代码同步至远端

  • 冲突问题:

    1. 如果本地的commit记录和远端的commit 历史不一致,则会产生冲突,比如 git commit--amend or git rebase都有可能导致这个问题。
    2. 如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过git push origin master -f来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。
  • 推送规则限制:可以通过保护分支,来配置一些保护规则,防止误操作,或者一些不合规的操作出现,导致代码丢失。

3.常见问题

  1. 配置了Git配置,但依然无法拉取代码

    • 免密认证没有配
    • Instead Of 配置没有配,配的 SSH 免密配置,但是使用的还是 HTTP 协议访问
  2. Fetch了远端分支,但是本地的分支历史没有变化

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

4.研发流程(团队协作)

Git克隆、拉取最新代码、上传代码到远程仓库

分支管理工作流-Github Flow

Github 的工作流,只有一个主干分支,基于 Pull Request往主干分支中提交代码

选择团队合作的方式:

  1. owner创建好仓库后,其他用户通过Fork 的方式来创建自己的仓库,并在 fork 的仓库上进行开发
  2. owner创建好仓库后,统一给团队内成员分配权限,直接在同一个仓库内进行开发

向github开源项目提交代码,fork-git clone 使用goland提交代码到分支上

代码合并

git merge <分支名> --ff-only FastForward 不会产生一个merge节点,合并和保持一个线性历史,如果 target 分支有了更新,则需要通过 rebase 操作更新 source branch 后才可以合入

git merge <分支名> --no-ff Three-Way Merge 三分合并,会产生一个新的merge节点

如何选择合适的工作流

针对小团队合作,推荐使用 Github 工作流即可:

  1. 尽量保证少量多次,最好不要一次性提交上千行代码
  2. 提交Pull Request 后最少需要保证有CR(Code Review)后再合入
  3. 主干分支尽量保持整洁,使用fast-forward 合入方式,合入前进行rebase