82

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

  1. 获取我本地 git 存储库的版本。
  2. Git 拉取最新代码。
  3. Git diff 从我在第 1 步中提取的版本到现在在我的本地存储库中的版本。

换句话说,我想从中央存储库中获取最新代码,并立即生成自上次拉取以来更改的差异。

4

4 回答 4

101

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

git pull origin
git diff @{1}..

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

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

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

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..
于 2008-09-15T12:21:01.310 回答
12

格雷格的方式应该有效(不是我,其他格雷格: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
于 2008-09-14T17:14:42.093 回答
11

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

git fetch
git diff ...origin

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

于 2008-09-14T00:06:15.030 回答
4

如果你把它放到你的 bash 配置文件中,你将能够运行 grin(git 远程传入)和 grout(git 远程传出)来查看 origin master 的传入和传出提交的差异。

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
}
于 2010-05-14T00:31:19.463 回答