我见过https://stackoverflow.com/a/49215221/962918使用 git rebase --show-current-patch ,它几乎达到了我想要的一半。就像这个问题一样,我以交互方式将当前的 HEAD 分支重新定位到其历史记录中的一个提交,以在公开发布它们之前清理它们(又名,排序为逻辑步骤)。通常,当交互式 rebase 运行时,会发生 merge 冲突。
在我当前的思维模型中,解决这些 rebase 冲突的目标是生成应用每个的更改(也称为补丁/差异)的最终状态两个提交的 rebase 正在尝试 merge 。这与标准 merge 冲突不同,标准 merge 冲突的最终目标是生成一个最终状态,该状态是提示处两次提交的最终状态的协调(组合)您要 merge 的分支的数量。
因为这是一个 rebase ,所以这些提交的更改(差异/补丁)将应用于与最初不同的起始状态。我知道这可能会导致需要手动解决的问题。 (例如,如果补丁试图更改的功能已被删除怎么办?)
如果目标是应用两组更改,那么将它们可视化对于解决 rebase 冲突似乎很有用。我知道 git difftool 和 git mergetool 命令,并且非常欣赏 Meld 对差异的显示。如何让 Git 使用 git difftool 向我显示这两组更改,以及文件前后内容的完整上下文? git rebase --show-current-patch 似乎给了我一组更改,但不是在 Meld 中。我如何在 Meld 中显示另一组更改(或任何首选的差异(或 merge )工具)?如果我可以将第三个文件传递给 Meld,这样我就可以编辑/创建“merge ”版本,那就加分了融合。
最佳答案
a.正如 @j6t 在评论中正确提到的那样:cherry-pick 中的“merge 基础”是原始提交的父级。
在 rebase 过程中,该提交由 REBASE_HEAD
引用,因此您可以查看:
# "ours" :
git diff REBASE_HEAD~ HEAD
# "theirs" :
git diff REBASE_HEAD~ REBASE_HEAD
b.您提到了 git mergetool 和 meld 的 3 路 merge 显示:
meld 处理三向 merge 的方式的一个小问题是它显示 3 个 Pane (而不是 4 个),因此如果您尝试协调中间 Pane 中的更改,则会丢失 BASE
.
kdiff3
显示 4 个 Pane :1 个 Pane 代表“我们的”、“基地”、“他们的”,第 4 个 Pane 用于缓冲冲突解决方案(例如:实际内容您将在最后保存的文件的名称)。
出于习惯,我习惯了 meld 的界面,所以我围绕 meld
编写了一个包装命令,以首先利用它的 --auto-merge
功能(恕我直言,这很珍贵),第二个是为每个差异“我们的”和“他们的”打开额外选项卡:
# 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
关于git - 在 rebase merge 冲突期间,如何使用 git difftool 显示两个基础的两组更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76050140/