【问题标题】:git cherry-pick: how consider only lines modified by the commit (i.e., not the surrounding context)?git cherry-pick:如何仅考虑提交修改的行(即,不考虑周围的上下文)?
【发布时间】:2013-09-23 04:25:33
【问题描述】:

我有一个有两个分支的项目:

     D---E branch1
    /
---A---C branch2

我想在 branch2 上应用提交 E(但不是 D)。

我使用 git cherry-pickgit mergetool(带有 meld)来解决冲突。到目前为止,一切都很好。

但是,假设提交C之后文件的状态是

lineC1
<context C>
lineC2

而提交 E 引入的变化是

-lineC1
+lineE1
<context E>
-lineC2
+lineE2

我希望合并工具默认显示的结果是

lineE1
<context C>
lineE2

(即 E1 和 E2 行根据提交 E 更改,但内部上下文保留在当前分支中)。

默认情况下,合并工具(即融合)显示:

lineC1
<context E>
lineC2

这真的没有意义。

如何指示 git cherry-pick 保留来自 branch2 的上下文,并且只考虑对提交 E 修改的行的更改?

【问题讨论】:

    标签: git git-merge meld mergetool git-cherry-pick


    【解决方案1】:

    合并一般没有正确的解决方案,程序只能提供启发式建议。如果该建议不是您所需要的,您只需对其进行编辑。我认为融合应该在屏幕上显示你需要的一切。即使没有,您也可以使用git show &lt;sha1&gt;:&lt;file&gt; 之类的命令来显示文件的每个现有版本以进行复制粘贴。编辑完 meld 中的中间列后,git 将按原样接受它,无论您所做的更改如何。

    你可能还想试试git config --global --add merge.conflictstyle diff3

    在下一次挑选(或合并)中,冲突结果的格式会有所不同,并且更适合您的情况。

    【讨论】:

    • 不幸的是,它也不起作用。谢谢你的建议。
    • 您的意思是 diff3 样式不会产生您想要的自动结果?嗯,这并不奇怪。正如我所写的,合并是一个启发式过程,不能保证结果是用户需要的,也不能保证正确检测到冲突。您只需要接受这样一个事实,即如果启发式方法不够好,您需要手动完成工作(您也可以开始改进 git 的合并启发式方法......)或者您的意思是您甚至无法手动完成它?
    【解决方案2】:

    您可以尝试对默认策略(递归)使用不同的合并策略或不同的策略选项。

    查看git merge --help,合并策略部分。

    我遇到了类似的问题,虽然它没有涉及到你的上下文差异,并使用策略选项theirs(标志-Xtheirs)解决了它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多