五大分支

主分支(main/master)

作用:存放稳定、可随时部署到生产环境的代码。

特点

  • 分支上的每一个提交都对应一个正式的发布版本。
  • 不允许直接在此分支上开发。
  • 通常会被打上版本标签(如v1.0.0,v1.0.1)

开发分支(develop)锅

作用:存放最新开发成果的集成分支,是功能开发的集线器。

特点

  • 当develop分支上的代码达到稳定状态并准备发布时,会合并到main分支。
  • 所有功能分支、发布分支都从develop分支拉取。

功能分支(feature/*)自己的碗

来源:develop

合并到:develop

命名惯例:feature/user-authentication,feature/payment-integration

作用:开发新功能。

生命周期

  • 从develop分支拉取。
  • 开发完成后,合并回develop分支。
  • 合并后,该功能分支通常被删除。
1
2
3
4
// 删除本地
git branch -d feature/user-authentication
// 删除远程
git push origin --delete feature/user-authentication

Bash

发布分支(release/*)

来源:develop

合并到:develop 和 main

命名惯例:release/1.2.0,release/2024-spring

作用:为发布新版本做准备。在此分支上只做Bug修复、生成版本号、整理文档等发布准备工作,不

再添加新功能。

生命周期

  • 当develop分支的功能足够进行一次发布时,从develop拉出release分支。
  • 在此分支上进行最后的测试和修复。
  • 准备就绪后,将release分支合并到main分支并打上版本标签。
  • 同时,还必须合并回develop分支,因为release分支上的修复可能在develop分支上不存在。

热修复分支(hotfix/*)

来源:main

合并到:main 和 develop

命名惯例:hotfix/critical-security-patch,hotfix/1.2.1

作用:快速修复生产环境(main分支)上的紧急Bug。

生命周期

  • 从main分支上出现Bug的提交点(通常是最近的标签)拉取。
  • 修复完成后,合并回main分支并打上新的版本标签(如v1.0.1),
  • 同时,还必须合并回develop分支,确保修复在后续开发中也生效。

代码回退(重要)

工作区有改动,无add无commit无push

执行rollback

工作区有改动,已add无commit无push

执行reset head

或者执行rollback,相当于hard模式的reset

使用场景

  • 不小心把一个不需要add的文件给add了,此时使用reset。(建议使用Mixed模式:保留工作目录的代码)

工作区有改动,已add已commit无push

操作同 “工作区有改动,已add无commit无push”一样

^代表回退一次commit,^^代表回退两次commit

使用场景

  • 不小心把一个不需要commit的文件给commit了,此时使用reset,HEAR^。(建议使用Mixed模式:保留工作目录的代码)

工作区有改动,已add已commit已push

先选择要撤回的提交记录,然后执行revert commit。(注意:执行revert commit后,当前工作区修改的代码会消失)

再直接执行一次push,将远程仓库提交撤回

Revert vs Reset

Git Stash

git stash是一个极其实用的 Git 命令,可以理解为“临时储藏柜"或“草稿箱"。它用于临时保存你当前工作目录和暂存区的修改,让你能得到一个干净的工作区,以便进行其他操作(如切换分支、拉取代码),之后还可以重新应用这些保存的修改。

应用场景

  • 正在开发一个新功能,代码写了一半
  • 突然要紧急修复main分支的一个bug
  • 此时如果用git checkout main切换分支的话,Git会阻止你,因为你当前的工作区有未提交的更改。
  • 此时就需要使用git stash

CherryPick(了解即可)

  • 某个分支上的特定提交应用到当前分支,而不是合并整个分支

Fetch vs Merge

Fetch

  • 从远程仓库下载最新的信息,包括:提交、分支、标签。不会修改本地的工作目录

Merge

  • 从远程仓库下载最新的信息,工作目录可能会被修改

Merge vs Rebase

Merge

  • 执行Merge后,会创建一个新的合并提交,历史记录中出现分叉
  • 适合场景:公共分支的提交(main,dev)

Rebase

  • 将当前分支的所有提交放到目标分支最新的提交之后,历史记录是线性的
  • 适合场景:私有分支

案例:需要撤回已提交到远程的提交,同时保证本地的工作目录还有撤回提交的内容

方案一:

选中要撤回的提交记录,执行Revert Commit,(执行后,工作目录的这次提交内容会消失)

然后执行push

然后再选中要撤回的提交记录,执行CherryPick(此时工作目录如果有了其他的修改,git则会提示要先将工作目录stash一下)

如果执行了stash,则再执行一下unstash

方案二:

选中要撤回的提交记录,执行Revert Commit,(执行后,工作目录的这次提交内容会消失)

然后执行push

在GIT日志中找到Revert 的那条记录,然后再执行一次Revert,此时本地分支就会回到Revert之前的版本了。