【发布时间】:2012-07-26 16:04:50
【问题描述】:
我想运行 git difftool HEAD~3.. path/to/file 并让 git 为这三个提交中的每一个打开 difftool,以便我可以查看每个提交的并排视图。
我将如何让 git-difftool 做到这一点?
【问题讨论】:
标签: git diff git-diff difftool
我想运行 git difftool HEAD~3.. path/to/file 并让 git 为这三个提交中的每一个打开 difftool,以便我可以查看每个提交的并排视图。
我将如何让 git-difftool 做到这一点?
【问题讨论】:
标签: git diff git-diff difftool
或者你可以直接运行git log -p - 它做的事情和你想要的差不多
【讨论】:
这将完成您所描述的:
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 问here 的问题。在那里查看我的答案。
【讨论】:
更新:
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
【讨论】:
for rev in $(git rev-list ...) 直接迭代修订时,为什么要使用 wc -l 进行计数,然后使用 HEAD~number 进行迭代?如果 commitish 和 HEAD 之间的历史记录合并,则您的版本不起作用:commitish 可以是 HEAD~n 和 commitish..HEAD 包含超过 n 提交...
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) 不显示提交,而是显示先前状态和当前状态之间的差异。请参阅我的答案以获取修复。
diff.tool 设置到(meld 在我的配置中)。
emerge,vimdiff)。
稍微不同的方法:
1) 执行交互式变基
git rebase -i <commitish>
2) 标记所有提交以进行编辑
3) 对于每次提交运行
git difftool HEAD~1
4) 转到下一个提交并重复步骤 3
git rebase --continue
额外的好处是,如果您在审阅中发现问题,则表明您已经签出了要修复的提交。
【讨论】: