git速查表
hello git
rebase和merge区别
当前开发者在 feature 分支,现在想和master同步,让自己的分支包含master所有最新的内容

以下是feature分支下的 rebase
的方案:
1 | # 确保master最新 |

rebase
特点:
- feature的3个commit会放在master后面,最后branch的commit历史相对master的commit历史是线性的
- 所以这对后面提PR非常有用
- feature的3个commit会同时被添加进master的内容!
- 所以如果3个commit都和master有冲突,需要解决3次
- 解决方法是:先把这3个分支自己用rebase压缩成一个(见下文),然后再把master rebase进来,这样只需要解决一次冲突即可
以下是feature分支下的 merge
的方案:
1 | # 确保master最新 |

merge
特点:
- feature后面会生成一个新的commit
- 最后branch的commit历史相对master的commit历史不是线性的
- 提PR的时候,别人看你的分支会比较混乱,因为不是线性的
- 只有这个新生成的commit包含了master的最新提交历史
- 优点:冲突只解决最新的这次
结论:一般都用 rebase
版本策略
包含仓库设置
TODO
- wm-studio是交付软件,对应wm-studio这个repo
- wm-studio有很多依赖,比如wm-control
- wm-studio的大版本规定了,各个依赖的大版本也规定了
- wm-studio升级了大版本,则
1 | wm-studio 10.0(release/10.0) |
现在假设 wm-studio 10.0(release/10.0) -> wm-studio 11.0(release/11.0)
设置策略:
- release/1.3,对于管理员可以push,但是不能push -f
- 可以push的目的是添加新的版本号,不可以push -f的目的是,不允许强制覆盖很多提交历史,这非常危险
- 管理员设置成可以push,但是不能push —f,否则可能一下子改变一大堆提交
使用rebase合并
案例1:将所有的commit合并成1个
已知历史commit如下:

其中 test_rebase
分支是从 feature/..
切换出来的,现在要求将前4个commit合并成一个.
1 | # 先切换到这个分支 |
之后会跳出:
1 | pick c7a171ef refactor # 这是最老的 |
修改如下:
1 | pick c7a171ef refactor |
解释:
1 | pick c7a171ef refactor # 最老的历史 |
然后保存退出,之后的历史如下:

最后执行:
1 | git push -f # f是 --force-with-lease,因为之前的操作改变了Git的线性历史 |
技巧1:以上的git rebse 可以借助vscode的 Git Graph
完成
技巧2:看commit或者git rebase中的commit哪个最新哪个最老,可以借助 Git Graph
的commit提交时间
案例2:将中间的2个commit合并到一个

只将图中的2个合并在一起
1 | # ... |
会看到:
1 | pick 6479da02 changelog # 这是最老,可以借助GitGraph的commit提交时间 |
修改为:
1 | pick 6479da02 changelog |
解释如下
1 | pick 6479da02 changelog 这是最老的历史 |
现在历史如下:

之后
1 | git push -f |
知识点:squash和fixup
squash
会将两个commit合并,并且允许你编辑新的commit信息。fixup
也会将两个commit合并,但是它会丢弃第二个commit的信息。即如果你选择了squash
,那么你将有机会编辑新的commit信息,如果对历史commit信息不那么在乎,则可以用 fixup
。我一般用 fixup
就行。
rebase my_branch 到master
my_branch 有很多commit,可能好多个commit都和master有冲突,这时候直接
1 | # 确保 master最新 |
git reset 和 git revert
git revert 命令用于撤销一个已提交的更改。与 git reset 不同的是,git revert 会创建一个新的提交来撤销指定的更改,而不是直接删除提交记录。
1 | git revert <commit-hash> |
1 | # 此模式下,HEAD 会被重置到指定的提交,但索引区和工作目录的内容保持不变。更改会被保留在索引区中,准备好进行新的提交。 |
案例:
commit1 -> commit2 -> commit3 -> commit4 (HEAD)
1 | git reset --hard commit2 |
结果:commit1 -> commit2 (HEAD)
git reset 是一个强大的命令,可以根据需要选择不同的模式来重置 HEAD、索引区和工作目录。使用时请谨慎,特别是 –hard 模式,因为它会丢弃所有未提交的更改。
案例1 get pull前需要git reset
本地的branch历史可能和远端的不一样,直接git pull会冲突,推荐做法:
1 | # 某branch在一个地方进行了 |
cherry-pick
案例1:PR到1.5.1和1.6.1
假设:先提交到1.5.1,再提交的1.6.1
1 | # 保持 1.5.1 和 1.6.1 最新 |
案例2:将release/0.11 rebase到master
release/0.11一般有很多个PR(很多个PR的commit),将其合并到master的时候,需要选择Fast Forward
,这样master中的commit才是原本的commit。如果选择Squash
,则release/0.11中所有的commit都将合并成一条。
如果是单次PR,则选择Squash合并策略即可,否则会有很多commit信息被合并到分支中。
