【问题标题】:How to determine which commit deleted a specific line in git?如何确定哪个提交删除了 git 中的特定行?
【发布时间】:2020-04-07 00:01:15
【问题描述】:

目前,基于this 问题,我能够提出以下命令:

git log -u -L 1626,1626:airflow/www/app.py 7399d6176181190a63b70eeec0f7012156c15332..HEAD

例如我正在寻找何时从气流/www/app.py 修改(删除)第 1626 行。行号在commit 7399d6有效,但在HEAD无效,导致如下错误:

fatal: file airflow/www/app.py has only 255 lines

(从那时起文件变得更短了。)

如果文件足够长,我想我不会有这个问题。我可以以某种方式关闭此检查吗?

【问题讨论】:

  • git rev-list 7399d6176181190a63b70eeec0f7012156c15332..HEAD | xargs -i sh -c 'git diff -r {}^..{} airflow/www/app.py | grep expose_config && echo {}' 为我工作,其中expose_config 是我正在寻找的行的一部分。尚不确定如何通过 grep 查找任何随机字符串并妥善处理所有内容。
  • 您可以尝试将git bisectgit grep 结合起来,以更快地找出行消失的时间:git bisect bad 没有行的提交,git bisect good 的提交确实,然后使用脚本检查是否存在该行作为您的 bisect 脚本 (git bisect run)。

标签: git


【解决方案1】:

git blame path/to/file git log 中的每个提交都可以解决问题。

如果您右键单击行号的左侧,许多现代 IDE 也有一个“注释”选项,它会以图形方式执行相同的操作。

What does git blame do?

【讨论】:

  • git rev-list 7399d6176181190a63b70eeec0f7012156c15332..HEAD | xargs -i git blame airflow/www/app.py -L 1626,1626 {} 2>/dev/null | uniq 似乎可以工作,但速度非常慢,因为在 7399d6 和 HEAD 之间有 6490 次提交。并且它没有注意到提交的行号增加了,但行本身仍然存在。我想我正在寻找更聪明的东西。
【解决方案2】:

git blame --reverse 可能帮助您追踪发生这种情况的位置。您可以尝试使用我为此任务开发的名为 difflame 的脚本:

https://github.com/eantoranz/difflame

【讨论】:

    【解决方案3】:

    试试这个无提交 ID

    git log -L <fromLine,toLine>:<file>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2023-03-21
      • 2019-02-10
      • 2021-02-24
      • 2021-10-21
      相关资源
      最近更新 更多