2008-09-14 44 views
61

我想劇本,最好在耙,以下操作成一個單一的命令:我怎樣才能生成一個自上次拉取後發生變化的git diff?

  1. 獲取我的本地git倉庫的版本。
  2. Git拉最新的代碼。
  3. 從步驟1中提取的版本I到現在在本地存儲庫中的Git diff。

換句話說,我想從中央存儲庫中獲取最新的代碼,並立即生成自上次拖拉以來發生更改的差異。

回答

70

你可以用refspecs簡單地做到這一點。

git pull origin 
git diff @{1}.. 

這將給你當前分支的差異,因爲它存在之前和之後拉。請注意,如果拉不實際更新當前分支,diff會給你錯誤的結果。另一種選擇是明確記錄的當前版本:

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

我個人使用的別名只顯示我的日誌,以相反的順序(即最舊到最新),自從我上次拉SANS合併所有提交的, 。我跑我這拉更新分支的每個時間:

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

這與我問到有關how to get changes on a branch in git的問題非常相似。請注意,當使用兩點與三點時,git diff與git log的行爲不一致。但是,對於您的應用程序,你可以使用:

git fetch 
git diff ...origin 

之後,一個git pull將更改合併到你的頭上。

+0

我沒有看到起源定義爲git-diff或git-rev-parse的特殊關鍵字。你的意思是說我需要插入來自步驟#1的散列作爲原始值嗎?如果是這樣,我該如何以編程方式提取該值?爲了方便起見,我想將所有這些步驟合併到一個命令/腳本中。 – 2008-09-14 13:53:53

+2

另一種方法是使用特殊的FETCH_HEAD頭,該頭反映了前一次獲取的結果。所以:「git fetch && git diff ... FETCH_HEAD」。 – 2008-09-14 19:29:02

+0

我認爲這是比較合適的迴應:`git fetch`後面跟着`git diff origin/branchname`是檢查拉前區別的最好方法。 – 2017-04-19 10:45:55

12

Greg's方式應該工作(不是我,其他格雷格: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 
+1

通常你會使用`git remote set-url origin `而不是`git config`來更改Git * remote *的URL。有區別嗎?我不知道,但似乎`git remote`是這個工作更合適的工具。 – 2013-11-14 16:25:51

4

如果你拖放到你的bash這個配置文件,你就可以運行的笑容(GIT遠程接收)和水泥(GIT遠程傳出)看的diff提交原始主機的傳入和傳出。

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 
} 
相關問題