合并忽略冲突提交
Merge ignoring conflicting commits
我有一个本地分支,其中包含我无法维护的重大更改,我想将它与远程上游分支同步。当我将上游合并到我的分叉中时,我希望与我的分叉冲突的提交被简单地忽略。你知道怎么做吗?
总而言之,我想:
- 忽略任何冲突的提交。
- 从不覆盖本地文件。
- 有一个最新的叉子。
谢谢!
让你的分支与上游保持同步意味着,你基本上需要通过 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
Git 的 git merge
无法逐个提交。要跳过导致冲突的提交,您需要逐个提交。您需要编写自己的软件来执行此操作。 那部分在所有线性情况下都相对容易,但在复杂情况下会迅速陷入困境(合并包含合并的提交序列),并且会在大多数实际系统中没有什么价值,因为跳过导致较早合并冲突的提交通常会导致大多数或所有后续提交具有合并冲突 .
换句话说,给定这样的提交流:
... <-F <-G <-H <-I ...
当您尝试“樱桃合并”1 一次提交一个时,如果您跳过 G
因为它有冲突,您会发现 H
依赖于G
因此有冲突,而I
依赖于H
因此有冲突,等等。
这样做的最终结果是您合并到某个停滞点,然后停止获取大多数新提交。所以我建议甚至不要尝试这个。不过,您可能遇到了一个奇怪的情况,但实际上并没有发生这种情况,在这种情况下,请随意尝试编写“樱桃合并”。
1这是我为您需要编写的新 Git 命令虚构的名称。它是 cherry-pick 和 merge 的组合,所以我将它命名为“cherry-merge”,但最终这可能是一个糟糕的名字。 Naming is one of the hard problems in computing, after all.
(我在这里有点误用了“命名事物”的想法,故意的,但它适用。我还暗指在“两个硬东西”。)
我有一个本地分支,其中包含我无法维护的重大更改,我想将它与远程上游分支同步。当我将上游合并到我的分叉中时,我希望与我的分叉冲突的提交被简单地忽略。你知道怎么做吗?
总而言之,我想:
- 忽略任何冲突的提交。
- 从不覆盖本地文件。
- 有一个最新的叉子。
谢谢!
让你的分支与上游保持同步意味着,你基本上需要通过 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
Git 的 git merge
无法逐个提交。要跳过导致冲突的提交,您需要逐个提交。您需要编写自己的软件来执行此操作。 那部分在所有线性情况下都相对容易,但在复杂情况下会迅速陷入困境(合并包含合并的提交序列),并且会在大多数实际系统中没有什么价值,因为跳过导致较早合并冲突的提交通常会导致大多数或所有后续提交具有合并冲突 .
换句话说,给定这样的提交流:
... <-F <-G <-H <-I ...
当您尝试“樱桃合并”1 一次提交一个时,如果您跳过 G
因为它有冲突,您会发现 H
依赖于G
因此有冲突,而I
依赖于H
因此有冲突,等等。
这样做的最终结果是您合并到某个停滞点,然后停止获取大多数新提交。所以我建议甚至不要尝试这个。不过,您可能遇到了一个奇怪的情况,但实际上并没有发生这种情况,在这种情况下,请随意尝试编写“樱桃合并”。
1这是我为您需要编写的新 Git 命令虚构的名称。它是 cherry-pick 和 merge 的组合,所以我将它命名为“cherry-merge”,但最终这可能是一个糟糕的名字。 Naming is one of the hard problems in computing, after all.
(我在这里有点误用了“命名事物”的想法,故意的,但它适用。我还暗指在“两个硬东西”。)