从分支中提取所有提交,将指定的提交推送到另一个提交

我有以下分支机构:

  • master
  • production

和以下远程分支机构:

  • origin/master
  • origin/production

我有一个脚本,获取origin/master分支,并获取从我上次获取( log -p master..origin/master )更改的差异。 然后我合并origin/master

发现的提交被推送到一个代码审查工具。

我想把成功的承诺 – 只有他们 – 推到生产部门,当然还有origin/production

我怎么能这样做?

此外,我有两个脚本运行:从origin/master从提取,提交细节到数据库,并合并,另一个,我目前正在写,将不得不推动成功的提交。

我想有这两个脚本运行,避免竞争条件/合并冲突。 既然我只想用指定的提交工作,也许有办法摆脱我不想要的提交?

我想你正在寻找的是一个“樱桃树”。 也就是说,从一个分支中间单独提交一个,并将其添加到另一个分支:

 A-----B------C \ \ D 

 A-----B------C \ \ D-----C' 

这当然可以用git cherry-pick命令来完成。

这个提交的问题是,git认为提交包含所有的历史logging – 因此,如果你有三个提交这样的:

 A-----B-----C 

并试图摆脱乙,你必须创build一个全新的提交像这样:

 A-----------C' 

其中C'具有不同的SHA-1 ID。 同样,樱桃挑选从一个分支到另一个分支基本上涉及到生成一个补丁,然后应用它,从而也失去了历史。

提交ID的这种改变破坏了git的合并function(尽pipe如果使用的话,会有启发式的方法)。 更重要的是,它忽略了函数依赖关系 – 如果C实际上使用了B中定义的函数,那么你永远不会知道。

也许更好的方法来处理这个问题将是更细粒度的分支。 也就是说,不是只有一个“主”,而是有“featureA”,“bugfixB”等等。在整个分支上执行代码审查 – 每个分支都非常专注于做一件事 – 然后合并一个分支,当你完成。 这是git所devise的工作stream程,以及它的优点:)

如果你坚持要在补丁层次上处理事情,你可能要看看darcs–它认为库是一套补丁,因此樱桃采摘就成了基本的操作。 但是这有它自己的问题,如很慢:)

编辑:另外,我不知道我理解你的第二个问题,关于这两个脚本。 也许你可以更详细地描述它,可能作为一个单独的问题,以防止变得混乱?

我意识到这是一个古老的问题,但在这里引用: 如何在Git中合并特定的提交

因此,一个更新的答案:使用function分支和拉请求。

这看起来像什么,其中fA是提交functionA,而fB是提交functionB:

  fA fC (bad commit, don't merge) / \ / master ----A----B----C \ / fB 

Pull请求与GitHub的function相关联,但是我的意思是,有人有责任将特性分支合并到master中。