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

111

我有以下分支:

  • master
  • production

还有以下远程分支:

  • origin/master
  • origin/production

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

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

我想仅将成功的提交推送到生产分支,然后推送到origin/production

如何做到这一点?

此外,我运行着2个脚本:一个从origin/master获取并将提交详细信息推送到数据库中,并执行合并操作;另一个脚本目前正在编写中,将需要推送成功的提交。

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


1
“Successful commits” 是什么意思? - bdonlan
1
这里并不重要,重要的是有一些提交记录我想保留并推送到另一个分支,而另一些则想要丢弃或忽略。 - Sylvain
2个回答

343
我想你要找的术语是“挑拣”。也就是说,从一个分支中间取出一个单独的提交并添加到另一个分支中:
A-----B------C
 \
  \
   D

变成

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

当然,可以使用git cherry-pick命令来完成这个任务。

这个提交的问题在于git认为提交包括它之前的所有历史记录 - 因此,如果你有三个提交如下:

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

尝试摆脱B,你需要创建一个全新的提交,像这样:

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

对于不同的提交,它们具有不同的SHA-1 ID。因此,将一个分支中的提交“挑选”到另一个分支中,基本上涉及生成一个补丁,然后应用它,这样也会丢失历史记录。

这种更改提交ID的做法破坏了git的合并功能,等等(尽管如果适度使用,有一些启发式方法可以弥补这个问题)。然而,更重要的是,它忽略了功能依赖性 - 如果C实际上使用了在B中定义的函数,你永远都不会知道。

也许更好的处理方式是拥有更细粒度的分支。也就是说,不仅仅只有一个“master”分支,还有像“featureA”,“bugfixB”等分支。对每个分支进行代码审查 - 每个分支都非常专注于只做一件事情 - 然后在完成后合并该分支。这正是git设计和擅长的工作流程 :)

如果您坚持按补丁的级别处理事务,则可能需要查看darcs - 它将存储库视为一组补丁,因此挑选变成了基本操作。但是,这也带来了一系列问题,例如速度非常慢:)

编辑:此外,我不确定您的第二个问题,关于这两个脚本。也许您可以更详细地描述它,可能作为一个单独的问题来避免混淆?


11
更改提交ID会破坏Git的合并功能等功能。@bdonlan,请解释一下合并功能如何被破坏。这是什么意思?(原文已为英文) - Narek
7
他可能的意思是,当你合并第二个分支时,提交 C' 中的更改会与提交 C 中相同的更改发生冲突。这是由于失去了提交 C 后面的历史记录所导致的后果。 - bytefu
1
“并尝试摆脱B” - 你为什么要试图摆脱B? - d512
3
@user1334007,他的意思是以前是A-B-C。现在,由于你选择了C,你的分支变成了A-D-C',不再包含B。 - AnneTheAgile
更重要的是,它忽略了功能依赖性 - 如果 C 实际上使用了在 B 中定义的函数,你将永远不会知道。 - undefined
显示剩余3条评论

1
我明白这是一个旧问题,但在此提及:如何在Git中合并特定提交
因此,有一个更新的答案:使用功能分支和拉取请求。
看起来像什么,其中fA是具有功能A的提交,fB是具有功能B的提交:
            fA   fC (bad commit, don't merge)
           /  \ /
master ----A----B----C
                \  /
                 fB

拉取请求关联到GitHub的功能,但实际上我想说的是有人负责将特性分支合并到主分支。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接