Git:找到已删除的代码

时间:2009-10-06 22:53:52

标签: git

这让我疯了。

如何查找已删除的代码?

我最终找到了它的创建地点:

$ git log --pretty=oneline -S'some code'

这还不错,但我也很想知道它被删除的地方,到目前为止,没有骰子。

首先,我尝试git diff HEAD..HEAD^|grep 'some code',每次扩展范围,直到找到删除它的行。很好,所以假设我在范围HEAD^^..HEAD^^^上找到它,然后我git show HEAD^^^git show HEAD^^ grep,但代码无处可寻!

然后我在git bisect上读了一下,果然,它给了我一个修正案,罪魁祸首应该是......再次,git show rev|grep 'some code'空出来...... < / p>

什么?我做错了什么?

谢谢!

3 个答案:

答案 0 :(得分:45)

Hmph,适合我:

$ git init
Initialized empty Git repository in /Users/pknotz/foo/.git/

$ echo "Hello" > a

$ git add a

$ git commit -am "initial commit"
[master (root-commit) 7e52a51] initial commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 a

$ echo " World" >> a

$ git commit -am "Be more specific"
[master 080e9fe] Be more specific
 1 files changed, 1 insertions(+), 0 deletions(-)

$ echo "Hello" > a

$ git commit -am "Be less specific"
[master 00f3fd0] Be less specific
 1 files changed, 0 insertions(+), 1 deletions(-)

$ cat a
Hello

$ git log -SWorld
commit 00f3fd0134d0d54aafbb9d959666efc5fd492b4f
Author: Pat Notz <patnotz@gmail.com>
Date:   Tue Oct 6 17:20:48 2009 -0600

    Be less specific

commit 080e9fe84ff89aab9d9d51fb5d8d59e8f663ee7f
Author: Pat Notz <patnotz@gmail.com>
Date:   Tue Oct 6 17:20:33 2009 -0600

    Be more specific

或者,这不是你的意思吗?

答案 1 :(得分:26)

git log -S<string>完成这项工作,但如果您需要进行更复杂的搜索,可以使用git log -G<regex>

来自man

  

-G<regex>

     

查找补丁文本包含添加/删除行的差异   匹配<regex>

答案 2 :(得分:1)

自己开车疯时发现了您的问题,到目前为止,没有答案是足够的。我已经找到一种查找特定提交的方法,但是只有在这些提交之间进行区分时才会显示该方法。我无法解释为什么git会那样工作,但是我将详细说明我的发现:


问题解释

使用'-S'或'-G',我们可以仅找到它的添加位置,而不是将其删除。详细说明:

$ git log --format="%H" -S"127.0.124.1"
857aa361293abbb351d6d6becaa55ec011aebc93
$ git show 857aa361293abbb351d6d6becaa55ec011aebc93 | grep "127.0.124.1" # remove grep to see full diff
+       return "127.0.124.1", nil

逐步

我从reference那里得到了这个主意。首先,我们尝试找到存在我们字符串的最后一个提交:

$ git --no-pager grep "127.0.124.1" $(git rev-list --all) # | head -n1 | cut -d: -f1 # uncomment to only show the hash of the first one
ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b:some/file.go:        return "127.0.124.1"
0d19a98d6434da0b4b5cc2bac190b9b1de36d992:some/file.go:        return "127.0.124.1"
84274c5712bacbbee1dca5567cef77a2b6f356d2:some/file.go:        return "127.0.124.1"
42e692643ff8a5dce7a89e985062b3d38c60fcc0:some/file.go:        return "127.0.124.1"

ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b中的哪个结果是我们搜索到的提交。接下来,我们尝试找到此提交之后直到HEAD的提交:

$ git rev-list ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b.. # | tail -n1 # uncomment to only show the last one
[...]
c82d040f7be2f8955075655843400a36ceb75303
aa0568b543db57564770d73e736aaf50fd749fb4
dde61dae0cf648e7f4dd8a5c194bcf9be1745793

哪个是dde61dae0cf648e7f4dd8a5c194bcf9be1745793,因为这是我们要查找的列表中的最后一个。

所以这意味着dde61dae0cf648e7f4dd8a5c194bcf9be1745793应该包含该删除内容?

$ git show dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # remove grep to see full diff
#<no output>

不?!?那么从那到我们第一次发现的提交有什么区别?

$ git diff ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # remove grep to see full diff
-       return "127.0.124.1"

在这里我们找到了它。太奇怪了。但是由于我们在提交之间使用了差异,我是否犯了一个错误,并且之间还有其他提交?

$ git log --pretty=oneline ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793
dde61dae0cf648e7f4dd8a5c194bcf9be1745793 network interface

不,我们似乎没有犯错。太奇怪了。但是,是的,那是我找到弦消失的特定变化点的距离。


另外

我可以使用git bisect确认dde61dae0cf648e7f4dd8a5c194bcf9be1745793是我正在寻找的提交。

# bisecting a while...
$ git bisect bad 
dde61dae0cf648e7f4dd8a5c194bcf9be1745793 is the first bad commit
commit dde61dae0cf648e7f4dd8a5c194bcf9be1745793
Author: ...
Date:   Fri Oct 18 11:04:26 2019 +0200

    network interface

:100644 100644 242e81c363c2c7069efb018821821553b98f2c97 416c27f5351a9d92a6914b34846c6de51d83dd0d M      go.mod
:040000 040000 715c3ab5b3f4579d8054618f1e11fc05fb425324 e6731408a1ac1ff0428128ccbb1fbfaad4c789ab M      network
[...]