本系列主要记录自己在学习过程的思路、问题、解决方法。最后实现一个高性能的HTTP 服务器,用于学习cpp、网络编程、服务器相关的内容。
系列目录
这篇文章主要记录在学习使用git管理版本时候的一些常见问题和解决方法,供大家参考。
提交规范
为了让提交记录更清晰可读,在后续提交中使用Angular规范来处理commit message。
| type | 含义 | 说明 |
|---|---|---|
| feat | 新功能 | 新增的功能或特性 |
| fix | 修复 bug | 修正问题或缺陷 |
| docs | 文档修改 | 仅修改文档(如 README、注释等) |
| style | 代码风格 | 不影响逻辑的更改(空格、缩进、格式化等) |
| refactor | 重构 | 代码重构,既不是新功能也不是 bug 修复 |
| perf | 性能优化 | 提升性能的代码更改 |
| test | 测试 | 添加或修改测试用例 |
| chore | 杂项 | 构建过程、依赖管理、CI 配置等不涉及源码修改 |
常见操作
Git Reset 模式对比
| 模式 | HEAD(指针) | 暂存区(index) | 工作区(working directory) | 使用场景 |
|---|---|---|---|---|
| Soft | 回退到指定 commit | 不变(保留原来的 add 状态) | 不变(代码还在) | 想要撤销提交,但保留改动继续修改或重新提交 |
| Mixed (默认) | 回退到指定 commit | 清空暂存区(相当于 git reset) | 不变(代码还在) | 想要撤销提交和暂存,但保留代码改动 |
| Hard | 回退到指定 commit | 清空暂存区 | 清空工作区(代码文件直接恢复成指定 commit 的状态) | 完全丢弃本地改动,和指定 commit 保持一致 |
合并相邻提交
希望把几个已经提交到远程小版本合并到一起,例如下图中希望把前三个合并为一个:

采用交互式变基的方法,在终端中运行:git rebase -i HEAD~5,得到如下内容,表明对前五个commit进行操作,此时是处在vim中的:

我需要先把第四个(ce088e4)合并到第三个(2deb23c)中,使用vim将pick改为squash,随后wq保存退出。会自动进入到对于commit message的编辑中:
在第一行下方输入合并后的commit message即可,随后保存退出。最后使用git push origin main --force 强制推送到远程即可。
强制使用远程分支
在机器a上对远程进行上述变基操作后,机器b上出现了本地和远程分叉的情况:

方法一:命令行
终端中输入:
git fetch origin //拉取远程最新的提交,但不修改你本地分支
git reset --hard origin/main //强制把本地 main 移动到和远程 main 一样的位置
方法二:gitlens
使用vsc中的插件gitlens有图形化界面可以操作,抓取远程后找到最新的那个commit:

右键菜单中选择Reset Current Branch to Commit

随后会弹出三种提示,选择hard模式,表明抛弃本地分支,选择后自动合并成功:

重构模块的逐步提交
在重构智能指针资源管理的过程中,我希望实现对于重构模块的逐步提交,最后把所有的重构模块的提交整合到一个commit中合并到主分支
1. 新建一个重构分支
git checkout -b refactor-smartptr
专门在这里做重构。
2. 按模块逐步提交
比如先改 Buffer 模块:
git add src/Buffer.*
git commit -m "refactor: use smart pointers in Buffer"
然后改 Connection 模块:
git add src/MyConnection.*
git commit -m "refactor: manage resources in MyConnection with smart pointers"
保持每个提交 小而明确,方便回退和测试。
3. 整合提交(squash)
当整个重构分支完成后,用交互式 rebase 把多个 commit 压缩成一个:
git rebase -i main
然后在 rebase 编辑器里,把第一个 commit 保留 pick,其余的改成 squash 或 fixup。
最终会得到一个大 commit
4. 合并到主分支
有两种方式:
(1)rebase 合并(历史干净),主分支历史看起来只有一个 commit。
git checkout main
git merge --ff-only refactor-smartptr
(2)squash merge(也只留一个大提交)
git checkout main
git merge --squash refactor-smartptr
git commit -m "refactor: unify smart pointer resource management"
注意:
如果这个分支你一个人开发,推荐 rebase -i squash 压缩再合并。
如果和别人协作,最好用 merge --squash,这样不会改写已经推送过的历史。
更多
会逐步更新


被折叠的 条评论
为什么被折叠?



