【问题标题】:Who deleted my change in git?谁删除了我在 git 中的更改?
【发布时间】:2011-08-31 20:27:53
【问题描述】:

这是我过去 30 分钟的问题:我的一个文件中有几个更改消失了,我不知道什么时候发生的。我想知道是谁干的!

我开始寻找包含我的文件的修订:

git grep <searched_string> $(git rev-list --all) -- <file>

是文件的路径或通配符,如 *.gsp

我得到了一堆修订,我查看了最后一个,并尝试获取它的孩子(认为第一个孩子应该是我的更改消失的第一个修订)

git rev-list --children <revision_id>

是上一条命令最后一行开头的 40 个字符

越来越近了!我正在查看输出的开头,并取第一个孩子然后运行

git log <revision_id_s_first_child> --stat

然后我查看输出并找到我的文件以及谁做了更改! (原来是我的错……)

有没有办法更快地做到这一点(git blame 不会显示已删除的内容)?

【问题讨论】:

标签: git revision


【解决方案1】:

git blame 有一个--reverse 选项,它接受一系列提交,并显示在删除之前一行存在的最后一次提交。因此,您找到了一个您知道行在那里的提交,例如abcdef01,并显示删除之前的最后一次提交,请执行以下操作:

git blame --reverse abcdef01..HEAD -- <file>

【讨论】:

  • 可惜git gui blame不支持--reverse
  • 这里告诉我什么 - 9597c8db (XYZ 2014-05-27 10:18:51 -0700 93) 8e4dbc16 (XYZ 2014-05-06 19:08:29 +0100 94) 1b4dbc16 (XYZ 2014-05-06 19:08:29 +0100 95) -700 和 +100 是什么意思?
  • 这些是时区偏移量。 -0700 可能是美国西部,比格林威治标准时间晚 7 小时。 +0100 可能是欧洲,比格林威治标准时间早 1 小时。
  • 确实 --reverse 显示“行被删除之前存在的最后一次提交”。不过,该提交可能与正在考虑的文件无关。实际上删除该行的是下一个提交:请参阅stackoverflow.com/a/9870218/2097 以找到下一个提交。有谁知道是否可以让git blame --reverse 显示每一行的相关提交,而不是默认显示的不相关提交?
【解决方案2】:

如果您知道某些子字符串将在被删除的行中,那么您可以使用git log-G 选项来查找引入更改的提交,该更改添加或删除了包含该子字符串的行。例如如果你知道“大流行”这个词在消失的那一行,你可以这样做:

git log -Gpandemic -p

-G 的参数可以是正则表达式。)这个选项是最近才添加到 git 中的 - 如果它不起作用,请尝试使用 -S,它的语义略有不同,但应该有类似的效果。

【讨论】:

  • -G 似乎对我不起作用。 -S 会在添加时显示给我,而不是在删除时显示
  • -S 应该会在添加时向您显示(请参阅man page)。但是,-S 这样做有点奇怪 - 它查看提交之前的版本和提交中字符串的出现次数 - 所以如果你只是 moved 一行,例如,不会被检测到。这就是为什么 -G 通常更可取的原因,但这仅在 git 版本 1.7.4 中引入。
  • 我们得到了 1.7.3.4。无论如何感谢您的反馈,绝对有趣。仍然看不到我的更改何时被 -S 删除,尽管我搜索的字符串根本不存在于下一个修订版中。
  • 您可能需要-c-cc 来显示合并期间的删除(冲突)。见this answer
【解决方案3】:

请注意,自 Git 2.11(2016 年第四季度)以来,如果您想查看特定提交和 当前 提交之间的提交,则无需指定 ..HEAD

所以Karl Bielefeldtanswer 将是:

 git blame --reverse abcdef01 -- <file>

参见Junio C Hamano (gitster)commit d993ce1(2016 年 6 月 14 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 1172e16,2016 年 10 月 10 日)

责备:dwim "blame --reverse OLD" as "blame --reverse OLD.."

说“git blame --reverse OLD path”是一个常见的错误,认为命令行会变小,就好像在询问旧版本 OLD 中的路径中的行是如何存活到当前提交的。

我们可以将“OLD”(可能是拼写错误的“OLD..”)作为在当前提交处结束的范围,而不是总是要求范围的两端。

git blame --reverse 现在包括:

--reverse <rev>..<rev>:

向前而不是向后走历史。
这不是显示出现行的版本,而是显示存在行的最后一个版本。
这需要像START..END 这样的一系列修订,其中指责的路径存在于START
为方便起见,git blame --reverse START 被视为git blame --reverse START..HEAD

(注解:"dwim" is an acronym for "Do What I Mean" (not what I say)

【讨论】:

  • @KasunSiyambalapitiya 还不确定:您可以就此提出一个新问题。
【解决方案4】:

git blame --reverse 可以让您接近删除该行的位置。但它实际上并不指向该行被删除的版本。它指向该行存在最新修订版。那么如果后续修订普通提交,那么你很幸运,你得到了删除修订。 OTOH,如果以下修订是合并提交,那么事情可能会变得有点疯狂。作为创建 difflame 工作的一部分,我解决了这个问题,所以如果你已经在你的盒子上安装了 python 并且你愿意尝试一下,那么不要再等了,让我来知道怎么回事。

https://github.com/eantoranz/difflame

【讨论】:

    猜你喜欢
    • 2013-09-09
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 2011-09-02
    • 2013-06-23
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多