git - Git:在特性分支中压缩或变基时,为什么需要将它与另一个分支(如 master)进行比较?
问题描述
我有一个功能分支,feature_account
. 它是master
2个月前分支出来的。我在这个分支中做了一些提交,我想在特性分支中将它们全部压缩为 1 个提交。
显然,master
已经独立于特性分支改变了一堆。从我的功能分支中,如果我输入git rebase -i master
,我会从仅在 master 中的更改中获得合并冲突 --- 如果我只是试图将来自功能分支的所有提交合并到 1 个提交中,为什么 master 中的内容很重要?在我尝试合并到主人之前,我不想担心主人。难道我做错了什么?
解决方案
假设提交图是这样的,
* b73f9ac (HEAD -> feature_account) f
* 5e77f54 e
* f6e5be0 d
| * c96a113 (master) c
| * f8132ea b
|/
* bae8722 a
* 762077a initial commit
在git rebase -i master
,新基地是master
。但是在您的情况下,新的基础应该是bae8722
,它是分叉点和最近的共同祖先。它可以通过 定位git merge-base feature_account master
。在一些比较复杂的情况下,git merge-base
可能效果不好,需要通过其他方式找出来。
要明确指定一个新的基础,我们可以使用--onto <newbase>
,
git rebase -i --onto $(git merge-base feature_account master) master
或简短的形式
git rebase -i --onto feature_account...master master
然后在编辑器中,将除第一行之外的行上的“pick”更改为“s”。保存并退出。编辑提交消息并完成。
要压缩 上的新提交feature_account
,还有另一种方法。
git checkout feature_account
# make the working tree clean if it's not
git stash -u
# here "feature_account...master" cannot be used
git reset $(git merge-base feature_account master) --soft
git commit
# restore the stashed changes if necessary
git stash apply --index
推荐阅读
- javascript - Python Flask - 从 API 值计算利润/翻转
- javascript - Node.js request.open("GET", "what.should.I.put.here.html/getAll", true);
- php - 我们如何在特定单词后添加逗号
- docker - Dockerfile:重复 apt 缓存清理的好处
- docker - Kafka - 消费者无法启动:连接被拒绝 - 127.0.0.1:9092 的连接(2)
- javascript - 如何在javascript中的api调用fetch中将变量作为参数传递,反应原生
- xml - 使用“2”参数调用“InsertBefore”的异常:“参考节点不是此节点的子节点。”
- python - 如何生成随机路线
- python - Keras 自定义层到 Conv2D 输入通道错误,ValueError:输入通道数与过滤器的相应维度不匹配,50 != 3200
- angular - Keycloak + Spring Cloud Gateway + Angular 9