我如何生成自上次拉出以来改变了什么的git diff?

时间:2008-09-14 00:02:41

标签: git diff rake pull

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

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

4 个答案:

答案 0 :(得分:82)

您可以使用refspecs相当简单地完成此操作。

git pull origin
git diff @{1}..

这会给你一个当前分支的差异,因为它在拉动之前和之后都存在。请注意,如果pull实际上没有更新当前分支,则diff会给出错误的结果。另一种选择是明确记录当前版本:

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

我个人使用一个别名,它只是向我显示一个日志,以相反的顺序(即最旧到最新),sans合并,自我上次拉动以来的所有提交。每次拉动更新分支时我都会运行它:

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

答案 1 :(得分:12)

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

git config remote.origin.url <url>

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

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

@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

答案 2 :(得分:10)

这与我询问how to get changes on a branch in git的问题非常相似。请注意,当使用两个点与三个点时,git diff与git log的行为不一致。但是,对于您的应用程序,您可以使用:

git fetch
git diff ...origin

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

答案 3 :(得分:4)

如果将其放入bash配置文件中,您将能够运行grin(git remote incoming)和grout(git remote outgoing)来查看源主设备的传入和传出提交的差异。

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
}