一、git的基本概念
本地git包括三个目录:
- 工作目录:对应文件的“已修改”状态,表示修改了某个文件,但没有提交保存(没有add)
- 暂存目录:对应文件的“已暂存”状态,表示文件已经提交保存,等待下次提交(已经add,但没有commit)
- git目录:对应文件的“已提交”状态,表示文件已经提交到本地仓库中(已经commit)
二、git常用命令
1、查看状态
git status #查看状态:现在有改动、所在分支等状态
git diff #修改信息
git log --oneline --graph --decorate --all #提交历史
#--oneline :单行显示提交
#--graph :显示提交图结构
#--decorate :显示分支和标签
#--all :显示所有分支
2、从远端拉代码与同步更新
git clone <repo_url> #把仓库拉到本地
git fetch <远程主机名> <远程分支名>:<本地分支名> #从远程仓库获取最新提交记录
git pull <远程主机名> <远程分支名>:<本地分支名> #直接git pull会默认拉取main分支
#git fetch 是下载远程更新,但不改变当前代码
#git pull相当于fetch + merge,会修改工作区
需要注意的是,git fetch不能作用于当前的本地分支,例如在main分支执行git fetch origin main:main,会出现git refusing to fetch into current branch报错。
3、提交代码
git add <file> # 或 git add . 把改动加入暂存区, add . 表示把所有改动都加入暂存区
git commit -m "feat: xxx" #将暂存区内容添加到本地仓库,-m 用于添加commit信息,这是必须选项
git push <远程主机名> <本地分支名> #将本地commit发布到远程仓库,推送到的远程仓库中的分支名称和本地分支一致,如果没有,远程会自动创建该分支
git push后可添加 -u 选项,即git push -u <远程主机名> <本地分支名>,常用于第一次推送分支,-u 的作用是设置 upstream(上游分支),执行后可建立本地分支和远程分支的追踪关系,以后再提交,直接git push即可
4、分支操作
git branch # 列出所有本地分支
git branch -r # 列出所有远程分支
git branch [branch-name] # 新建一个分支,但依然停留在当前分支
git checkout -b [branch] # 新建一个分支,并切换到该分支
git checkout [branch] #切换分支
5、合并代码
git merge <branch> #将<branch>分支合并到当前分支
git rebase <branch> #将当前分支的提交移动到 <branch> 最新提交之后
merge相关参数:
- –ff 或 –no-ff选项
- 默认情况下,git执行“快进式合并”(fast-farward merge),不会创造一个新的commit节点;
- –no-ff,会创建一个新的commit;
- –squash
- 不保留待合并分支上的历史信息,也不提交、不移动HEAD,需要一个额外的commit命令;
- 判断是否使用–squash选项的最根本的标准是,待合并分支上的历史是否有意义;
- –abort
- 抛弃当前合并冲突的处理过程并尝试重建合并前的状态;
6、撤销
git checkout [file] # 恢复暂存区的指定文件到工作区
git checkout . # 恢复暂存区的所有文件到工作区
git reset --hard # 重置暂存区与工作区,与上一次commit保持一致
git reset [commit] 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
三、git工作流程规范
项目开发常见的分支安排如下:
master分支
主分支,与线上运行的版本始终保持一致,任何时候都不要直接修改master分支。
一个版本的release分支、hotfix分支开发完成后,会合并代码到master分支,也就是说master分支主要来源于release分支和hotfix分支。
develop分支
开发分支,始终保持最新完成以及bug修复后的代码,新增功能时基于该分支创建feature分支。
一个版本的release分支、hotfix分支开发完成后,也会合并到develop分支,另外,一个版本的feature功能开发完成后,也会合并到develop分支。也就是说develop分支来源于feature、release、hotfix分支。
feature分支
开发新功能或优化现有功能时,会创建feature分支,以develop为基础创建。一般会有多个功能同时开发,但上线时间可能不同,在适当的时候将特定的feature分支合并到develop分支,并创建release分支,进入测试状态。
release分支
当一组feature开发完成,会首先合并到develop分支,开始进入提测阶段时,会创建release分支。
以release分支代码为基准提测,测试过程中若存在bug需要修复,则直接由开发者在release分支修复并提交。
测试完成之后,合并release分支到master和develop分支,此时master为最新代码,用作上线。
hotfix分支
线上出现紧急问题时,需要及时修复,以master分支为基线,创建hotfix分支,修复完成后,需要合并到master分支和develop分支。