【问题标题】:Git merge/cherry-pick all commits of a branchGit合并/樱桃挑选一个分支的所有提交
【发布时间】:2015-04-24 12:32:57
【问题描述】:

场景:

master
|
\
  dev
  |
  \
    feature1
    |
    |
    |
   /
  |
  /  
tagV1
  |
  \
    feature2
    |
    |
   /
  |
 /
tagV2
  |
  \
    fixForV1
    |
    |
   /
  |
  /  
tagV1_1

说明:

  1. 创建仓库
  2. 创建并签出分支 dev
  3. 创建并签出分支功能 1 .. 实现功能
  4. 签出开发并合并功能1,删除功能1
  5. 结帐主合并开发
  6. 创建tagV1(将交付给客户)
  7. 结帐开发人员
  8. 创建并签出分支功能 2 .. 实现功能
  9. 签出开发并合并功能2,删除功能2
  10. 结帐主合并开发
  11. 创建tagV2(将交付相同或不同的客户)
  12. 结帐开发人员
  13. 创建并签出分支 fixForV1 .. 实施修复
  14. 结帐开发并合并 fixForV1
  15. ???

15… 我们需要合并 tagV1 和 fixForV1 上的提交(不包括 feature2 上的提交)。合并后,我们将创建一个新标签 tagV1_1 并将其交付给客户。

我知道我可以通过挑选 {hash of first commit made on fixForV1} ^..{hash of last commit on fixForV1} 来实现这一点 有一个更好的方法吗?

【问题讨论】:

  • 请问为什么fixFovV1是基于V2的? (你的图表也需要更多的爱,看起来没有什么东西被合并回master)
  • 它基于 V2 因为:这是一个简单的演示来展示我的问题。在现实世界中,fixForV1 将是一个在 dev 中实现的功能......现在一段时间后,客户 wo 安装了 v1 要求我也将这个功能集成到 v1 中......并且由于在 feature2 中所做的更改可能会破坏 v1 中的一些东西,所以我只想合并在 fixForV1 中所做的提交(顺便说一句。master 上的所有内容都没有前导空格,dev 有 2 个,功能分支有 4 个……是的,它可能更漂亮。)

标签: git merge tags git-branch git-cherry-pick


【解决方案1】:

如果我正确理解您的要求,您也可以这样工作:

  1. git checkout fixForV1
  2. git format-patch tagV2 -- 从 tagV2 获取所有补丁到 fixForV1 的头部
  3. git checkout -b branchV1 tagV1 -- 基于tagV1新建一个分支
  4. git apply *.patch -- 应用我们在步骤 1 中生成的补丁

如果你幸运的话,所有补丁都可以顺利应用,那么你就完成了。如果不走运,请按顺序逐一应用补丁,然后相应地修复冲突。

【讨论】:

  • 无法正常工作... git 为 tagV1 中已经存在的更改创建补丁文件
  • @musium 抱歉,format-patch 行错了,你能再试试上面的固定版本吗?
猜你喜欢
  • 2018-07-23
  • 2014-11-21
  • 2018-12-28
  • 2016-04-16
  • 2021-07-05
  • 2013-01-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-30
相关资源
最近更新 更多