git diff
是一个很好的协作工具,但有时将文字值传递到输出中使用的git diff A B
中,而不是引用 A 和 B 的哈希值可能会很有用。
请考虑以下git diff
输出:
$ git diff my-first-branch my-second-branch
diff --git a/file b/file
index c77692b..38ea2ea 100644
--- a/file
+++ b/file
@@ -1 +1,2 @@
Added this file
+Added this line
例如,可以选择显示my-first-branch..my-second-branch
而不是c77692b..38ea2ea
会很有用。
是否有任何选项或设置可以执行此操作?
预先回答以下注意事项和答案:
- "这破坏了差异的可重现性">
- 无论如何,本地更改可能不会与其他人共享,因此如果分支是例如
master
和issue-1234
- 无论如何,本地更改可能不会与其他人共享,因此如果分支是例如
- "引用名称不明确">
- 我不是在要求
git reflog
输出,而是要求文字命令行参数
- 我不是在要求
- "您可以使用
sed
单行来执行此操作">- 这会更改许多默认设置,包括禁用寻呼机、着色和各种其他选项,因为
stdout
不再是 tty。
- 这会更改许多默认设置,包括禁用寻呼机、着色和各种其他选项,因为
对于那些想要这样做的人,脚本可以处理:
#!/bin/bash
# prefix git diff with ref names
ref1=$1
ref2=$2
if [ -z $ref2 ]
then
ref1=$(git rev-parse --abbrev-ref HEAD)
ref2=$1
fi
git diff --src-prefix=${ref1}-- --dst-prefix=${ref2}-- $ref1..$ref2
那些不熟悉 shell 脚本的人可以把它放在 txt 文件上,命名为任何你想调用的命令(我的称为 gitd(。 然后使用以下命令使其可执行:chmod +x 接下来把它放在你的 PATH 变量中的一个目录中,我使用 ~/bin 最后,当您想使用分支/提交/任何用途运行 diff 时gitd <whatever> [whatever]
. 请注意您选择分支/提交/其他任何内容的第一个<whatever>
。 第二个输入[whatever]
是可选的,导致第一个参数差异为 HEAD,第二个参数为 。
这些 id 用于要区分的 blob,其名称在上面给出(在下面的输出中带有文本差异(,例如a/file
c77692b
. 你要求的"代替",使用可变的引用名称而不是实际的 blob ID,将是一个非常糟糕的举动。
showcmd () { echo "$@"; "$@"; }
会得到你想要的,例如showcmd git diff master issue-1234 > myoutput
或
gitdiff() { echo git diff "$@"; git diff "$@"; }
然后gitdiff master issue-1234
.