Git是一种分布式版本控制系统,用于跟踪和管理软件开发中的代码变更。它广泛用于协作开发项目,可以有效地管理代码的版本和变更历史。学习使用git是计算机学生的必经之路。
- Git是什么
- 由linus开发 版本控制工具
- 基本使用方式
- 不同级别的git配置
- local global system 低级别覆盖高级别
- 用户名配置
ssh-keygen -t ed25519 -C "你的邮箱"配置ssh密钥- git status 查看当前git仓库状态
tree .git查看目录树git cat-file -p ID值通过id值查看文件git commit -m "add readme"git add README.md- objects: Blob Tree Commit tag
- refs 对应的Comiit ID 理解为指针
git checkout -b test- tags 版本发布
git tag v0.0.1git tag -a v0.0.2 -m "add feature 1"注解标签git log查看当前提交日志- 一次commit 会多三个objects
- tree object
- blob object
- commit object
- commit 之间通过 parent关连
- 修改历史版本
- commit --amend //会产生悬空地object 没有ref指向
- rebase
- filter --branch
git fsck --lost-found查找有没有悬空- reflog
git reflog expire --expire=now --all - 指定修剪时间
git gc --prune=now删除不需要的object 打包压缩需要的 - 完整的git视图
- 不同级别的git配置
- 协同合作常用命令
git clone可以指定分支 深度git fetch不会指向merge 需要手动合并(不清楚冲突建议使用)git pull操作等于git fetch + git merge- 也可以通过git pull --rebase 完成git fetch+git rebase
git push origin masterorigin为设置源的名字- -f 强制推送 有冲突时会覆盖 由于commit记录不一样导致冲突
- 可以通过保护分支 防止误操作
- 问题
- 为什么git配置 还是没办法拉取代码
- 免密没有配置
- Instead of 没有配 配置的ssh 但通过http访问
- Fetch会把代码拉取到本地的远端分支 但不会合并到当前分支 当前分支历史没有变化 需要手动merge 或者 rebase
- 为什么git配置 还是没办法拉取代码
- 工作流
- 集中式工作流 Gerrit
- 每次提交 需要review
- 多人开发容易出现冲突
- 分支管理工作流
- GitFlow
- 包含五种分支类型
- 流程复杂 上线节奏慢
- Github Flow
- 只有一个主干分支 基于PR 往主干分支提交代码
- fork进行开发 开源库的开发方式
- 分发权限 统一在团队内进行开发 团队使用
- CI/CD 持续集成(Continuous Integration)和持续部署(Continuous Deployment
- Branch protection rule(走了一遍设置)
- 自己走了一遍pr流程
- Gitlab Flow
- upstream first 上游优先
- GitFlow
- 代码合并
- Fast-Forward 不会产生merge节点 合并保持线性历史
git checkout -b test- 更改文件
git add .git commit -m "test"git checkout maingit merge test --ff-only默认是ff
- Three-Way Merge
- 三方合并 会产生一个新的merge节点
git merge test --no-f
- Fast-Forward 不会产生merge节点 合并保持线性历史
- 选择合适的工作流
- 小型团队推荐使用Github工作流
- 少量多次 不要一次提交上前行
- 提交PR 最少要保证CR(code review) 再合入
- 主干分支保持简洁 使用Fast-Forward 进行合并
- 集中式工作流 Gerrit