查找差异最小的提交

  • 本文关键字:提交 查找 git
  • 更新时间 :
  • 英文 :


我收到了一堆来自我使用的同一个 git 存储库的文件,但它们是针对较旧的提交开发的。如何找出他们使用了哪个提交?类似于差异的最少行。

如何找出他们使用了哪个提交?类似于差异的最少行。

好吧,你可以做到这一点:找到与目标目录差异最小的提交。 只需对存储库中的所有提交运行循环,并针对每个提交计算针对目标目录的差异,并记住差异最小的目录。

假设您的存储库在./repo中,有问题的文件在./target中。

#!/bin/sh
cd repo
HEAD=$(git rev-parse HEAD)
git log --pretty='%H' | while read rev; do
    git checkout -q $rev
    lines=$(diff -ruN -x .git . ../target | wc -l)
    if ! [[ "$minlines" ]] || [[ $lines -lt $minlines ]]; then
        minlines=$lines
        commit=$rev
        echo "$lines $rev"
    fi
    [[ $lines -eq 0 ]] && break
done | tail -1
git checkout $HEAD

对于具有悠久历史的存储库,这将需要一段时间,但它是有效的。 它将打印出差异的大小,后跟具有最小差异的提交的提交 ID。

如果在运行此脚本时中断此脚本,则需要签出适当的分支头(例如,git checkout master )。

接受的

答案和几乎所有的评论都只是迂腐的,没有抓住重点。

面临着与 OP 相同的问题,经过一些反复试验,我发现以下单行帮助我快速缩小了可疑的基本提交范围,目视检查后,该提交非常清楚地在"一个"的 2 或 3 次提交范围内。

然后,您可以通过推理更改的逻辑顺序和目的来确定正确的基本提交。

首先,将传入的代码提交到一个新分支中(即确保 HEAD 具有要比较的代码),然后运行:

for hash in $(git log --pretty=format:%H); do echo "$hash: $(git diff HEAD..$hash --stat | wc -l)"; done

这将输出两列:哈希和相对于 HEAD 更改的行数。

选择行数最小的提交,检查它之前和之后的差异,一旦找到看起来正确的那个,使用git reset --soft将新分支的HEAD移动到那里,然后用类似的东西包裹它

git commit -m"retroactively creating new branch for files received via email"

最新更新