首页 > 解决方案 > Git:在特性分支中压缩或变基时,为什么需要将它与另一个分支(如 master)进行比较?

问题描述

我有一个功能分支,feature_account. 它是master2个月前分支出来的。我在这个分支中做了一些提交,我想在特性分支中将它们全部压缩为 1 个提交。
显然,master已经独立于特性分支改变了一堆。从我的功能分支中,如果我输入git rebase -i master,我会从仅在 master 中的更改中获得合并冲突 --- 如果我只是试图将来自功能分支的所有提交合并到 1 个提交中,为什么 master 中的内容很重要?在我尝试合并到主人之前,我不想担心主人。难道我做错了什么?

标签: gitgithubrebase

解决方案


假设提交图是这样的,

* 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

推荐阅读