我有以下分支:
master
production
以及以下远程分支:
origin/master
origin/production
我有一个脚本来获取origin/master
分支并获取从我上一次fetch(log -p master..origin/master
)改变的差异.然后我合并origin/master
.
找到的提交被推送到代码审查工具.
我想将成功的提交 - 只有它们 - 推送到生产分支,然后当然origin/production
.
我怎么能这样做?
此外,我有两个运行的脚本:从中提取的脚本origin/master
,将提交详细信息提交到数据库,以及合并,以及我正在编写的另一个必须推送成功提交的脚本.
我想让这两个脚本运行,同时避免竞争条件/合并冲突.因为我只想使用指定的提交,也许有办法摆脱我不想要的提交?
bdo*_*lan 294
我认为你正在寻找的术语是一个"樱桃选择".也就是说,从一个分支的中间进行一次提交并将其添加到另一个分支:
A-----B------C
\
\
D
Run Code Online (Sandbox Code Playgroud)
变
A-----B------C
\
\
D-----C'
Run Code Online (Sandbox Code Playgroud)
当然,这可以使用git cherry-pick命令完成.
这个提交的问题是git认为提交要包括它们之前的所有历史记录 - 因此,如果你有三个这样的提交:
A-----B-----C
Run Code Online (Sandbox Code Playgroud)
并尝试摆脱B,你必须创建一个全新的提交,如下所示:
A-----------C'
Run Code Online (Sandbox Code Playgroud)
其中C'具有不同的SHA-1 ID.同样,从一个分支到另一个分支的樱桃选择提交基本上涉及生成补丁,然后应用它,从而也以这种方式丢失历史.
这种更改提交ID会破坏git的合并功能(尽管如果谨慎使用,还会有一些启发式方法可以解决这个问题).更重要的是,它忽略了函数依赖 - 如果C实际使用了B中定义的函数,你将永远不会知道.
也许更好的方法是处理更细粒度的分支.也就是说,不只是拥有'master',而是'featureA','bugfixB'等.一次在整个分支上执行代码审查 - 每个分支都专注于只做一件事 - 然后合并你做完一个分支.这是git的工作流程,以及它的优点:)
如果你坚持在补丁级别处理事物,你可能想看看darcs - 它认为存储库是一组补丁,因此樱桃挑选成为基本操作.但是这有一系列问题,例如非常慢:)
编辑:另外,我不确定我理解你的第二个问题,关于这两个脚本.也许你可以更详细地描述它,可能作为一个单独的问题来防止事情变得混乱?