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


102

我有以下分支:

  • master
  • production

和以下远程分支:

  • origin/master
  • origin/production

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

找到的提交将推送到代码审查工具。

我想将成功的提交(只有它们)推送到生产部门,然后再推送到origin/production

我该怎么办?

另外,我有两个正在运行的脚本:一个从中获取origin/master,push将详细信息提交到数据库并进行合并的脚本,而我当前正在编写的另一个脚本将必须成功提交的脚本。

我想在避免竞争条件/合并冲突的同时运行这两个脚本。由于我只想使用指定的提交,也许有一种方法可以摆脱我不想要的提交?


“成功提交”是什么意思?
布多兰

经过审查并标记为成功的那一项。在这里并不重要,重要的是,有一些我想保留并推送到另一个分支的提交,还有一些我想摆脱/忽略的提交。
西尔万,

Answers:


312

我认为您正在寻找的术语是“樱桃精选”。也就是说,从一个分支的中间进行一次提交并将其添加到另一个分支中:

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

变成

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

当然,这可以通过git cherry-pick命令完成。

提交的问题在于git认为提交包含了所有历史记录,因此,如果您有三个提交,如下所示:

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

并尝试摆脱B,您必须像下面这样创建一个全新的提交:

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

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

提交ID的这种更改在其他方面破坏了git的合并功能(尽管如果谨慎使用,则会在此基础上进行启发式搜索)。但是,更重要的是,它忽略了功能依赖性-如果C实际上使用了B中定义的功能,您将永远不会知道。

解决此问题的更好方法可能是拥有更多细粒度的分支。也就是说,不仅仅是拥有“ master”,而拥有“ featureA”,“ bugfixB”等。一次在整个分支上执行代码检查-每个分支只专注于做一件事-然后将其合并完成后,一个分支。这是git设计的工作流程,它的优点是:)

如果您坚持要在补丁程序级别上进行处理,则可能需要看一下darcs-它认为存储库是一组补丁程序,因此,挑选樱桃成为基本操作。但是,这有其自身的一系列问题,例如速度很慢:)

编辑:另外,我不确定我是否理解您关于第二个脚本的第二个问题。也许您可以更详细地描述它,可能是一个独立的问题,以免使事情变得混乱?


关于我的第二个问题,我只想确保在与其他分支一起工作时,获取更改(第一个脚本)并将给定的提交推送到另一个位置(第二个脚本)的过程可以正常工作而不会出现争用条件/合并冲突。但是最后我想那没关系,因为我可以将2个脚本合并为一个,这样2个脚本就不能同时工作了:)
Sylvain

9
@bdonlan:
Narek 2013年

5
@Narek他可能意味着,当您合并第二个分支时,提交C'中的更改将与提交C中的相同更改发生冲突。那是在提交C之后丢失历史记录的结果
。– bytefu

1
“并尝试摆脱B”-为什么要摆脱B?
d512

3
@ user1334007,他的意思是以前是ABC。现在,由于选择了C,因此您的分支为AD-C',不再包含'B'。
AnneTheAgile 2015年

1

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

因此,有一个新的答案:使用功能分支并提取请求。

看起来像什么,其中fA是具有功能A的提交,而fB是具有功能B的提交:

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

拉取请求与GitHub的功能相关联,但实际上我的意思是某人有责任将功能分支合并到master中。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.