【问题标题】:Git diff tool on every commit?每次提交都使用 Git diff 工具?
【发布时间】:2012-07-26 16:04:50
【问题描述】:

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

我将如何让 git-difftool 做到这一点?

【问题讨论】:

    标签: git diff git-diff difftool


    【解决方案1】:

    或者你可以直接运行git log -p - 它做的事情和你想要的差不多

    【讨论】:

    • 不完全是,我相信。据我所知,并排差异是理想的结果。
    • 这是我通常会做的,以获得类似的结果。我的first 答案专门用于并排比较。
    【解决方案2】:

    这将完成您所描述的:

    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 的问题。在那里查看我的答案。

    【讨论】:

      【解决方案3】:

      更新:

      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
      

      这将计算您的 &lt;commitish&gt; 和 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 进行迭代?如果 commitishHEAD 之间的历史记录合并,则您的版本不起作用:commitish 可以是 HEAD~ncommitish..HEAD 包含超过 n 提交...
      • @MatthieuMoy - 你是对的。在我写这篇文章的时候,我可能还不知道忘记了迭代 rev-list 的能力。更正答案。
      【解决方案4】:
      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 &amp; 行有两个错误:(1) 标准输入不是 tty (2) 不显示提交,而是显示先前状态和当前状态之间的差异。请参阅我的答案以获取修复。
      • @AntonyHatchkins 已更正 #2,但我不确定我是否明白您对 #1 的看法 - 这对我有用,但可能取决于您的 diff.tool 设置到(meld 在我的配置中)。
      • 好吧,我在文本模式中检查了(emergevimdiff)。
      【解决方案5】:

      稍微不同的方法:

      1) 执行交互式变基

      git rebase -i <commitish>
      

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

      3) 对于每次提交运行

      git difftool HEAD~1
      

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

      git rebase --continue
      

      额外的好处是,如果您在审阅中发现问题,则表明您已经签出了要修复的提交。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多