这让我疯了.
如何查找已删除的代码?
我最终找到了它的创建地点:
$ git log --pretty=oneline -S'some code'
Run Code Online (Sandbox Code Playgroud)
这还不错,但我也很想知道它被删除的地方,到目前为止,没有骰子.
首先,我尝试了git diff HEAD..HEAD^|grep 'some code'
,每次扩大范围,直到找到它被移除的线.尼斯,所以假设我发现它的范围HEAD^^..HEAD^^^
,然后我做的git show HEAD^^^
和git show HEAD^^
用grep
,但代码是无处可寻!
然后我读了一下git bisect
,果然,它给了我一个修正案,罪魁祸首应该是...再次,git show rev|grep 'some code'
空出来......
什么?我究竟做错了什么?
谢谢!
Pat*_*otz 49
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
或者,这不是你的意思吗?
Sim*_*one 33
git log -S<string>
做的工作,但如果您需要进行更复杂的搜索,您可以使用git log -G<regex>
.
来自man
:
-G<regex>
查找补丁文本包含匹配的添加/删除行的差异
<regex>
.
我找到了一种找到特定提交的方法,但它仅在这些提交之间进行比较时才会显示。我无法解释为什么 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
Run Code Online (Sandbox Code Playgroud)
一步步
我从dev.to 上的 miku86那里得到了这个想法。首先,我们尝试找到字符串存在的最后一次提交:
$ 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"
Run Code Online (Sandbox Code Playgroud)
结果ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b
是我们搜索到的提交。接下来,我们尝试查找此提交之后的提交,直到HEAD:
$ git rev-list ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b.. # | tail -n1 # Uncomment to only show the last one
[...]
c82d040f7be2f8955075655843400a36ceb75303
aa0568b543db57564770d73e736aaf50fd749fb4
dde61dae0cf648e7f4dd8a5c194bcf9be1745793
Run Code Online (Sandbox Code Playgroud)
这是dde61dae0cf648e7f4dd8a5c194bcf9be1745793
,因为这是我们要查找的列表中的最后一个。
那么这是否意味着dde61dae0cf648e7f4dd8a5c194bcf9be1745793
应该包含该删除?
$ git show dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # Remove grep to see the full diff
#<no output>
Run Code Online (Sandbox Code Playgroud)
不?!?那么,与我们第一个找到的提交有什么区别呢?
$ git diff ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793 | grep "127.0.124.1" # Remove grep to see the full diff
- return "127.0.124.1"
Run Code Online (Sandbox Code Playgroud)
在这里我们找到了它。这很奇怪。但是由于我们在提交之间使用差异,我是否犯了一个错误并且中间还有其他提交?
$ git log --pretty=oneline ba0b2d348f4e33857c96acf5a6231cf9d89ddb1b..dde61dae0cf648e7f4dd8a5c194bcf9be1745793
dde61dae0cf648e7f4dd8a5c194bcf9be1745793 network interface
Run Code Online (Sandbox Code Playgroud)
不,我们似乎没有犯错。这很奇怪。但是,是的,这就是我找到字符串消失的特定变化点的程度。
此外
我可以确认使用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
[...]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
18907 次 |
最近记录: |