2 次 git 提交之间的差异,但包含在第 3 次提交中

Posted

技术标签:

【中文标题】2 次 git 提交之间的差异,但包含在第 3 次提交中【英文标题】:Diff between 2 git commits except contained in 3rd commit 【发布时间】:2018-02-28 00:46:06 【问题描述】:

有没有办法让meld + git 显示在 2 次 git 提交之间发生的更改,但排除在第 3 次提交中引入的更改?用例是查看当前提交与 3 路合并之前完成的某些提交有多少不同。

【问题讨论】:

【参考方案1】:

我有办法做到这一点。

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

下面的代码显示了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 配置的差异工具显示差异。差异将在FIRST_COMMITSECOND_COMMIT 之间,但MERGE_COMMIT 中另一个分支引入的其他文件的更改除外。上一句的意思是,如果某个文件在SECOND_COMMITMERGE_COMMIT 中都被修改了,那么所有的变化都会出现在 diff 中。这很难避免。 退出差异工具后,git 将删除临时更改,并检查您一直在处理的分支。 之后,将应用来自 git stash 的更改。

根据您喜欢的 git 工作流程,您可以决定从上面的单个 liner 中删除 git stash 调用

【讨论】:

以上是关于2 次 git 提交之间的差异,但包含在第 3 次提交中的主要内容,如果未能解决你的问题,请参考以下文章

Git:显示两次提交之间的总文件大小差异?

git更新代码

git stash `没有本地更改`,但 git status `提前 3 次提交`

我可以通过 GH API 在两次提交之间获取一个文件的差异数据吗?

git导出有差异的文件列表

git:显示两次提交之间所有更改的文件