git简要团队协作工作流
- 远程仓库创建后本地拉取
git clone https://gitee.com/ov0-lab/git-flow.git
- 从main或master创建本地dev分支
git checkout -b dev
- 创建远程dev分支
或
git push -u origin dev
git push --set-upstream origin dev
- 更新dev分支
git pull
- 从dev创建本地featureA分支
git checkout -b featureA/feature1
- 创建远程dev分支
git push -u origin featureA/feature1
- 提交三部曲
git add .git commit -m "feat(packages/featureA): 新增feature1"git push
- 切换到dev分支
git checkout dev
- 更新本地dev分支
git pull
- 合并featureA/feature1分支
git merge --no-ff featureA/feature1
- 推送dev至远程
git push
- 删除远程featureA/feature1分支(可选)
git push origin --delete featureA/feature1
- 删除本地featureA/feature1分支
git branch -d featureA/feature1
- 同理从dev创建本地release-0.1.0分支
git checkout -b release-0.1.0
- 更新配置文件版本号(package.json)并提交推送
git add .git commit -m "chore(package.json): bump version to 0.1.0"git push -u origin release-0.1.0
- 切换到main分支
git checkout main
- 更新main
git pull
- 合并release-0.1.0分支
git merge --no-ff release-0.1.0
- 编辑tag
git tag -a v0.1.0 main -m "Release v0.1.0: 新packages/featureA" - 推送到远程
git push
- 推送tags
git push --tags
- 在远程创建发行版
- 切换到dev分支
git checkout dev
- 更新dev分支
git pull
- 合并main分支
git merge --no-ff main
- 推送到远程
git push
- 删除远程release-0.1.0分支(可选)
git push origin --delete release-0.1.0
- 删除本地release-0.1.0分支
git branch -d release-0.1.0
- 切换到main分支
git checkout main
- 更新main
git pull
- 创建本地hotfix-0.1.0分支
git checkout -b hotfix-0.1.0
- 修复bug后提交三部曲
git add .git commit -m "fix(packages/featureA): 修复feature1"git push -u origin hotfix-0.1.0
- 切换到main分支
git checkout main
- 更新main
git pull
- 合并hotfix-0.1.0分支
git merge --no-ff hotfix-0.1.0
- 推送到远程
git push
- 编辑tag
git tag -a v0.1.0-fix.1 main -m "Release v0.1.0-fix.1: 修复packages/featureA" - 推送tags
git push --tags
- 切换到dev分支
git checkout dev
- 更新dev
git pull
- 合并hotfix-0.1.0分支
git merge --no-ff hotfix-0.1.0
- 推送到远程
git push
- 删除远程hotfix-0.1.0(可选)
git push origin --delete hotfix-0.1.0
- 删除本地hotfix-0.1.0分支
git branch -d hotfix-0.1.0
假设小明在featureA/feature1分支上开发并被要求紧急修复bug,此时featureA/feature1还未达到可以提交的进度,那么直接执行git checkout dev会丢失自己分支更改的代码,使用stash可以临时将更改的部分存到暂存区。
- 暂存更改操作
git stash
- 切到dev分支操作
git checkout dev
- 修完bug切回
git checkout featureA/feature1
- stash内容应用到当前分支
或
git stash pop # 删除stash栈内容并放回该分支git stash apply # 不会删除stash栈git stash drop # 后续删除
假设小明在dev分支上发现并修复了一个紧急bug(合并到了dev),现在,这个修复必须立刻应用到生产环境,但是dev分支现在不满足合并到主分支的条件,这时可以用cherry-pick将小明的更改操作提取出来应用到主分支上。
- 切换到主分支
git checkout main
- 更新本地代码
git pull
- 确保已更新dev分支,并用以下命令提取某次更改
git cherry-pick <commit hash>
首先查看当前git状态:
git status会显示以下几种状态:
| 状态 | 显示结果 |
|---|---|
改动代码但未执行 git add |
modified: index.js |
改动代码且已执行 git add |
modified: index.js |
已执行 git add 和 commit |
nothing to commit, working tree clean |
-
查看改动文件
git status
显示以下
modified: index.js
-
撤回更改
git checkout -- index.js
-
查看改动文件
git status
显示以下
modified: index.js
-
撤回更改
-
重置暂存区,保留工作目录更改
git reset HEAD --mixed index.js # 简写 git reset HEAD index.jsmodified: index.js
-
重置暂存区和工作目录,彻底丢弃更改
git reset HEAD --hard # 不推荐nothing to commit, working tree clean
-
-
保留:暂存区的更改、工作区的更改,仅重置提交历史
git reset HEAD~1 --soft
modified: index.js
-
移动 HEAD 指针,重置暂存区,简写
git reset HEAD~1git reset HEAD~1 --mixed
modified: index.js
-
丢弃:提交历史、暂存区、工作区的所有更改
git reset HEAD~1 --hard
nothing to commit, working tree clean
- 使用revert
git revert --no-edit <commit hash>
git push
使用git merge能保留完整的提交历史,当然它的非线性也带来了commit记录不美观问题,对于git merge和git rebase选择,推荐在共享分支(main/master、dev)上使用git merge,在个人或功能特性分支选择git rebase
同样,对于等价于git fetch+git merge的git pull命令也可以替换成git pull --rebase来获得线性、简洁历史记录