Git 在合并冲突期间运行diff时,是否有方法查看文件中更改的时间戳?

Git 在合并冲突期间运行diff时,是否有方法查看文件中更改的时间戳?,git,command-line,command-line-arguments,Git,Command Line,Command Line Arguments,有时,我会发现自己处于这样一种情况:在解决合并冲突时,我需要知道何时(如日期和时间)对冲突文件进行了特定更改,以便我可以决定是要接管一个文件还是编辑该文件 在这些情况下,我对各自分支中的相关文件使用git,并获取我感兴趣的特定更改的日期和时间。这很好,但是我觉得应该有一个更简单的方法来做到这一点 有没有人有更好的方法来实现这一点的建议?我查看了git的documentation,但没有找到任何能让这个过程更简单的方法。不必在git中我很乐意找到替代方法/工具..等等不。没有。因为提交不保存更改,

有时,我会发现自己处于这样一种情况:在解决合并冲突时,我需要知道何时(如日期和时间)对冲突文件进行了特定更改,以便我可以决定是要接管一个文件还是编辑该文件

在这些情况下,我对各自分支中的相关文件使用
git
,并获取我感兴趣的特定更改的日期和时间。这很好,但是我觉得应该有一个更简单的方法来做到这一点


有没有人有更好的方法来实现这一点的建议?我查看了git的
documentation,但没有找到任何能让这个过程更简单的方法。不必在
git中
我很乐意找到替代方法/工具..等等

不。没有。因为提交不保存更改,它们保存快照。合并操作只查看三个快照:合并基本提交和两个分支提示提交

我可以通过对各自分支中的文件运行
git
来解决这个问题

至少在Git中,这是一个根本不同的操作。
git-dull
(或
git-annotate
)命令一次向后(通常)遍历一个提交图,比较每个父提交对和子提交对中的一些文件和行。这将在链中定位一个特定的早期提交,其中出现在链中最后一次提交中的特定行仍然出现在该早期提交中。实际上,在开始提交的每个源代码行中,责备都会执行一次,即最新的提交;也许你会称之为结束,而不是开始,但优化,使它走得快

让我们把它画成一个具体(但简单)的例子-
git-burn
处理更复杂的情况,包括分支和合并子图,但我们在构建示例时将忽略这些。假设我们有以下情况:

          I--J   <-- branch1 (HEAD)
         /
...--G--H
         \
          K--L   <-- branch2
Git现在将尝试合并这两组更改。如果文件F出现在所有三个提交中,
H
J
L
,但在所有三个提交中都不同,则两个单独的差异输出将在两个差异中对F进行一些更改。这些更改需要合并为一个更改,该更改可以应用于commit
H
中出现的F的副本

当这些更改重叠(接触
H
中F的同一行)或邻接(任何一方的更改的结尾恰好位于另一方不同更改的开始的边缘,同样指
H
中F的副本),这就是合并冲突

我想你想要的是一个工具,它将,考虑到我们知道
H
-vs-
J
H
-vs-
L
都会“触摸”F中的一些行,运行
git dull-L H^@..J
git dull-L H^@..L
,以获得适当的行范围(基于分别在
J
L
中修改的
H
中F的副本)。如果
J
L
H
中出现这些行的点上方添加或删除了行,则这两个
表达式可能不同

这两个
git-gun
将检查提交
J
,然后检查
I
,然后检查
H
(对于第一种情况)和
L
,然后检查
K
,然后检查
H
(对于第二种情况)。这些检查非常对称,因此在考虑问题时,我们可以只看一个“面”。我们将重复该操作,但可能会使用不同的行号,如上文所述。由于存在合并冲突,我们知道相关行在
H
-vs-
J
中确实发生了更改。因此,它们:

  • H
    -vs-
    I
    中更改,而不是在
    I
    -vs-
    J
    中更改,或
  • H
    -vs-
    I
    中未发生变化,但在
    I
    -vs-
    J
    中发生变化,或
  • H
    -vs-
    I
    I
    -vs-
    J
因此,
git-dull
将为范围内的每一行分配commit
I
或commit
J

提交
I
J
的时间戳并不是这里真正感兴趣的项目。相反,提交哈希很有趣:它们识别哪些提交促成了更改

最大的复杂性是,对于范围中的每一行,贡献可能来自不同的提交。由于
git merge
只查看
H
-vs-
J
,可能有两行更改:

-first
-second
+1st
+2nd
实际上是一行更改,在
I
中将“first”替换为“1st”,然后在
J
中将“second”替换为“2nd”

当合并中的提交范围较大时,如:

          A--B--C--D--...--Y--Z   <-- branch1 (HEAD)
         /
...--o--*
         \
          o--...--o   <-- branch2

A--B--C--D--Y--Z否。没有一个快照,因为提交不保存更改,它们保存快照。合并操作只查看三个快照:合并基本提交和两个分支提示提交

我可以通过对各自分支中的文件运行
git
来解决这个问题

至少在Git中,这是一个根本不同的操作。
Git-dull
(或
Git-annotate
)命令一次一个提交,向后(通常)遍历图形,比较每个父级和子级提交对中的一些文件和行。这将定位链中特定的早期提交,其中出现在链中最后一次提交中的特定行仍然出现在该早期提交中。实际上,责备会对开始提交中的每个源行执行一次。好的,最近一次提交;可能是你会称之为结束,而不是开始,但经过优化使之成为g
          A--B--C--D--...--Y--Z   <-- branch1 (HEAD)
         /
...--o--*
         \
          o--...--o   <-- branch2