如何在Git中将提交之间的差异应用于当前代码库的主干?

6
我正在参与的项目上开发一些专题分支。在提交请求之前,我通常会将我的分支进行变基。但是这一次由于主分支的更改,变基变得十分麻烦。有很多冲突,并且更糟的是,在手动合并后,提交记录看起来很丑陋,并且失去了它们的意义。我肯定更喜欢获取我的分支头和两个分支上最新提交之间的差异,然后将此差异应用于主分支的头部,并最终使用git add -p创建全新的亮眼提交。那么我的问题是:如何实现?一种可能性是将主分支简单地合并到我的专题分支中,但是否有更优雅的解决方案?我相信有。

感谢您的帮助。

编辑:

一个文件已经在主分支上移动,而我的提交正在修改此文件(使用其旧名称)。

2个回答

13

太棒了!我已经在其他提交上测试了你的解决方案,它是正确的。可惜在我的情况下,有一个文件在此期间被移动了,所以无法进行cherry-pick。如果没有人提出更适用于我的情况的解决方案,我将接受它。 - skalee
听起来你可以用交互式变基 git rebase -i 来完成? - Christoffer Hammarström
如果您对已移动的文件进行了更改,请参阅此答案:https://dev59.com/tXA75IYBdhLWcg3wFEoI#15137607 - Christoffer Hammarström

8

如果您想要获取连续的提交,那么已经给出的答案就可以了。

但是,如果您需要一个一般的方法来应用任何两个选择的提交之间的差异(就像我发现这个页面时那样),那么它就没有那么有用了。

在我的情况下,我采取了以下措施:

为了对事物命名,我们假设我想将从commit1commit2的差异作为单个提交应用于branch1

请注意,commit1可能是commit2的祖先或“后代”,或者二者都不是。

所以我这样做:

git status     # Ensure working directory is clean, preferably no untracked files
git checkout -b temp-branch commit2
git reset --soft commit1
git commit -m "Everything from commit1 to commit2 as one commit"
git checkout branch1
git cherry-pick temp-branch
    # Confirm result is what you expect
git branch -D temp-branch

如果commit1是commit2的祖先,那么这等同于执行git cherry-pick --no-commit <commit1>..<commit2>git commit - Christoffer Hammarström
@ChristofferHammarström,是的,但正如我所写的那样,commit1可以是commit2的祖先后代,或者两者都不是。无论如何,这种方法都适用。 - Wildcard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接