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”。