我从 git 中的 master
分支创建了一个名为 newbranch
的新分支。现在我已经做了一些工作,想将newbranch
合并到master
;但是,我对 newbranch
进行了一些额外的更改,并且我想将 newbranch
合并到倒数第四次提交到 master
。
我使用了 cherry-pick
,但它显示了使用正确选项的消息:
git checkout master
git cherry-pick ^^^^HEAD newbranch
我可以使用 git merge
来代替吗?
git merge newbranch <commitid>
当然,在 master
分支中,您需要做的就是:
git merge <commit-id>
其中 commit-id
是您希望在 master
分支中获得的来自 newbranch
的最后一次提交的哈希。
您可以通过执行 git help <command>
了解有关任何 git 命令的更多信息。在这种情况下它是git help merge
。并且文档说 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 上工作。
在当前分支文件夹中运行以下命令以从该 <commit-id>
合并到当前分支,--no-commit
不会自动进行新提交
git merge --no-commit <commit-id>
git merge --continue
只能在合并导致冲突后运行。
git merge --abort
中止当前的冲突解决过程,并尝试重建预合并状态。
合并提交
我发现这是一种非常可靠的合并提交的方式。 “源”和“目标”分支永远不会被修改来进行合并(“目标”分支上的合并除外)。
假设您想将分支 src
合并到分支 dst
,但只合并到特定的提交 ID commitId
git checkout src
git switch -c temp commitId # create temporary branch at commitId
git switch -c 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 reset --hard <commit Id>
<-- 要合并的提交
commit-id
之前的所有提交newbranch
开始的所有提交,因为它的历史从master
到commit-id
分支到master
分支。您可以将git merge <commit-id>
视为将一些以commit-id
结尾的未命名分支合并到您当前的分支中。git merge
之前,在你想要合并的本地分支上。即说你想将提交 18a6fac 从分支 b2 合并到分支 b1 只需执行git checkout b1; git merge 18a6fac