安装GIT
- 从GIT官网下载安装包,安装时选择默认选项即可。
配置GIT
查看配置信息:
git config --list
⭐ 可指定 --global 选项查看全局配置。
设置用户名和邮箱:
git config --global user.name "wangwenkun"
git config --global user.email "wang_wenkun@mail.com"
基本操作
初始化GIT仓库
-
在项目跟目录下执行:
git init -
(可选)添加
README.md文件,用于描述项目 -
(可选)添加
.gitignore文件,用于指定哪些文件不被版本控制。如:# 忽略 log 目录下的所有文件 log/ # 忽略所有 .txt 文件 *.txt -
添加所有文件到暂存区:
git add . -
提交暂存区的文件到版本库:
git commit -m "Initial commit"⭐ 其中,
"Initial commit"用于描述本次提交的内容,具体格式可以根据团队习惯和项目需求进行调整。 -
添加远程仓库:
git remote add origin https://github.com/vvangwenkun/firebase-snippets⭐ 其中,
https://github.com/vvangwenkun/firebase-snippets是远程仓库的 URL。 -
将本地仓库的代码推送到远程仓库:
git push -u origin main⭐ 其中,
main是本地仓库的分支名称。
从远程仓库拉取代码
拉取远程分支最新代码:
# 拉取当前分支最新代码
git pull
# 拉取 main 分支最新代码
git pull origin main
下载远程分支代码:
git fetch origin main
⭐ 注意,git fetch 命令只是下载远程分支的代码,并不会自动合并到当前分支。而 git pull 命令会自动合并远程分支的代码到当前分支,相当于先执行 git fetch 命令,然后执行 git merge 命令。
合并远程分支代码到当前分支
使用 merge 合并远程分支代码到当前分支:
# 合并本地 main 分支 到当前分支
git merge main
# 合并远程 main 分支 到当前分支
git merge origin/main
使用 rebase 合并远程分支代码到当前分支:
# 合并本地 main 分支 到当前分支
git rebase main
# 合并远程 main 分支 到当前分支
git rebase origin/main
⭐ 使用 -i 选项可以对沿途的提交进行修改、合并、删除或者重排。
⭐ merge 与 rebase 的区别:
merge会在当前分支创建一个新的提交,用于合并两个分支的代码。rebase会将当前分支的提交放到远程分支的提交后面,形成一个线性的提交历史。
merge 和 rebase 产生提交历史图示:
推送本地分支代码到远程仓库
# 推送当前分支代码到远程仓库
git push
# 推送代码到远程仓库 main 分支
git push origin main
本地分支管理
查看本地分支:
# 查看本地所有分支
git branch
# 查看本地所有分支,包括远程分支
git branch -a
创建本地分支:
# 创建本地分支 branch-name
git branch branch-name
# 创建本地分支并切换到该分支
git checkout -b branch-name
删除本地分支:
# 删除本地分支 branch-name
git branch -d branch-name
⭐ 注意,删除分支前需要切换到其他分支。
查询分支状态
查看分支状态:
git status
查看分支提交历史:
# 查看当前分支的提交历史
git log
# 查看远程分支的提交历史
git log origin/main
⭐ 在进行回滚等操作时,往往需要通过该命令查询分支的提交历史,获取要选取的提交的哈希值。
查看分支差异:
# 查看当前分支与远程分支的差异
git diff
# 查看当前分支与本地分支的差异
git diff branch-name
# 查看当前分支与远程分支的差异
git diff origin/main
# 查看当前分支与远程分支的差异,只显示文件名
git diff --name-status branch-name
# 查看当前分支与暂存区的差异
git diff --staged
分支回滚
使用 reset 回滚分支:
# 回滚到上一个提交,HEAD~n 表示回滚到前 n 个提交
git reset --hard HEAD~1
⭐ 常用模式:
--hard:回滚到指定提交,丢失所有未提交代码。--soft:回滚到指定提交,保留所有未提交代码,这意味着之前的更改依然在暂存区。--mixed:默认模式,回滚到指定提交,保留所有未提交代码,但是将暂存区的代码标记为未暂存。
使用 revert 回滚分支
# 撤销指定提交,生成一个新的提交
git revert commit-id
⭐ 注意,revert 命令会生成一个新的提交,用于撤销指定提交的更改。而 reset 命令会直接修改提交历史,丢失指定提交后的所有提交。
保存修改到 “stash 栈“
将当前工作目录中的所有未提交的修改保存在一个临时栈中,用于稍后恢复。
# 保存当前工作目录中的所有未提交的修改
git stash
# 保存当前工作目录中的所有未提交的修改,并添加一条消息
git stash push -m "stash message"
# 查看 stash 栈中的所有修改
git stash list
# 恢复最近一次 stash 栈中的修改
git stash pop
# 恢复指定 stash 栈中的修改
git stash pop stash@{n}
# 应用指定 stash 栈中的修改到当前分支,但是不会删除 stash 栈中的修改
git stash apply stash@{n}
# 查看指定 stash 栈中的修改
git stash show stash@{n}
# 删除指定 stash 栈中的修改
git stash drop stash@{n}
# 清空 stash 栈中的所有修改
git stash clear
cherry-pick 命令
从其他分支中选取特定的提交,并应用到当前分支。
# 应用指定提交的更改到当前分支
git cherry-pick commit-id
⭐ 注意,cherry-pick 命令会将指定提交的更改应用到当前分支,但是不会修改提交历史。
分支命名
main:生产代码分支,仅通过合并dev/release分支更新。dev:开发代码分支,所有功能分支应从dev分支创建。feature/xxx:功能开发分支,从dev分支创建,完成后合并回dev分支。bugfix/xxx:测试环境bug修复分支,从dev分支创建,完成后合并回dev分支。hotfix/xxx:缺陷修复分支,从 main 分支创建,完成后合并回main分支并同步到dev。release/vn.n.n(可选):发布分支(如release/v1.0.0),从dev分支创建,完成后合并回main分支和dev分支。
提交信息格式
<type>(<scope>):<subject>
其中,scope 为可选值,type 值则如下表所示:
| type | 说明 |
|---|---|
| feat | 新功能 |
| fix | 修复 bug |
| docs | 文档变更(如 README、注释) |
| style | 格式变更(不影响代码运行的变更,如空格、缩进等) |
| refactor | 代码重构(不包括 bug 修复或新功能添加) |
| test | 测试用例变更(添加缺失的测试用例或修改已有的测试用例) |
| chore | 其他变更,与功能或修复无关的维护性工作(如构建过程或辅助工具的变更), |
| ci | 持续集成相关的变更(如配置文件、脚本等) |
| perf | 性能优化相关的变更(如代码优化、缓存策略等) |
示例:
# bad
add new column name
fix bugs
refactor
add unit text
# good
feat(User): add new column name
fix(User): catch exceptions
refactor(Device): use new communication protocol
test(Order): add unit test
总结
上文介绍了 git 中常用的分支管理命令,包括创建、删除、切换、合并、回滚等操作。同时,但是,git 中还有很多其他的分支管理命令,更多相关的资料可以参考 git 官方文档。