git diff:显示分支名称而不是提交哈希


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会很有用。

是否有任何选项或设置可以执行此操作?

预先回答以下注意事项和答案:

  • "这破坏了差异的可重现性">
    • 无论如何,本地更改可能不会与其他人共享,因此如果分支是例如masterissue-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/filec77692b. 你要求的"代替",使用可变的引用名称而不是实际的 blob ID,将是一个非常糟糕的举动。

showcmd () { echo "$@"; "$@"; }

会得到你想要的,例如showcmd git diff master issue-1234 > myoutput

gitdiff() { echo git diff "$@"; git diff "$@"; }

然后gitdiff master issue-1234.