从 git diff 中找出更改的行号

ano*_*sAI 2 git git-diff line-numbers

我需要知道两次提交 ( HEAD~1 and HEAD) 到存储库之间更改的行号

git diff HEAD~1 HEAD
Run Code Online (Sandbox Code Playgroud)

以令人困惑的 diff 格式返回信息

我能够通过查看 git diff 中的标记来识别新添加的文件或删除的文件(即--- /dev/null意思+++/dev/null是添加、删除)

是否可以识别修改后的文件中的行号

我的需要是

path/to/file/MyClass1.java
23-56
59-60
72-74

path/to/file/MyClass2.java
1-34
54-56
Run Code Online (Sandbox Code Playgroud)

23-56 、 72-74 和 59-60 是 HEAD~1 和 HEAD 之间更改的行/行范围(表示为行号)

PS:我在其他问题上发现的一些线索似乎已经过时了任何帮助将不胜感激!

Sau*_*ari 5

HEAD~1这应该给出两个修订版之间修改文件的差异HEAD

git diff --unified=0 --diff-filter=M HEAD~1 HEAD 
Run Code Online (Sandbox Code Playgroud)

使用grep实用程序,可以从输出中删除修改的行和索引

git diff --unified=0 --diff-filter=M HEAD~1 HEAD  | grep -v -e '^[+-]' -e '^index'
Run Code Online (Sandbox Code Playgroud)

输出 :

diff --git a/some/file b/some/file
@@ -startline1,count1 +startline2,count2 @@
...
Run Code Online (Sandbox Code Playgroud)

使用实用程序进一步处理时sed,最终命令是:

git diff --unified=0 --diff-filter=M HEAD~1 HEAD | \
grep -v -e '^[+-]' -e '^index' | \
sed 's/diff --git a.* b\//\//g; s/.*@@\(.*\)@@.*/\1/g; s/^ -//g; s/,[0-9]*//g; s/\(^[0-9]*\) +/\1-/g;'
Run Code Online (Sandbox Code Playgroud)

输出应该是这样的

/some/file1
startline1-startline2
/some/file2
startline3-startline4
...
Run Code Online (Sandbox Code Playgroud)

  • @anon-sAI 更安全的替代方案,因为它不涉及后处理:https://unix.stackexchange.com/a/582649/408757 (2认同)