下面我把推荐的工作流 + 为什么这么做 + 一套你可以直接复制粘贴到终端的命令都写清楚,并给出两种把 dev2.0 的 bug 修复带到你新需求分支的方法(merge 和 rebase),说明优缺点,最后给一些小建议和常见处理办法。
推荐总体思路(简短)
把 dev2.0 当作你当前的「主开发」分支(你现在已经在它上面做主要工作)。
为新需求创建一个长期 feature 分支,例如 feature/new-xxx,在该分支上持续提交、推送(远端备份)。
若中途发现 bug,基于 dev2.0 修复并推到远端(或直接在 dev2.0 提交并推送),修复发布后再把 dev2.0 的最新变更合并(或 rebase)到你的 feature 分支继续开发。
feature 开发完毕后把它合并回 dev2.0(可以普通 merge 或 squash merge),然后删除 feature 分支。
这种方式优点:主线 dev2.0 保持可用,feature 独立开发,远端有备份;缺点:如果长期不合并,可能会有冲突,但冲突可通过定期同步解决。
具体命令(一步步示例)
假设远端名字是 origin,主开发分支是 dev2.0,你要新建 feature/my-long-work。
1) 从最新的 dev2.0 创建 feature 分支
git fetch origin
git switch dev2.0
git pull origin dev2.0 # 保证本地 dev2.0 是最新git switch -c feature/my-long-work# 开始开发,频繁 commitgit add .
git commit -m "feat: start feature my-long-work"# 第一次把分支推到远端并关联 upstreamgit push -u origin feature/my-long-work
2) 中途需要修复 bug(你想在 dev2.0 上修)
git switch dev2.0
git pull origin dev2.0# 做修复、测试git add .
git commit -m "fix: crash in X when Y is nil"git push origin dev2.0
说明:你也可以从 dev2.0 创建一个短期 fix/xxx 分支来修复(更干净),然后 PR 或直接合并回 dev2.0。例如:
git switch dev2.0
git pull origin dev2.0
git switch -c fix/urgent-bug# 修复 -> commitgit push -u origin fix/urgent-bug# 在远端合并 fix/urgent-bug -> dev2.0(或本地 merge 后 push)
3) 把 dev2.0 的修复带到你的 feature 分支(两种方式)
方式 A — merge(安全、简单)
git switch feature/my-long-work
git fetch origin
git merge origin/dev2.0# 处理冲突(若有):编辑冲突文件 -> git add <file> -> git commitgit push
优点:不会改写提交历史;操作直观。
缺点:历史会有额外的 merge commit,长期下来日志比较“脏”。
方式 B — rebase(历史更干净,个人分支推荐)
git switch feature/my-long-work
git fetch origin
git rebase origin/dev2.0# 若发生冲突:编辑冲突文件 -> git add <file> -> git rebase --continue# 若想中止 rebase:git rebase --abort# 完成后需要强推到远端(因为你改写了历史)git push --force-with-lease
优点:提交历史线性、清爽;合并到 dev2.0 时更干净。
缺点:改写历史,需要理解冲突处理与 force-with-lease 的风险。对只你个人的 feature 分支,这种做法是安全且常用的。
推荐:如果你熟悉 rebase,用 rebase;不熟悉或怕改历史,就用 merge。作为个人开发者,两者都可以。
4) feature 完成后合并回 dev2.0
选两种合并策略(在远端仓库也可用 PR):
普通合并(保留分支历史)
git switch dev2.0
git pull origin dev2.0
git merge --no-ff feature/my-long-work # 产生一个 merge commit,便于回溯git push origin dev2.0# (合并完可以删除 feature 分支)git branch -d feature/my-long-work # 删除本地git push origin --delete feature/my-long-work # 删除远端
squash 合并(把 feature 的所有提交合并为一个提交)
在本地:
git switch dev2.0
git pull origin dev2.0
git merge --squash feature/my-long-work
git commit -m "feat: implement my-long-work (squashed)"git push origin dev2.0
或在远端代码托管平台(GitHub/GitLab)上用 “Squash and merge” 按钮。
其他有用命令 / 场景
临时保存工作(想切到别的分支但不想提交):
git stash push -m "WIP my partial changes"git switch dev2.0# 回到 feature 后恢复git switch feature/my-long-work
git stash pop
如果修复很小,也可 cherry-pick 到另一个分支:
# 获取修复提交 hash(例如 abc123)git switch feature/my-long-work
git cherry-pick abc123
查看分支列表:
git branch # 本地git branch -r # 远端
小建议(best practices,针对你这种个人长期 feature)
为长期需求建 feature 分支:正如你想的那样,很合理。
频繁 push(远端备份):即使是 WIP,也 push 到远端 feature/...(git push -u origin feature/...),以防电脑挂了或想在别处继续工作。
修复优先在 dev2.0 上做(或者 fix/* 分支再合并回 dev2.0),然后把 dev2.0 的更新合并/rebase 到 feature。
定期同步 dev2.0 到 feature:每天或每当 dev2.0 有重要变更时同步一次,避免一次性冲突太大。
合并时选择策略:想保留 feature 历史用普通 merge;想要干净历史可以 rebase + squash。
使用 descriptive commit messages,便于回溯。
在合并或 force 推之前检查:git fetch && git log origin/branch..HEAD 看下差异;--force-with-lease 比 --force 更安全。
删除不需要的分支:合并后清理本地和远端分支,保持仓库整洁。
总体结论:
你描述的流程(在 dev2.0 上修 bug,另起 feature 分支做长期需求,开发完成后合并)完全可行,并且是推荐做法。关键点在于定期把 dev2.0 的修复合并或 rebase 到 feature 分支,并保持频繁 push 以备份工作。