时间:2025-12-26 19:21
人气:
作者:admin
GitFlow 是一种成熟的 Git 分支管理策略,用于规范团队协作中的代码版本管理流程。
GitFlow 模型包含五大核心分支,每个分支都有明确的职责和使用场景:
feature/功能名称(如 feature/user-authentication)release/x.y.z(如 release/1.2.0,x.y.z为版本号)hotfix/x.y.z(如 hotfix/1.2.1,x.y.z 为版本号)# 1. 初始化本地仓库
git init
# 2. 添加远程仓库连接
git remote add origin <远程仓库URL>
# 3. 创建 Master 分支的首次提交
git add .
git commit --allow-empty -m "Initial commit"
# 4. 创建 Develop 分支
git checkout -b develop
# 5. 推送两个核心分支到远程
git push -u origin master
git push -u origin develop
# 6. 设置远程仓库的默认分支(可选但推荐)
git remote set-head origin master
--allow-empty 允许创建空提交
展示适用于单人开发或无 PR 强制要求的场景流程示例
标准的现代流程为:推送功能分支到远程 -> 在平台上创建 PR -> 审核通过后在网页端点击合并。
# 切换到 Develop 分支并确保是最新状态
git checkout develop
git pull origin develop
git checkout -b feature/xxx develop
git checkout develop
# 采用--no-ff参数,表示强制创建合并提交
# 合并时会创建一个新的合并提交,保留分支历史
git merge --no-ff feature/xxx
git push
git branch -d feature/xxx
# 如果之前推送了 Feature 分支,则需要删除远程分支
# git push origin --delete feature/xxx
# 切换到 Develop 分支并确保是最新状态
git checkout develop
git pull origin develop
git checkout -b release/x.y.z develop
git checkout master
git merge --no-ff release/x.y.z
git tag -a tagName -m "Release x.y.z"
# 推送标签到远程仓库
git push origin tagName
# 推送代码到远程仓库
git push
git checkout develop
git merge --no-ff release/x.y.z
git push
git branch -d release/x.y.z
# 如果之前推送了 Release 分支,则需要删除远程分支
# git push origin --delete release/x.y.z
# 切换到 Master 分支并确保是最新状态
git checkout master
git pull origin master
git checkout -b hotfix/x.y.z master
git checkout master
git merge --no-ff hotfix/x.y.z
git tag -a tagName -m "Hotfix x.y.z"
# 推送标签到远程仓库
git push origin tagName
# 推送代码到远程仓库
git push
git checkout develop
git merge --no-ff hotfix/x.y.z
git push
git branch -d hotfix/x.y.z
# 如果之前推送了 Hotfix 分支,则需要删除远程分支
# git push origin --delete hotfix/x.y.z
撤销工作区改动
git checkout -- filename
撤销暂存区的改动
git reset HEAD filename
从本地库回退(已commit,未push)
| 操作描述 | 命令 | 效果 |
|---|---|---|
| 撤销提交,但保留改动在工作区 | git reset --mixed HEAD^ | 提交消失,改动还在工作区 |
| 撤销提交,但保留改动在暂存区 | git reset --soft HEAD^ | 提交消失,改动还在暂存区 |
| 彻底丢弃(真的不要了) | git reset --hard HEAD^ | 全部消失,慎用! |
撤销已推送的提交
创建一个新提交,用于撤销指定提交
提交的新提交用来"抵消"(逆向操作)指定提交的更改。
revert后需要再次 git push 才能同步到远程
git revert <commit-hash>
| 操作 | 描述 | 影响 |
|---|---|---|
| reset | 通过移动分支指针来回退到指定提交 | 直接改变历史 |
| revert | 创建一个新提交,用于来"抵消"(逆向操作)指定提交的更改 | 不改变历史,而是在历史记录中增加一个新的,反向的提交 |
临时保存工作进度,快速切换上下文,而不需要创建临时提交。
# 正在功能分支开发,突然需要修复生产bug
$ git status
# 修改:src/feature.js
# 修改:src/feature.css
# 最佳实践:使用描述性消息
$ git stash push -m "WIP: 用户头像上传功能开发中"
# 切换到主分支修复bug
$ git checkout main
$ git pull origin main
$ git checkout -b hotfix/login-bug
# ... 修复工作 ...
# 返回后继续开发
$ git checkout feature/user-avatar
$ git stash list
# stash@{0}: WIP: 用户头像上传功能开发中
$ git stash pop
# 恢复工作进度
默认情况下,git stash 只能暂存已跟踪文件(tracked files)的修改,但可以通过参数
-u显式包含未跟踪文件。
git stash push -u -m "描述"
将特定提交从一个分支复制到另一个分支,而不合并整个分支历史。
git cherry-pick -x <commit-hash>
-x 参数表示在提交信息中添加"cherry picked from commit"说明
git cherry-pick -x <commit-hash1>..<commit-hash2> # 不包含起始提交
git cherry-pick -x <commit-hash1>^..<commit-hash2> # 包含起始提交
| 操作 | 本质 | 对本地代码的影响 |
|---|---|---|
| fetch | 仅下载远程更新 | 不改变工作目录和当前分支 |
| pull | 下载+自动合并(git fetch + git merge 的自动执行) | 改变工作目录和当前分支 |
git pull --rebase
获取远程更新,将本地提交"嫁接"到远程最新提交之上
| 操作 | 本质 | 对本地代码的影响 | 应用 | 描述 |
|---|---|---|---|---|
| merge | 合并两个分支 | 改变工作目录和当前分支 | 在「接收合并的目标分支」上执行 | 站在目标分支,合并进来 |
| rebase | 将指定分支的提交历史,应用到当前分支 | 改变工作目录和当前分支 | 在「被变基的分支」上执行 | 站在被变基分支,基于基准变 |
⚠️ 黄金法则:永远不要对位于公共仓库之外的提交(即已经 push 到远程并被他人使用的提交)执行 Rebase。
只对尚未推送或仅属于你个人的本地提交使用 Rebase。对公共历史 Rebase 会导致团队成员协作时产生混乱和代码丢失。
分支初始状态
graph TD A[提交 A] --> B[提交 B] B --> C[提交 C] C --> D[提交 D] D --> E[提交 E] C --> F[提交 F] F --> G[提交 G] classDef mainBranch fill:#4CAF50,stroke:#333,stroke-width:2px; classDef featureBranch fill:#2196F3,stroke:#333,stroke-width:2px; class A,B,C,D,E mainBranch; class F,G featureBranch; subgraph main 分支 A B C D E end subgraph feature 分支 F G endgit checkout main
git merge feature后状态
git checkout feature
git rebase main后状态
本文来自博客园,作者:Nobody_Cares,转载请注明原文链接:https://www.cnblogs.com/NobodyCares/p/19406442
正在加载今日诗词....上一篇:从零跑起 RokidDemo:开发小白也能搞定的入门实践
下一篇:语言开发随笔2