如何在git中将一个提交从一个分支复制到另一个分支而不进行任何合并?

15

我有两个分支,一个是主分支,一个是实验性分支。如下所示:

master-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-Y
                  \
                   -x-x-x-x

我的实验版本非常过时,我希望通过将主分支(Y)中的最后一次提交复制到实验分支来更新它:

master-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-Y
                  \
                   -x-x-x-x-Y
如果可能的话,我不想进行任何合并,我希望覆盖实验性分支中的任何内容(主分支是我的首要关注点)。
编辑: 让我简要解释一下情况:当我尝试合并主分支和实验性分支顶部的提交时,我会遇到很多合并冲突!如果我试图从实验性分支到主分支上挑选,情况也是如此!我希望避免它们,因为我根本不想要实验性分支的任何更改!到目前为止,我一直在从主分支到实验性分支上挑选,当有合并冲突时,我只保留主分支的更改。但是在这样做多次之后,我希望可能有某种方式可以做到“像合并一样的东西,除了我不会受到任何合并冲突提示以外”,因为主分支的更改是我所需要的(就我所知道的而言,先前实验性分支上的更改并不重要!)。
2个回答

23

如何从 master 分支上 挑选并合并提交 Yexperimental 分支?可以使用 cherry-pick 命令。

git checkout experimental
git cherry-pick Y

或者:

git checkout experimental
git cherry-pick master

将应用最新提交的更改到 master 分支,并在 experimental 分支上创建一个包含这些更改的新的提交。


1
很抱歉,但如果我按照您的指示进行操作,我必须合并。我希望能够在不合并的情况下完成操作! - reubenjohn
@reubenjohn:那么,如果您说“只需将主分支(Y)中的最后一次提交复制到实验分支”,我恐怕不明白您的意思。 - johnsyweb
1
@reubenjohn 花点时间学习一下 cherry pick 和 merge,它们是两个不同的东西。 - CharlesB
1
@CharlesB 我确实知道cherry-pick和merge之间的区别,但不幸的是我用一个糟糕的问题误导了你!有一个误解,我已经编辑了我的问题! - reubenjohn

3

这是我最初尝试的方法!:


git checkout experimental
git rebase --onto <COMMIT ID OF LAST MASTER COMMIT> experimental

尝试此代码后,我发现不仅主分支最新提交的内容,而且整个实验性分支都变成了主分支的克隆!是的,这不是一种优雅的解决方案,也是对Git的不良使用!
然而,正如@Johnsyweb所指出的那样,最佳解决方案是合并实验性分支和主分支,但是:
Git更喜欢采用主分支上的更改而不是实验性分支上的更改。
因此执行以下操作:
git checkout experimental
git merge -Xtheirs master

应该可以正常工作。 虽然它说是合并,但实际上只考虑了实验分支对主分支的更改,因此在实际情况下更像是从实验分支复制到主分支。
(参见类似讨论此处


1
我不确定您对 git rebase 的期望是什么,但在我看来,那看起来是正确的。 在我看来,您想将master分支点之后的所有更改合并到experimental中,但Git会优先采用master上的更改而不是experimental上的更改(如果存在冲突)。类似于这样:https://dev59.com/nnVC5IYBdhLWcg3w0EsD#3364506 - johnsyweb

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