每次提交都使用Git差异工具?

13
我想运行git difftool HEAD~3.. path/to/file命令,让git为这三个提交打开difftool工具,以便我可以查看每个提交的并排视图。
如何才能让git-difftool实现这个功能?
5个回答

11

或者你可以直接运行git log -p - 它几乎可以做到你想要的相同的事情。


并不完全是这样,我认为。就我所了解的情况来看,我们期望的结果是并排显示的差异。 - shytikov
这是我通常做的来获得类似的结果。我的第一个答案专门用于完全的并列比较。 - Antony Hatchkins

7
这将实现您所描述的内容:
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在这里所问的内容。请查看我在那里的回答。


1

更新:

Matthieu Moy提出了更好的变体:

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

旧版答案:

我会建议你这样做:

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

我会把这个作为答案,因为它是第一个并且已经掌握了要点,但它有点复杂。我担心其他人来了解时不会“理解”这个答案,如果我标记它的话。抱歉。 - Dale Forester
我认为这更多是最后一个,而不是第一个。 - Antony Hatchkins
为什么要用wc -l计数,然后再用HEAD~number迭代,当你可以直接用for rev in $(git rev-list ...)在修订版本上进行迭代呢?如果commitishHEAD之间的历史有合并,你的方法就不起作用了:commitish可以是HEAD~n,而commitish..HEAD可能包含超过n个提交... - Matthieu Moy
@MatthieuMoy - 你说得对。当我写这篇文章的时候,可能不知道或忘记了可以迭代rev-list的能力。正在更正答案。 - Eugene Sajine

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

这行代码 git difftool HEAD~${i}.. path/to/file & 存在两个错误:(1) 标准输入不是 tty (2) 不显示提交记录,而是显示先前状态和当前状态之间的差异。请查看我的答案以获取修复方法。 - Antony Hatchkins
@AntonyHatchkins 已经修正了问题#2,但是我不确定你在问题#1中的意思 - 这对我来说是有效的,但也许这取决于你将diff.tool设置为什么(在我的配置中是meld)。 - twalberg
好的,我在文本模式下进行了检查(使用emergevimdiff)。 - Antony Hatchkins

0
一个稍微不同的方法:
1)执行交互式变基
git rebase -i <commitish>

2) 标记所有需要编辑的提交

3) 对于每个提交运行

git difftool HEAD~1

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

git rebase --continue

另一个优点是,如果您在审核中发现问题,您已经检查过要修复的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接