合并到特定提交

527

我在git中从master分支创建了一个名为newbranch的新分支。现在我已经完成了一些工作,并希望将newbranch合并到master中; 但是,我对newbranch进行了一些额外的更改,并且想要将newbranch合并到master的倒数第四个提交。

我使用cherry-pick,但它提示我使用正确的选项:

git checkout master    
git cherry-pick ^^^^HEAD newbranch

我可以使用 git merge 来替代它吗?

git merge newbranch <commitid>
6个回答

822

当然,如果你在master分支中,你所需要做的就是:

git merge <commit-id>

其中commit-id是你想在master分支中获取的来自newbranch的最后一次提交的哈希值。

您可以通过执行git help <command>了解有关任何git命令的更多信息。在这种情况下,它是git help merge。文档显示merge命令的最后一个参数是<commit>...,因此您可以传递对任何提交甚至多个提交的引用。虽然我从未亲自尝试过后者。


52
不仅仅是一个单独的提交,而是commit-id之前的所有提交。 - Dau
77
是的,它将把newbranch分支从其历史分叉与master分支到commit-id提交所包含的所有更改合并到master分支中。你可以把git merge <commit-id>理解为将以commit-id结尾的某个未命名分支合并到当前分支中。 - KL-7
2
我能否使用提交ID在除主分支之外的两个本地分支之间进行合并? - skt
1
@skt,你可以这样做,只需在使用git merge之前进入要合并的本地分支即可。例如,如果你想将分支b2中的提交18a6fac合并到分支b1中,只需执行git checkout b1; git merge 18a6fac即可。 - XioRcaL
2
这似乎不起作用。如果我在一个分支上想要合并到另一个分支,并且有其他的分支包含提交 A、B 和 C,当我合并 C 时,它只会获取 C 中所做的更改,而不是 A 和 B。 - ggb667

27
为了保持分支的清晰,您可以这样做:

将代码编写为:

git checkout newbranch
git branch newbranch2
git reset --hard <commit Id> # the commit at which you want to merge
git checkout master
git merge newbranch
git checkout newbranch2

这样,新分支将在合并到主分支时终止,您可以继续在 newbranch2 上工作。


如果你需要一个分支能够创建一个PR,这个方法非常有效。 - Dan Sinclair
请注意,git branch newbranch2 后跟 git reset --hard <commit Id> 可以被一个单独的命令替代:git branch newbranch2 <commit Id> - assylias

11
合并至特定提交

我发现这是一种非常可靠的合并至特定提交的方法。"源"和"目标"分支永远不会被修改(除了在"目标"分支上进行合并)。

假设你想将分支src合并到分支dst,但只想合并至特定提交 commitId

git checkout src
git branch temp commitId        # create temporary branch at commitId
git switch dst             
git merge temp                     # merge temp branch to dst branch
git branch -d temp                 # remove temp branch as we dont need it anymore.

6
在当前分支文件夹中运行以下命令,将 <commit-id> 分支合并到当前分支。使用 --no-commit 参数可以避免自动创建新的提交。
git merge --no-commit <commit-id>

git merge --continue 只能在合并过程中发生冲突后运行。

git merge --abort 中止当前的合并冲突解决过程,并尝试重建合并前的状态。


0
最近我们遇到了类似的问题,不得不用一种不同的方式来解决它。我们需要合并两个分支,但这两个分支的提交并不是它们各自的最新提交。
branch A: A1 -> A2 -> A3 -> A4
branch B: B1 -> B2 -> B3 -> B4
branch C: C1 -> A2 -> B3 -> C2

例如,我们必须将分支A合并到A2和分支B合并到B3。但是分支C从A和B中挑选了一些提交。当使用A2和B3的SHA时,由于本地分支C具有相同的SHA,看起来存在混淆。
为避免任何歧义,我们在本地删除了分支C,然后从提交A2创建了一个名为AA的新分支:
git co A
git co SHA-of-A2
git co -b AA

然后我们从提交B3创建了一个分支BB:

git co B
git co SHA-of-B3
git co -b BB

在那个时间点,我们合并了两个分支AA和BB。通过删除分支C并引用分支而不是提交,它起作用了。
我不确定其中有多少是迷信或者到底是什么让它起作用了,但这个“长方法”可能会有所帮助。

-5
要将特定分支合并到主分支,只需执行以下操作: git reset --hard <commit Id> <-- 您想要合并的提交ID

1
那将会失去该提交之后的所有更改。问题并没有要求这样做。 - Bob Ray

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