GitHub能够以补丁形式展示一个文件的修改历史吗?

90
如果你运行git log --patch -- path/to/file命令,你将会得到文件的历史记录以及每次提交所做更改的差异,如下所示:
$ git log --patch -- git-rebase.sh

commit 20351bb06bf4d32ef3d1a6849d01636f6593339f
Author: Ramkumar Ramachandra <artagnon@gmail.com>
Date:   Sat Jun 15 18:43:26 2013 +0530

    rebase: use 'git stash store' to simplify logic

    rebase has no reason to know about the implementation of the stash.  In
    the case when applying the autostash results in conflicts, replace the
    relevant code in finish_rebase () to simply call 'git stash store'.

    Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff --git a/git-rebase.sh b/git-rebase.sh
index d0c11a9..17be392 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -153,11 +153,8 @@ finish_rebase () {
                then
                        echo "$(gettext 'Applied autostash.')"
                else
-                       ref_stash=refs/stash &&
-                       >>"$GIT_DIR/logs/$ref_stash" &&
-                       git update-ref -m "autostash" $ref_stash $stash_sha1 ||
-                       die "$(eval_gettext 'Cannot store $stash_sha1')"
-
+                       git stash store -m "autostash" -q $stash_sha1 ||
+                       die "$(eval_gettext "Cannot store \$stash_sha1")"
                        gettext 'Applying autostash resulted in conflicts.
 Your changes are safe in the stash.
 You can run "git stash pop" or "git stash drop" it at any time.

commit 2e6e276decde2a9f04fc29bce734a49d3ba8f484
Author: Ramkumar Ramachandra <artagnon@gmail.com>
Date:   Fri Jun 14 18:47:52 2013 +0530

    rebase: use peel_committish() where appropriate

    The revisions specified on the command-line as <onto> and <upstream>
    arguments could be of the form :/quuxery; so, use peel_committish() to
    resolve them.  The failing tests in t/rebase and t/rebase-interactive
    now pass.

    Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
    Signed-off-by: Junio C Hamano <gitster@pobox.com>

diff --git a/git-rebase.sh b/git-rebase.sh
index d0c11a9..6987b9b 100755
--- a/git-rebase.sh
+++ b/git-rebase.sh
@@ -434,7 +434,7 @@ then
                shift
                ;;
        esac
-       upstream=`git rev-parse --verify "${upstream_name}^0"` ||
+       upstream=$(peel_committish "${upstream_name}") ||
        die "$(eval_gettext "invalid upstream \$upstream_name")"
        upstream_arg="$upstream_name"
 else
@@ -470,7 +470,7 @@ case "$onto_name" in
        fi
        ;;
 *)
-       onto=$(git rev-parse --verify "${onto_name}^0") ||
+       onto=$(peel_committish "$onto_name") ||
        die "$(eval_gettext "Does not point to a valid commit: \$onto_name")"
        ;;
 esac

我希望能够使用GitHub的网页界面(而不是命令行)获得相同格式的内容,并且我想要一个链接,以便向他人发送而无需代码。


Compare View 提供了一个接近你所需要的功能,但是不幸的是它并不适用于单个文件。 - user456814
2
如果您提出了一个功能请求,也许GitHub开发团队会添加它。 - user456814
4个回答

84
以下URL将以类似于“git log -p”的格式显示单个文件的所有提交记录: http://github.com/<username>/<project>/commits/<branch>/<path/to/file> 其中:
  • <username>是拥有该repo的人的用户名
  • <project>是repo名称
  • <branch>可以是'master'或任何其他分支
  • <path/to/file>希望是不言自明的
随机挑选一个例子,来自vim-fugitive repo

19
那是 "git log path/to/file"。我想要的是 "git log -p path/to/file"。 - ma11hew28
1
那只是显示最新更新,而不是更新历史记录。 - Gerry
我认为看起来完全正确,不确定为什么没有被标记。我还要注意到构建路径很简单,只需转到文件本身,并在URL中将“_blob_”替换为“_commits_”。 - John C
4
我不知道为什么这个回答得到了赞同。我猜人们没有仔细阅读问题。这个答案没有给你一个像“git log --patch -- path/to/file”那样的差异列表,而这正是原帖所要求的。 - jcoffland
1
@jcoffland 这个回答被点赞是因为大多数像我这样的人都觉得它很有帮助,而且正好符合我们正在寻找的内容,尽管忽略了提问者的问题。 - mr5
显示剩余2条评论

50

根据以上答案以及我自己尝试寻找这个确切功能的经验,似乎对于这个问题来说,正确答案是


1
这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - indubitablee
18
这个回答既具体又准确,与其他两个回答不同,它们甚至没有意识到问题在问什么。 - jhk
5
这是正确的答案。Github 没有一种方法可以展示单个文件的补丁结果和日志,就像 git log -p -- file 所做的那样。 - nohat
4
另外两个答案是不正确的。这个答案让我节省了时间和挫折感。 - Schien
3
“这并没有回答问题。”当然有,而且这个回答还帮我省了时间。感谢 jhk。 - ChrisJJ

33

除了直接URL答案(顺便说一下,这是完全正确的)之外,使用GitHub的界面还有另一个选择:

  • 点击“源代码”视图
  • 切换到所需的分支
  • 查找您想要的文件,直到您到达该文件的实际源代码视图
  • 在右上角点击“历史记录”

13
这也并不能满足原帖作者的要求。他想要补丁输出,就像使用 git log -p -- 文件 命令一样得到的输出结果。而你展示的只是特定文件的日志,就像 git log -- 文件 命令一样,没有包含差异补丁信息。 - user456814

-4
如果您使用的是Linux系统,那么可以通过以下方式安装TIG

sudo apt-get install tig

安装完成后,可以通过以下命令查看提交记录和相应的更改:

tig path/to/file/

这将显示所有提交及其相应的更改。
Talat Parwez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接