如何获得完整上下文的git diff?

bal*_*lki 105 git diff git-diff

如何创建适合在坩埚中检查的补丁?

git diff branch master --no-prefix > patch
Run Code Online (Sandbox Code Playgroud)

这只产生3行上下文.所以我做了以下几点

git diff --unified=2000 branch master --no-prefix > patch
Run Code Online (Sandbox Code Playgroud)

希望所有文件都少于2000行.有没有办法告诉git包含补丁文件中的所有行而不必指定最大行?

c24*_*24w 86

看起来非常好用:

git diff --no-prefix -U1000
Run Code Online (Sandbox Code Playgroud)

随着警告:

-U标志指定上下文行.如果更改之间的行数超过1000行,则可能需要增加此值.

  • 你建议的`-U`选项与提问者使用的`--unified =`选项相同.唯一的区别是你指定的上下文行数少于1000,比2000年使用的提问者.@ balki想知道如何将数字增加到无穷大,但你建议将数字减少一半.为什么? (14认同)
  • @LS:是的,我现在意识到,但几年前却被忽视了.不过,这个问题比问题更明显,似乎可以帮助那些落在这里的奇怪人物. (3认同)
  • `--no-prefix` 选项消除了默认显示的“/a/”和“/b/”目标前缀。(链接页面) (3认同)

Ezr*_*zra 48

我知道这是旧的,但我也不喜欢硬编码的解决方案,所以我测试了这个:

git diff -U$(wc -l MYFILE)
Run Code Online (Sandbox Code Playgroud)

使用-U似乎是解决问题的唯一方法,但使用行计数可以证明它可以在非常大的文件中进行小的更改.

  • 这是一个差异,有两个版本的文件.如果磁盘上没有的版本长两倍怎么办?是不是-U有一个非常大的数字实际上更安全? (4认同)
  • `git diff -U $(wc -l MYFILE | awk'{print $ 1}'))MYFILE`是一个更好的答案,它仅通过获取没有空格的行数而不依赖于未引用的行数来正确地解析`wc`的输出。子外壳程序的输出以创建两个参数,并且可在macOS / BSD上运行。 (3认同)
  • 谢谢@balki,我尝试了你的建议并注意到<pre> $(wc -l MYFILE)</ pre>扩展为行计数后跟文件名,因此第二次使用文件名也可以省略.我正在更新我的答案以反映这一点. (2认同)

Von*_*onC 9

注:git1.8.1rc1宣布(2012年12月8日)包括:

diff.context可以使用新的配置变量" "来提供补丁输出中的默认上下文行数,以覆盖硬编码的默认值3行.

这样可以帮助生成更完整的上下文.

  • 然而,没有选项可以说'文件中的所有行' (7认同)
  • "我怀疑投入大量数字会模拟"所有线条"......除非它没有,然后事情就会破裂.所有都是无限的同义词,而非常大的数字就是 - 数字,而不是无限. (7认同)
  • 我怀疑投入大量数字会模拟"所有线条" (3认同)

Łuk*_*hel 6

我只是使用

git diff -W Git.md
Run Code Online (Sandbox Code Playgroud)

列出文件的完整补丁。从man git diff

-W, --function-context
将整个函数显示为每个更改的上下文行。


Yun*_* Wu 5

得到灵感,所以我添加了一个 git 别名。

$ cat ~/.gitconfig | fgrep diff
        df = "!git diff -U$(wc -l \"$1\" | cut -d ' ' -f 1) \"$1\""
$ git df <file>
Run Code Online (Sandbox Code Playgroud)

更新:

刚刚发现git df有时不起作用,因为执行git alias时目录发生了变化。(请参阅git 别名在错误的目录中操作)。@Moises Soto还提到在 macOS 上该wc命令的工作方式不同(输出前面有 6 个空格wc -l)并建议使用awk. 这是更新后的版本:

$ cat ~/.gitconfig | fgrep df
        df = "! [ \"$GIT_PREFIX\" != \"\" ] && cd \"$GIT_PREFIX\"; ~/bin/git_df.sh"
$ 
$ cat ~/bin/git_df.sh
#!/bin/bash
for FILE in $@; do
    git diff -U$(wc -l "${FILE}" | awk '{print $1}') "${FILE}"
done
exit 0
Run Code Online (Sandbox Code Playgroud)