问题 每次提交时都会使用Git diff工具吗?


我想跑 git difftool HEAD~3.. path/to/file 并让git为这三个提交中的每个提交打开difftool,以便我可以看到每个提交的并排视图。

我怎样才能获得git-difftool来做到这一点?


9655
2017-07-26 16:04


起源



答案:


这将完成你描述的内容:

git difftool HEAD~3 HEAD~2 path/to/file
git difftool HEAD~2 HEAD~1 path/to/file
git difftool HEAD~1 HEAD path/to/file

想要自动化这个过程吗?这总是三次提交吗?你想要一个三方合并吗?

更新:

如果答案是肯定的 - 是 - 否,解决方案将是:

for i in {3..1}; do
  git difftool HEAD~$i HEAD~$((i-1)) path/to/file
done

更新:

如果答案是肯定的 - 不是,那基本上就是@ruffin所要求的 这里。看那里的答案。


4
2017-07-30 17:39





或者你可以跑 git log -p  - 它与您想要的几乎完全相同


7
2017-07-30 17:42



不完全是,我相信。据我所知,并排差异是理想的结果。 - shytikov
这是我通常做的以获得类似的结果。我的 第一 回答是专门用于并排比较的。 - Antony Hatchkins


答案:


这将完成你描述的内容:

git difftool HEAD~3 HEAD~2 path/to/file
git difftool HEAD~2 HEAD~1 path/to/file
git difftool HEAD~1 HEAD path/to/file

想要自动化这个过程吗?这总是三次提交吗?你想要一个三方合并吗?

更新:

如果答案是肯定的 - 是 - 否,解决方案将是:

for i in {3..1}; do
  git difftool HEAD~$i HEAD~$((i-1)) path/to/file
done

更新:

如果答案是肯定的 - 不是,那基本上就是@ruffin所要求的 这里。看那里的答案。


4
2017-07-30 17:39





或者你可以跑 git log -p  - 它与您想要的几乎完全相同


7
2017-07-30 17:42



不完全是,我相信。据我所知,并排差异是理想的结果。 - shytikov
这是我通常做的以获得类似的结果。我的 第一 回答是专门用于并排比较的。 - Antony Hatchkins


更新:

Matthieu Moy提出了更好的变体:

for rev in $(git rev-list <committish>.. ); do
    git difftool ${rev} ${rev}~1;
    done

OLD版的答案:

我会说你做的事情如下:

git rev-list <commitish>.. | wc -l

要么

git log --oneline <commitish>.. | wc -l

这将计算您之间的修订数量 <commitish> 和HEAD。

然后使用此数字,您可以自动运行提交以查看差异

c=`git log --online <commitish>.. | wc -l`

while ! ${c} eq 0 ; do

git difftool HEAD~${c} HEAD~${($c-1)}
c=${c}-1
done

1
2017-08-03 17:07



我会把它作为答案,因为它是第一个并且有它的要点,但它有点复杂。我担心,如果我标记出来,那些来到这里的人就不会“得到”这个答案。抱歉 - Dale Forester
我会说这是最后一次比第一次更多。 - Antony Hatchkins
为什么要数 wc -l 然后迭代 HEAD~number 什么时候你可以直接迭代修订版 for rev in $(git rev-list ...)?如果之间的历史记录,您的版本将无效 commitish 和 HEAD 合并: commitish 可 HEAD~n 同 commitish..HEAD 含有超过 n 承诺... - Matthieu Moy
@MatthieuMoy - 你是对的。当我写这篇文章的时候,我可能不知道忘记了对rev-list进行迭代的能力。纠正答案。 - Eugene Sajine


for i in 1 2 3
do
  ((j=${i}-1))
  git difftool HEAD~${i}..HEAD~${j} path/to/file &
done

0
2017-07-30 17:41



这条线 git difftool HEAD~${i}.. path/to/file & 有两个错误:(1)标准输入不是tty(2)不显示提交,而是显示先前状态和当前状态之间的差异。请参阅我的答案以获得修复。 - Antony Hatchkins
@AntonyHatchkins纠正了#2,但我不确定我是否看到你对#1的说法 - 这对我有用,但也许这取决于你拥有的是什么 diff.tool 设置 (meld 在我的配置中)。 - twalberg
好吧,我检查了textmode(emerge, vimdiff)。 - Antony Hatchkins


略有不同的方法:

1)执行交互式rebase

git rebase -i <commitish>

2)标记所有提交以进行编辑

3)对于每次提交运行

git difftool HEAD~1

4)转到下一个提交并重复步骤3

git rebase --continue

另外一个好处是,如果您在审核中发现问题,则表示您已经检出了要修复的提交。


0
2018-05-14 08:12