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

Tef*_*Ted 69 git diff rake pull

我想将以下操作编写成一个命令:

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

换句话说,我想从中央存储库中获取最新的代码,并立即生成自上次拉出以来所发生变化的差异.

Lil*_*ard 82

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

git pull origin
git diff @{1}..
Run Code Online (Sandbox Code Playgroud)

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

current=`git rev-parse HEAD`
git pull origin
git diff $current..
Run Code Online (Sandbox Code Playgroud)

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

git config --global alias.lcrev 'log --reverse --no-merges --stat @{1}..
Run Code Online (Sandbox Code Playgroud)

  • @ user1129682:这是访问[reflog]的语法(http://www.kernel.org/pub/software/scm/git/docs/git-reflog.html).如果没有分支名称,则表示访问当前分支的reflog.值"@ {1}"表示最新的reflog条目,例如当前分支指向当前提交之前指向的当前分支. (5认同)
  • 有人可以解释(或告诉我在哪里阅读)什么`@ {1} ..完全测量?把它扔到谷歌没有帮助. (4认同)
  • +1,这是正确的方法。您应该在“ @ {1} ..”表示法上稍作扩展,也许将默认值明确地放在此处,然后显示精简版本,所以它的魔力就少了。 (2认同)

Gre*_*reg 12

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

git config remote.origin.url <url>
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 10

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

git fetch
git diff ...origin
Run Code Online (Sandbox Code Playgroud)

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

  • 另一种方法是使用特殊的FETCH_HEAD头,它反映了前一次获取的结果.所以:"git fetch && git diff ... FETCH_HEAD". (2认同)