git – 合并时跳过特定的提交

我已经使用Git大约一年了,觉得这太棒了,但是我刚刚开始了第二个版本的项目,并开始了一个新的分支。 我正在努力处理事情的最好方法。

我有两个分支叫做master10(for v1)和master20(for v2)。 我一直在分支master10上进行bug修复,并开发master20的新function。 每当我做一个错误修复,我把它合并到v2通过检查master20和做git merge master10 。 到现在为止还挺好。

然而,现在我已经对v2中的v1进行了修改,但是我想继续合并其他的bug修复。 我如何告诉Git跳过那个特定的提交(或一系列提交),但是我仍然希望合并其他错误修复。

我认为git rebase可能是我所需要的,但读了doc,我的脑袋几乎爆炸了。

我想我想要的就像是一个“git sync”命令,它告诉git两个分支现在处于同步状态,将来只会合并来自这个同步点的提交。

任何帮助赞赏。

如果你想合并大部分,但不是所有的提交分支“maint”到“主”,例如,你可以做到这一点。 它需要一些工作—-如上所述,通常的用例是合并一个分支的所有东西—但是有时候会发生你对一个不应该被集成的发行版本的改变(也许这个代码的已经被主人取代了),那么你如何performance呢? 开始…

所以我们假设maint已经应用了5个变化,其中一个(maint〜3)不会被合并回到master,尽pipe所有其他的都应该是这样。 你可以分三步进行:实际上把所有的东西合并到一起,告诉git把maint〜3合并,即使不合并,剩下的合并。 神奇的是:

 bash <master>$ git merge maint~4 bash <master>$ git merge -s ours maint~3 bash <master>$ git merge maint 

第一个命令将所有麻烦的提示合并到master中。 默认合并日志消息将解释您正在合并“分支”maint(早期部分)“。

第二个命令合并了麻烦的maint〜3提交,但是“-s我们的”选项告诉git使用一个特殊的“合并策略”,实际上,这个合并策略通过简单地保持你合并的树并忽略提交)你正在完全合并。 但是它仍然以HEAD和maint〜3作为父节点进行新的合并提交,所以修改图现在说maint〜3被合并了。 所以实际上你可能也想使用-m选项来'git merge',以解释那个maint〜3 commit实际上被忽略了!

最后的命令简单地将maint(maint〜2..maint)的其余部分合并到master中,这样就可以再次同步了。

恕我直言,最合乎逻辑的事情是合并一切,然后使用git revert(commit_you_dont_want)将其删除

例:

 git merge master git revert 12345678 

如果您有多个“忽略”提交,或者想要编辑还原消息:

 git merge master git revert -n 123456 git revert -n abcdef git commit -m "... Except commits 123456 and abcdef" 

那么你的历史可能看起来像:

 | ... Except 123456 and abcdef |\ Merge branch 'master' into 'your_branch' 

如果只有这些“忽略”提交的冲突,则可以使用:

 git merge master -X ours 

所以你的版本会坚持另一个。 即使没有错误信息,您仍然可以“还原”那些不需要的提交,因为它们可能有其他更改没有冲突,您仍然不需要它们。

如果你有不只是“忽略”提交的冲突,你应该手动解决它们,你可能不得不在恢复过程中再次解决它们。

承诺包括血统。 如果不合并之前的提交,则不能合并提交。

当然,你可以挑选它们。 当您有一个处于维护模式的分支时,这是一个很好的stream程。

一种广告给我的项目 ,基本上包装了@araqnid描述的过程。

介绍下面的GITstream程是一种帮助:

  • 每天/每周通知有关维护分支到dev / master分支的未决合并
  • 分支维护者检查状态并决定是否需要所有的提交,并阻止他们或者要求开发者阻止他们自己。 最后,维护分支合并到上游。

项目页面的引用:

根据工作stream程的不同,维护或客户特定的分支以及主分支都是可能的。 这些分支也被称为LTS分支。

通常情况下,热修复会进入报告错误的分支,然后将提交合并回主分支。

一般的做法是让所有分支与主人完全同步,也就是说,你希望看到特定分支和主人之间的明显差异,以了解主人是否包含所有function和错误修正。

但是有时候你不需要特别的提交,因为它们是特定于客户的,不能被其他用户看到。 或者你的主分支分歧太大,需要完全不同的方法来解决问题,甚至更好,问题不再存在。

另外,如果从主站进入维护分支,则所产生的提交将被阻塞在主站中。

在master10中创build第三个分支,但不在master20中。 始终认为master10是你的“主人”,所有的最稳定的分支。 所有其他分行的分行都希望始终保持同步。