在 rebase 合并冲突期间,如何使用 git difftool 显示来自两个 base 的两组更改?

问题描述 投票:0回答:1

我已经看到 https://stackoverflow.com/a/49215221/962918 接近我想要的一半,

git rebase --show-current-patch
。就像那个问题一样,我正在以交互方式将我当前的 HEAD 分支重新定位到它的历史记录中的一个提交上,以便在公开发布它们之前清理它们(也就是分类为逻辑步骤)。通常,合并冲突会在交互式 rebase 运行时发生。

在我当前的心智模型中,解决这些 rebase 冲突的目标是生成应用 changes(aka,patch/diff)的最终状态 rebase 试图合并的两个提交中的每一个。这与标准合并冲突不同,后者的最终目标是生成一个最终状态,该状态是您正在合并的分支的尖端处的两个提交的结束状态的协调(组合)。

因为这是一个变基,来自这些提交的更改(差异/补丁)被应用到与最初不同的起始状态。我知道这可能会导致可能需要手动解决的问题。 (例如,如果补丁试图更改的功能已被删除怎么办?)

如果目标是应用两组更改,那么可视化它们似乎有助于解决变基冲突。我知道

git difftool
git mergetool
命令,非常感谢 Meld 的差异显示。我怎样才能让 Git 向我显示这两组更改,以及带有
git difftool
的文件前后内容的完整上下文?
git rebase --show-current-patch
似乎让我做了一组更改,但在 Meld 中没有。我如何在 Meld 中显示另一组更改(或者首选的 diff(或合并)工具是什么?如果我可以获得传递给 Meld 的第三个文件,那么我可以加分,这样我就可以编辑/创建“合并”版本融合

git git-rebase git-merge-conflict
1个回答
0
投票

一个。正如@j6t 在评论中正确提到的那样:cherry-pick 中的“合并基础”是原始提交的父项。

在变基过程中,该提交被

REBASE_HEAD
引用,因此您可以查看:

# "ours" :
git diff REBASE_HEAD~ HEAD

# "theirs" :
git diff REBASE_HEAD~ REBASE_HEAD

b。你提到

git mergetool
和 meld 的 3 路合并显示:

meld 处理 3 路合并的方式的一个小问题是它显示 3 个窗格(而不是 4 个),因此如果您尝试协调中间窗格中的更改,您将丢失

BASE
的原始内容。

kdiff3
,例如,显示 4 个窗格:1 个用于“我们的”、“基地”、“他们的”,第 4 个用于缓冲您的冲突解决(例如:您将保存的文件的实际内容结束)。

出于习惯,我习惯了 meld 的界面,所以我围绕

meld
编写了一个包装命令,首先利用它的
--auto-merge
功能,然后为每个差异“我们的”打开 extra 选项卡 ”和“他们的”:

# I named my alias 'meld3', here are the two relevant config settings:
$ git config --list | grep meld3

# --diff, which can be specified several times, will open extra diff tabs
# I added one to view 'LOCAL vs BASE' (LOCAL is on the left side) and
# one to view 'BASE vs REMOTE' (REMOTE is on the right side)
mergetool.meld3.cmd=meld --auto-merge $LOCAL $BASE $REMOTE -o $MERGED \
    --diff $LOCAL $BASE --diff $BASE $REMOTE

# use the above command as the default mergetool:
merge.tool=meld3
© www.soinside.com 2019 - 2024. All rights reserved.