除了第3次提交中包含的2个git提交之间的差异

时间:2017-09-19 09:37:06

标签: git git-diff meld 3-way-merge

有没有办法让meld + git显示2次git提交之间发生的更改,但排除第3次提交中引入的更改?用例是看当前提交的数量与3向合并之前完成的一些提交有多大。

1 个答案:

答案 0 :(得分:0)

我有一种愚蠢的方法来做到这一点。

警告:在使用下面的单行之前,最好提交/备份所有未提交的更改。这个单线程试图隐藏和恢复您的更改。但它仍然可能在repo中引入一些混乱(新文件)或者可能包含一些bug

下面的代码显示了FIRST_COMMITSECOND_COMMIT之间的差异,但对MERGE_COMMIT中另一个分支引入的其他文件的更改除外。您应该将变量FIRST_COMMITSECOND_COMMITMERGE_COMMIT设置为适当的值。

FIRST_COMMIT=866dfa2a7
MERGE_COMMIT=94b195989
SECOND_COMMIT=0fc856fd9

git stash ; \
git checkout $FIRST_COMMIT ; \
git ls  $MERGE_COMMIT..$SECOND_COMMIT | sort | \
uniq | \
xargs -L 1 git checkout $SECOND_COMMIT -- ; \
git difftool -d $FIRST_COMMIT ; \
git stash && git stash drop ; \
git stash apply

这个单班轮的作用是什么:

  • 将本地未提交的更改添加到git stash
  • 检查FIRST_COMMIT
  • 处的代码状态
  • 会更新MERGE_COMMITSECOND_COMMIT处的所有文件以及它们之间的所有修订
  • 上一步骤中的每个文件都会重置为SECOND_COMMIT
  • 时的状态
  • 使用您为git配置的diff工具显示diff。差异将介于FIRST_COMMITSECOND_COMMIT之间,但对MERGE_COMMIT中另一个分支引入的其他文件的更改除外。前一句话表示如果在SECOND_COMMITMERGE_COMMIT中修改了某个文件,则所有更改都将出现在diff中。这很难避免。
  • 退出差异工具后,git将删除临时更改,并检查您正在处理的分支。
  • 之后,将应用来自git stash的更改。

根据您首选的git工作流程,您可能决定从上面的单个线路中删除git stash调用