我可以要求 git 只显示已修改的行并忽略所有其他未修改的代码吗?
并且来自主要答案下的OP的后续评论:
感谢您的快速回复。这解决了我的一半问题,但我仍然得到一些行,例如@@ -1 +1 @@
在我的 diff 和顶部的 git diff have 中diff --git a/db/xxxxxxx b/db/xxxx index xxxxx..aaaaaaa bbbbbbbb
。-r3b00t
git-diffc.sh
awk
为了解决上述两个请求,这里是使用我写的基于-language 的包装器的 1 行解决方案git diff
:
git diffc
完毕!
以下是 的特点git diffc
。
所有这些功能结合在一起,可以解决这里所有其他答案的缺点:
- 它处理彩色和非彩色输出。这就是这个正则表达式的作用:
^(\033\[(([0-9]{1,2};?){1,10})m)?
- 它处理所有颜色和所有文本格式选项,包括粗体、斜体、删除线等,您可以在设置中进行
git config
设置。这就是上面的正则表达式包含;?
和{1,10}
在其中的原因:如果它检测到颜色或文本格式代码的开头,它将匹配多达 10 个这些组合 ANSI 代码的序列。
- 它不包括以
@@
和单词开头的行diff
,就像公认的答案一样。如果您确实想要这些行(坦率地说,我认为它们很有用:)),请改为:
git diff --unified=0
或者
git diff -U0
- 它以与以下方式完全相同的方式显示输出
git diff
:在less
具有可选颜色输出的寻呼机-R
中(.-F
q
-X
它还具有强大且易于配置的优点,因为它使用 awk 编程语言。
的样本输出git diff 8d4d4fd3b60f200cbbb87f2b352fb097792180b2~2..8d4d4fd3b60f200cbbb87f2b352fb097792180b2~3
:
diff --git a/useful_scripts/rg_replace.sh b/useful_scripts/rg_replace.sh
index 74bc5bb..0add69d 100755
--- a/useful_scripts/rg_replace.sh
+++ b/useful_scripts/rg_replace.sh
@@ -2,12 +2,11 @@
# This file is part of eRCaGuy_dotfiles: https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles
-# STATUS: functional and ready-to-use
-
+# WORK IN PROGRESS! <===========
# This is a simple wrapper around RipGrep (`rg`) to allow in-place find-and-replace, since the
# `rg --replace` option replaces only the stdout, NOT the contents of the file.
# `man rg` under the `--replace` section states: "Neither this flag nor any other ripgrep
-# flag will modify your files." This wrapper overcomes that limitation.
+# flag will modify your files."
# INSTALLATION INSTRUCTIONS:
# 1. Install RipGrep: https://github.com/BurntSushi/ripgrep#installation
与 的样本输出相比git diffc 8d4d4fd3b60f200cbbb87f2b352fb097792180b2~2..8d4d4fd3b60f200cbbb87f2b352fb097792180b2~3
。请注意,仅显示-
和+
行,而周围的上下文行消失了,所有其他行(例如diff
, index
, ---
,+++
和@@
)也消失了!:
-# STATUS: functional and ready-to-use
-
+# WORK IN PROGRESS! <===========
-# flag will modify your files." This wrapper overcomes that limitation.
+# flag will modify your files."
git diffc
代表“git diff c hanges”,意思是:只显示更改的代码行,没有别的。我写的。它不是常规 git 的一部分。
它支持 . 支持的所有选项和参数git diff
,因为它只是git diff
.
在此处下载:git-diffc.sh。它是我的eRCaGuy_dotfiles 存储库的一部分。
要安装它:
git clone https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
cd eRCaGuy_dotfiles/useful_scripts
mkdir -p ~/bin
ln -si "${PWD}/git-diffc.sh" ~/bin/git-diffc
如果这是您第一次创建或使用该目录,现在手动注销并重新登录~/bin
,以便将 Ubuntu 的默认~/.profile
文件添加~/bin
到您的PATH
变量中。如果注销并重新登录不起作用,请将以下几行代码添加到您的~/.profile
文件中,然后注销 Ubuntu 并重新登录:
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
而已!
用法:同git diff
。前任:
git diffc
git diffc -h
git diffc commit1 commit2
git diffc --no-color
# etc.
附加安装说明:
另请参阅我的其他答案的安装部分,git diffn
我也在这里写过。git-diffn
除了在这些说明中看到的任何地方,请git-diffc
改用。这也包括在wget
命令内部。下载和安装git diffc
很容易:只需几个命令。
如何使用awk
仅显示+
和-
线,考虑任何颜色或文本格式git diff
可能会输出:
下面的代码构成了git diffc
包装器。
这里没有一个其他答案(包括我的其他答案)会完全正确地做你想要的 100%。然而,这个答案会。这是一个 1-liner,您可以将其复制并粘贴到您的终端中。为了便于阅读,我刚刚将它设置为多行——你可以用同样的方式复制粘贴它,所以我不妨让它可读!它依赖于awk
编程语言:
git diff --color=always "$@" | awk '
# 1. Match and then skip "--- a/" and "+++ b/" lines
/^(\033\[(([0-9]{1,2};?){1,10})m)?(--- a\/|\+\+\+ b\/)/ {
next
}
# 2. Now print the remaining "+" and "-" lines ONLY! Note: doing step 1 above first was required or
# else those lines would have been matched by this matcher below too since they also begin with
# the "+" and "-" symbols.
/^(\033\[(([0-9]{1,2};?){1,10})m)?[-+]/ {
print $0
}
' | less -RFX
如果您有兴趣学习awk,这里有一些资源:
gawk
(GNU awk
) 手册:https ://www.gnu.org/software/gawk/manual/html_node/index.html#SEC_Contents
- 研究
git diffn
和其中的评论:https ://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/git-diffn.sh
- 如果你也想
git diffn
用git diff
行号,请看这里:Git diff with line numbers(Git log with line numbers)
- 一些 awk “hello world”和语法测试示例:https ://github.com/ElectricRCAircraftGuy/eRCaGuy_hello_world/tree/master/awk
作为奖励,我还将上面的内容包起来用作git diffc
,这意味着“git diff 只显示'c'changes”。用法与;git diff
相同 只是使用git diffc
!它支持所有选项。颜色默认为开启。要关闭它,只需使用git diffc --no-color
或git diffc --color=never
。详情请参阅man git diff
。
因为我昨晚刚刚完成git diffn
(一个git diff
用“数字”行显示的工具),所以写作git diffc
是微不足道的。我想我最好现在就在我脑海中浮现知识的时候去做。