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

Git 从一个分支提取所有提交,将指定的提交推送到另一个分支,git,branch,Git,Branch,我有以下分支机构: master 生产 以及以下远程分支机构: origin/master origin/production 我有一个脚本,它获取origin/master分支,并获取与上次获取不同的内容(log-pmaster..origin/master)。然后我合并origin/master 找到的提交被推送到代码审查工具 我想将成功提交推送到生产分支,然后当然是推送到origin/production 我怎样才能做到 另外,我有两个脚本正在运行:一个是从origin/maste

我有以下分支机构:

  • master
  • 生产
以及以下远程分支机构:

  • origin/master
  • origin/production
我有一个脚本,它获取
origin/master
分支,并获取与上次获取不同的内容(
log-pmaster..origin/master
)。然后我合并
origin/master

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

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

我怎样才能做到

另外,我有两个脚本正在运行:一个是从
origin/master
获取、将提交细节推送到数据库和合并,另一个是我目前正在编写的脚本,它必须推送成功的提交


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

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

A-----B------C
 \
  \
   D
变成

A-----B------C
 \
  \
   D-----C'
当然,这可以通过git cherry pick命令完成

这个提交的问题是git认为提交包含了之前的所有历史记录——因此,如果您有三个这样的提交:

A-----B-----C
为了摆脱B,您必须创建一个全新的提交,如下所示:

A-----------C'
其中C'具有不同的SHA-1 ID。同样,cherry从一个分支到另一个分支的提交基本上涉及生成一个补丁,然后应用它,因此也会以这种方式丢失历史记录

提交ID的这种变化破坏了git的合并功能(尽管如果少用的话,也会有一些启发式方法来掩盖这一点)。但更重要的是,它忽略了函数依赖关系——如果C实际使用了在B中定义的函数,您永远不会知道

也许更好的处理方法是使用更细粒度的分支。也就是说,不要只使用“master”,而是使用“featureA”、“bugfixB”等。每次对整个分支执行代码检查—每个分支都非常专注于只做一件事—然后在完成后合并该分支。这就是git设计的工作流程,也是它擅长的:)

如果你坚持在补丁级别处理事情,你可能想看看DARC——它将存储库视为一组补丁,因此樱桃采摘成为基本操作。但是,这也有其自身的一系列问题,例如速度非常慢:)


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

我意识到这是一个老问题,但这里引用了:

因此,一个新的答案是:使用特性分支和拉请求

这看起来是什么样子,其中fA是具有功能a的提交,fB是具有功能B的提交:

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

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

您所说的“成功提交”是什么意思?已经检查并标记为成功的提交。在这里,这并不重要,重要的是有一些提交我想保留并推送到另一个分支,还有一些我想摆脱/忽略。关于第二个问题,我只想确保获取更改(第一个脚本)和将给定提交推送到另一个位置(第二个脚本)的过程在使用不同分支时,可以在没有竞争条件/合并冲突的情况下工作。但最后我想oesn并不重要,因为我可以将这两个脚本合并成一个脚本,这样这两个脚本就不会同时工作:)“更改提交ID会破坏git的合并功能以及其他功能”@bdonlan请解释合并功能是如何被阻止的。这是什么意思?@Narek他的意思可能是,当您合并第二个分支时,commit C中的更改将与commit C中的相同更改发生冲突。这就是在提交C之后丢失历史的后果。“并尝试摆脱B”-你为什么要试图摆脱B?@user1334007,他的意思是以前它是A-B-C。现在,由于你选择了C,你的分支是A-D-C,不再包含“B”。