我从git中的主分支中创建了一个名为newbranch的新分支。现在我已经做了一些工作,想合并新分支来掌握;但是,我对新分支做了一些额外的更改,我想合并新分支到从最后一次提交到master的第四次。
我使用樱桃选择,但它显示的消息使用正确的选项:
git checkout master
git cherry-pick ^^^^HEAD newbranch
我可以用git merge来代替它吗?
git merge newbranch <commitid>
我从git中的主分支中创建了一个名为newbranch的新分支。现在我已经做了一些工作,想合并新分支来掌握;但是,我对新分支做了一些额外的更改,我想合并新分支到从最后一次提交到master的第四次。
我使用樱桃选择,但它显示的消息使用正确的选项:
git checkout master
git cherry-pick ^^^^HEAD newbranch
我可以用git merge来代替它吗?
git merge newbranch <commitid>
当前回答
最近,我们遇到了一个类似的问题,必须以不同的方式解决它。我们必须将两个分支合并为两个提交,这两个提交都不是两个分支的头部:
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,然后引用分支而不是提交,它可以工作。
我不清楚这在多大程度上是迷信,也不清楚是什么让它起作用,但这种“长线”可能会有所帮助。
其他回答
要合并一个特定的分支到你的主分支,只需这样做:
git reset——hard <commit Id> <——你想要合并的提交
合并到提交
我发现这是一种非常可靠的合并到提交的方式。“源”和“目标”分支永远不会被修改(除了“目标”分支上的合并)。
假设你想要合并分支src和分支dst,但只能合并到一个特定的提交id 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.
最近,我们遇到了一个类似的问题,必须以不同的方式解决它。我们必须将两个分支合并为两个提交,这两个提交都不是两个分支的头部:
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,然后引用分支而不是提交,它可以工作。
我不清楚这在多大程度上是迷信,也不清楚是什么让它起作用,但这种“长线”可能会有所帮助。
当然,在主分支中你所需要做的就是:
git merge <commit-id>
commit-id是你想在你的主分支中从新分支获得的最后一次提交的哈希值。
你可以通过git help <command>来了解更多关于git命令的信息。在这种情况下,git帮助合并。文档中说merge命令的最后一个参数是<commit>…,因此您可以将引用传递给任何提交,甚至多个提交。不过,我自己从来没有这样做过。
为了保持分支的干净,你可以这样做:
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
这样,newbranch将在它被合并到master的地方结束,你将继续在newbranch2上工作。