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

时间:2012-11-29 14:09:49

标签: git diff git-diff

如何创建适合在坩埚中复习的补丁?

git diff branch master --no-prefix > patch

这只生成3行上下文。所以我做了以下

git diff --unified=2000 branch master --no-prefix > patch

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

6 个答案:

答案 0 :(得分:79)

This似乎工作得非常好:

git diff --no-prefix -U1000

警告:

  

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

答案 1 :(得分:41)

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

git diff -U$(wc -l MYFILE)

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

答案 2 :(得分:9)

注意:git1.8.1rc1 announce (December 8th, 2012)包括:

  

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

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

答案 3 :(得分:2)

这适用于Mac OS:

git diff -U$(wc -l main.htm | xargs)

请参阅"How to trim whitespace from a Bash variable?"

答案 4 :(得分:2)

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

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

更新

刚刚发现“git df”有时不起作用,因为执行git别名时目录更改了。 (见git aliases operate in the wrong directory)。 所以这是更新版本:

$ 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}" | cut -d ' ' -f 1) "${FILE}"
done
exit 0

答案 5 :(得分:0)

在查看特定于 的文件/提交时,以前接受的解决方案对我不起作用(-U选项似乎与rev / path解析混乱),但是--inter-hunk-context=在这种情况下适用于git version 2.24.0

git diff \
    --no-prefix \
    --inter-hunk-context=2000 \
    master -- \
        path/to/file.py

如果您不知道文件大小,当然可以使用wc -l来找到它,而不是对其进行硬编码:

git diff \
    --no-prefix \
    --inter-hunk-context=$(wc -l path/to/file.py) \
    master -- \
        path/to/file.py