git - 在 rebase merge 冲突期间,如何使用 git difftool 显示两个基础的两组更改?

标签 git git-rebase git-merge-conflict

我见过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/

相关文章:

git - 无法解决 PR​​ 中的 GitHub 冲突

git - 做 rebase 时我应该在哪个分支?

git - 如何防止在 bitbucket 上的 git 存储库中推送 -f?

Gitkraken 在尝试执行任何操作时显示 `error matching pattern`

ruby-on-rails - Git 仅从特定文件夹 merge

git - 如何用 git gui 做一个 rebase?

git rebase --editor=/something/other/than/vim? (为了更容易压扁)

git - 我遇到了 merge 冲突。如何中止 merge ?

Git:如何在 "git merge-file"之后将文件标记为冲突?

python - 如何将代码文件保存在 GitHub 上并在 Jupyter notebook 上运行?