如何组合 `git diff --name-status` 和 `git diff --stat` 命令的输出?

She*_*rsh 5 git shell diff

使用git diff --name-status命令我可以看到文件名称和文件状态,如下所示:

M       .bashrc
D       .ghc/.ghci.conf.un~
D       .ghc/ghci_history
M       .life
A       .profile
M       .spacemacs
Run Code Online (Sandbox Code Playgroud)

git diff --stat可以看到行数和文件更改的统计信息:

 .bashrc             |   3 ++-
 .ghc/.ghci.conf.un~ | Bin 13912 -> 0 bytes
 .ghc/ghci_history   | 100 --------------------------------------------------------------------------------------------
 .life               |   2 ++
 .profile            |  23 +++++++++++++++++++++
 .spacemacs          |   3 +++
Run Code Online (Sandbox Code Playgroud)

有什么方法可以组合两个命令的输出吗?我想要这样的东西:

M  .bashrc             |   3 ++-
D  .ghc/.ghci.conf.un~ | Bin 13912 -> 0 bytes
D  .ghc/ghci_history   | 100 --------------------------------------------------------------------------------------------
M  .life               |   2 ++
A  .profile            |  23 +++++++++++++++++++++
M  .spacemacs          |   3 +++
Run Code Online (Sandbox Code Playgroud)

当然,我可以通过字符串调用两个命令然后操作字符串来手动完成此操作。但我不确定这些命令的输出有多可靠和一致。也许它已记录在某处。您能否提供一个 shell 命令,让我可以从终端查看此类差异?

drz*_*raf 5

DIFF=origin/master..HEAD
join -t $'\t' -1 2 -2 1 -o 1.1,2.1,2.2 \
        <(git diff --name-status $DIFF | sort -k2)
        <(git diff --stat=$((COLUMNS-4)),800 $DIFF | sed -e '$d' -e 's/^ *//;s/ /\t/' | sort) \
        | sed 's/\t/ /g'
Run Code Online (Sandbox Code Playgroud)

或者,完全 POSIX[alias]的一部分~/.gitconfig

ndiff = "!f() { TAB=`printf '\t'`; COLUMNS=`stty size|cut -d' ' -f2`; cd $GIT_PREFIX; git diff --name-status $1 | sort -k2 > /tmp/.tmpgitndiff ; git diff --stat=$COLUMNS,800 $1 |sed -e '$d' -e \"s/^ *//;s/ /${TAB}/\" | sort | join -t \"${TAB}\" -1 2 -2 1 -o 1.1,2.1,2.2 /tmp/.tmpgitndiff - | sed \"s/${TAB}/ /g\"; rm -f /tmp/.tmpgitndiff; }; f"
Run Code Online (Sandbox Code Playgroud)
$ git ndiff origin/master..HEAD -- dev/ # example
M dev/main.scss   |   9 +
A dev/rs.js       |  19 ++
Run Code Online (Sandbox Code Playgroud)