我如何生成自上次拉动以来发生了什么变化的git diff?

我如何生成自上次拉动以来发生了什么变化的git diff?

How can I generate a git diff of what's changed since the last time I pulled?

我想将以下操作编写为一个命令,最好是在rake中编写脚本:

  • 获取本地git存储库的版本。
  • Git拉最新的代码。
  • Git diff从我在步骤1中提取的版本到现在我的本地存储库中的版本。
  • 换句话说,我想从中央存储库中获取最新的代码,并立即生成自上次提取以来发生的变化的差异。


    您可以使用refspec相当简单地做到这一点。

    1
    2
    git pull origin
    git diff @{1}..

    这将使您对分支之前和之后存在的当前分支有所不同。请注意,如果拉取实际上并没有更新当前分支,则diff将为您提供错误的结果。另一个选择是显式记录当前版本:

    1
    2
    3
    current=`git rev-parse HEAD`
    git pull origin
    git diff $current..

    我个人使用的别名只是以反向顺序(即从最旧到最新)向我显示了自我上次拉取以来所有提交的日志,没有合并。每当我的pull更新分支时,我都会运行此命令:

    1
    git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..

    格雷格的方法应该起作用(不是我,其他格雷格:P)。关于您的评论,origin是一个配置变量,当您将中央存储库克隆到本地计算机时由Git设置。本质上,Git存储库会记住它的来源。但是,如果需要使用git-config,则可以手动设置这些变量。

    1
    git config remote.origin.url <url>

    url是中央存储库的远程路径。

    这是一个应该工作的示例批处理文件(我没有测试过)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @ECHO off

    :: Retrieve the changes, but don't merge them.
    git fetch

    :: Look at the new changes
    git diff ...origin

    :: Ask if you want to merge the new changes into HEAD
    set /p PULL=Do you wish to pull the changes? (Y/N)
    IF /I %PULL%==Y git pull


    这非常类似于我问的有关如何在git的分支上进行更改的问题。请注意,当使用两个点与三个点时,git diff与git log的行为不一致。但是,对于您的应用程序,您可以使用:

    1
    2
    git fetch
    git diff ...origin

    之后,git pull会将更改合并到您的HEAD中。


    如果将其放到bash配置文件中,则可以运行grin(git远程传入)和grout(git远程传出),以查看原始主机的传入和传出提交的差异。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function parse_git_branch {
      git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'
    }
    function gd2 {
     echo branch \($1\) has these commits and \($2\) does not
     git log $2..$1 --no-merges --format='%h | Author:%an | Date:%ad | %s' --date=local
    }
    function grin {
     git fetch origin master
     gd2 FETCH_HEAD $(parse_git_branch)
    }
    function grout {
     git fetch origin master
     gd2 $(parse_git_branch) FETCH_HEAD
    }


    推荐阅读