我想比较一个git存储库中的两个文件,并告诉我们之前引入哪个文件(通过祖先,而不是时间戳)。执行此操作的简单方法是查找引入文件(rev-list HEAD -- <filename> | tail -n 1
)的各个提交,并查询它们之间是否存在提交(rev-list commit1 ^commit2
)。然而,这是缓慢和愚蠢的。在找到包含一个文件但不包含另一个文件的树之前,将历史记录一分为二?
答案 0 :(得分:1)
除非在相同的线性分支中引入的文件(即,在另一个的祖先中的一个),否则无法知道。假设您在回购中介绍文件A,并在我的介绍文件B.如果以后我从您的回购中克隆,则无法知道哪个首先出现。当然,我们可以同步时钟,但这不是git。 git的“时间”唯一概念是祖先关系,其他概念则无法比较。
答案 1 :(得分:0)
根据我的理解你所追求的,这可能是你正在寻找的东西:
git log --topo-order --reverse --oneline --name-only --pretty=format:"%Cgreen%ci %Cblue%cr %Cred%cn %Cgreen%h %Creset" <file1> <file2> | head -n10
- TOPO-顺序
在显示所有子项之前不显示父项,并避免在多行历史记录中混合显示提交。- 倒车
以相反的顺序输出提交。
请参阅:git-log了解更多选项和可能的组合。
答案 2 :(得分:0)
使用diff-filter = A
git log --reverse --format=%H --name-status --diff-filter=A -- file1 file2 | grep ^A | cut -f2
对于任意数量的文件,您将在一次遍历中获得所需的排序。