【问题标题】:Merge ignoring conflicting commits合并忽略冲突的提交
【发布时间】:2021-12-25 09:29:00
【问题描述】:

我有一个本地分支,其中包含我无法维护的重大更改,我想将它与远程上游分支同步。当我将上游合并到我的 fork 中时,我希望与我的 fork 冲突的提交被简单地忽略。你知道怎么做吗?

总而言之,我想:

  • 忽略任何有冲突的提交。
  • 永远不要覆盖本地文件。
  • 有一个最新的分叉。

谢谢!

【问题讨论】:

  • 你想丢弃还是在你的 fork 中保留有冲突的提交?
  • 只丢弃,但我希望返回未合并的提交。

标签: git merge


【解决方案1】:

Git 的 git merge 不能按提交提交。要跳过导致冲突的提交,您需要逐个提交工作。您需要编写自己的软件来执行此操作。 这部分在所有线性情况下都相对容易,但在复杂情况下会迅速陷入困境(合并包含合并的提交序列),并且在大多数实际情况下几乎没有价值系统,因为跳过导致较早合并冲突的提交通常会导致大多数或所有后续提交发生合并冲突

换句话说,给定这样的提交流:

... <-F <-G <-H <-I ...

当你尝试“cherry-merge”1 一次提交一个时,如果你跳过 G 因为它有冲突,你会发现 H 依赖于G 因而有冲突,而I 依赖于H 因而有冲突,以此类推。

这样做的最终结果是您合并到某个停滞点,然后停止获取大多数新提交。所以我建议不要尝试这个。不过,您可能有一个奇怪的情况,但这种情况并没有真正发生,在这种情况下,请随意尝试编写“cherry-merge”。


1这是我为您需要编写的新 Git 命令编造的名称。它是cherry-pick和merge的结合,所以我将它命名为“cherry-merge”,但最终这可能是一个糟糕的名字。 Naming is one of the hard problems in computing, after all.

(我在这里有点误用“命名事物”的想法,这是故意的,但它适用。我还暗指在“两个困难的事情”中添加“减一”错误的笑话变体.)

【讨论】:

    【解决方案2】:

    保持你的分支更新到上游意味着,你基本上需要通过git-merge 连接你的分支。但如您所知,即使您想丢弃某些提交,历史记录也会在您的合并提交上,因此您需要进行一些处理以“丢弃”此类提交。我建议在运行合并之前恢复。

    因此,如果您可以手动花费精力来选择性地选择要丢弃的提交,则可以在运行合并之前在本地恢复它们。

    git checkout upstream/master
    git revert bad-commit-yesterday # NOTE: the order of revert matters
    git revert bad-commit-one-month-ago # commit-hash = e.g., abcde123
    git checkout origin/master
    git merge --log abcde123
    

    或者,如果你想很快做到这一点,这里是肮脏的方法。

    git checkout origin/master # your repo
    git merge --log upstream/master # Conflict
    git checkout origin/master - <file_path_1> ... # I assume you want to keep your "local" change in origin/master
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 2013-07-07
      • 2021-07-28
      • 2021-06-23
      • 2015-04-22
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      相关资源
      最近更新 更多