合并两个分支之间的差异到第三个分支中。
合并两个分支之间的差异到第三个分支中。
假设我有两个分支,master
和new_feature
。
我本应该在一个特定的功能上工作,我以为这个功能应该是new_feature
的一部分,所以我从new_feature
分支上检出了specific_feature
分支,就像这样:
git checkout -b specific_feature
现在我在这个specific_feature
分支上进行了大量的开发,并多次将upstream/new_feature
合并到其中以获取远程的更改。
现在,我知道我的specific_feature
应该是从master
而不是new_feature
分支分出的。(new_feature
分支还没有准备好被推送)
有没有办法可以获取我specific_feature
分支和new_feature
分支之间的差异,并将这些更改应用到一个新的分支上,比如说specific_feature_master
(从master分支分出的)?
合并两个分支到第三个分支的差异的问题出现的原因是,特定功能分支(specific_feature)中多次合并了新功能分支(new_feature)的代码,导致使用git rebase --onto命令时无法正确地将两个分支的差异合并到master分支。
解决方法是创建一个临时分支tmp,将specific_feature分支重新基于master分支创建,然后将最后一个合并进specific_feature分支的新功能分支的最后一个提交Y合并到新的specific_feature分支中。最后,使用git rebase --onto命令将tmp分支与新功能分支之间的差异合并到specific_feature分支。
具体操作步骤如下:
1. 创建临时分支tmp并切换到specific_feature分支:git checkout -b tmp specific_feature
2. 将specific_feature分支重新基于master分支创建:git checkout -B specific_feature master
3. 将新功能分支最后一个合并进specific_feature分支的提交Y合并到新的specific_feature分支中:git merge $(git merge-base tmp new_feature)
4. 使用git rebase --onto命令将tmp分支与新功能分支之间的差异合并到specific_feature分支:git rebase --onto specific_feature $(git merge-base tmp new_feature) tmp
5. 删除临时分支tmp:git branch -D tmp
经过上述操作,specific_feature分支将包含tmp分支与新功能分支之间的差异,并且与master分支保持一致。
以上是问题的原因和解决方法的详细说明。
问题的出现的原因是在两个分支上进行了不同的修改,现在需要将这些修改合并到第三个分支上。解决方法是使用git cherry命令检索在specific_feature分支上进行的提交,并且这些提交在origin/new_feature分支上没有出现。
首先,使用以下命令可以检索到在specific_feature分支上进行的提交,但在origin/new_feature分支上没有出现的提交:
git cherry origin/new_feature specific_feature
然后,可以从master分支上创建一个新的分支,并且将这些提交进行合并:
git checkout -b specific_feature_master master git cherry origin/new_feature specific_feature | egrep '^+' | awk '{print $2} | xargs git cherry-pick
以上操作将会解决你的问题,但是如果specific_feature和origin/new_feature之间存在依赖关系,版本控制系统是无法解决这个问题的。
最后,进行了一次小的编辑来修复最后一行的错误:
git cherry origin/new_feature specific_feature | egrep '^\+' | awk '{print $2}' | xargs git cherry-pick