这是我参与「第三届青训营 -后端场」笔记创作活动的的第1篇笔记。
1.Git的基本原理:
- 每个库有完整的提交历史,可以直接在本地进行代码提交
- 每次提交的记录都是完整的文件快照,而不是记录增量,所以对于大文件容易使得仓库膨胀,推荐使用git-lfs工具
- 通过push等操作完成和远端的代码同步 注:一般只添加数据,很少执行删除操作
2.Git基本使用
详细使用操作可见Git 使用工作总结 - 掘金 (juejin.cn)
2.1初始化
项目初始化:
- 本地环境
git init - 服务器
git init --bare创建一个纯git目录,没有工作目录,又称裸仓库
2.2配置
git config分为global(全局)、system(系统)和local(本地)三个等级
--global
git config --global user.name "yumo"配置用户名git config --global user.email "1304960237@qq.com"配置用户邮箱git config --global alias.cin "commit --amend --no-edit"配置命令别名
--system在 /etc/gitconfig--local在本地仓库的 .git/config
git remote Git Remote 配置,本地与远端仓库的一些关联信息,分成 SSH 和 HTTP 两种协议实现,不同协议有不同的免密配置方式
-
查看remote
git remote -v -
添加remote
git remote add origin_ssh git@github.com:git/git.gitgit remote add origin_http https://github.com/git/git.git
注:可通过配置不同的源的方式连接不同的平台
-
为同一个origin设置不同的push和fetch的url,例如在拉别人仓库代码,再push到自己仓库时,设置一个而不是两个orgin
git remote add origin git@github.com:git/git.gitgit remote set-url --add --push origin git@github.com:my_repo/git.git
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
2.3提交代码【写的不全】
git add将代码从工作区提交到暂存区git commit将暂存区代码提交到 Git 存储
2.4远端同步
拉取代码
-
git clone拉取完整的仓库到本地目录,可以指定分支、深度 -
git pull拉取远端某分支,并和本地代码进行合并,操作等同于git fetch+git merge,也可以通过git pull --rebase完成git fetch+git rebase以解决冲突 -
git fetch将远端某些分支最新代码拉取到本地,不会执行merge操作,会修改refs/remote内的分支信息,若需要和本地代码合并则需要手动操作
推送代码
-
git push将本地代码同步至远端 -
冲突问题:
- 如果本地的commit记录和远端的commit 历史不一致,则会产生冲突,比如
git commit--amendorgit rebase都有可能导致这个问题。 - 如果该分支就自己一个人使用,或者团队内确认过可以修改历史则可以通过
git push origin master -f来完成强制推送,一般不推荐主干分支进行该操作,正常都应该解决冲突后再进行推送。
- 如果本地的commit记录和远端的commit 历史不一致,则会产生冲突,比如
-
推送规则限制:可以通过保护分支,来配置一些保护规则,防止误操作,或者一些不合规的操作出现,导致代码丢失。
3.常见问题
-
配置了Git配置,但依然无法拉取代码
- 免密认证没有配
- Instead Of 配置没有配,配的 SSH 免密配置,但是使用的还是 HTTP 协议访问
-
Fetch了远端分支,但是本地的分支历史没有变化
- Fetch 会把代码拉取到本地的远端分支,但是并不会合并到当前分支,所以当前分支历史没有变化。
4.研发流程(团队协作)
分支管理工作流-Github Flow
Github 的工作流,只有一个主干分支,基于 Pull Request往主干分支中提交代码
选择团队合作的方式:
- owner创建好仓库后,其他用户通过Fork 的方式来创建自己的仓库,并在 fork 的仓库上进行开发
- 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 工作流即可:
- 尽量保证少量多次,最好不要一次性提交上千行代码
- 提交Pull Request 后最少需要保证有CR(Code Review)后再合入
- 主干分支尽量保持整洁,使用fast-forward 合入方式,合入前进行rebase