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

Syl*_*ain 94 git branch

我有以下分支:

  • 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 - 它认为存储库是一组补丁,因此樱桃挑选成为基本操作.但是这有一系列问题,例如非常慢:)

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

  • *"这种更改提交ID会破坏git的合并功能"***@ bdonlan请解释合并功能是如何制作的.这是什么意思?** (9认同)
  • @Narek他可能意味着当你合并第二个分支时,提交C'中的更改将与提交C中的相同更改冲突.这是在承诺C背后失去历史的结果. (5认同)
  • @ user1334007,他的意思是之前它曾经是ABC.现在,由于你的樱桃选择C,你的分支是AD-C',它不再包含'B'. (3认同)