2013-08-18 56 views
7

我試圖推動使用$git push origin master一些代碼,但我得到的錯誤如何判斷自上次git pull以來遠程存儲庫上的哪些文件已更改?

! [rejected]  master -> master (non-fast-forward) 
error: failed to push some refs to 'https://github.com/' 
To prevent you from losing history, non-fast-forward updates were rejected 
Merge the remote changes (e.g. 'git pull') before pushing again. See the 
'Note about fast-forwards' section of 'git push --help' for details. 

當我做$ git fetch origin master然後$ git diff master origin/master我所有的是兩個回購之間不同的文件和更改的列表。不過,我只對在遠程存儲庫和上次在本地盒子上執行$ git pull origin master的文件列表感興趣。

有沒有一種方法可以做到這一點?

回答

2
git diff --stat master origin/master 
+0

這實際上將您當前的提交('master')與他們的('origin/master')進行比較,這不是完全相同的事情。 – torek

6

git pull相同git fetch接着git merge(或git rebase)。

git fetch顯示哪個參考在哪裏更新。它會顯示類似:

a8e5e4e..295bf31 master  -> origin/master 

這意味着你最後一次獲取主正是在a8e5e4e現在是在295bf31。 你可以看到的東西,如修改過的文件:

git diff --name-status a8e5e4e..295bf31 

但也許更有趣的是gitk master...origin/master後獲取輸出。這樣你可以檢查你身邊的變化和原點變化。

+0

我發現使用--name-status我也需要--name-only只顯示文件名而不顯示差異。 – bgoodr

4

michas' answer是正確的問題。

如果您沒有舊參考號,即a8e5e4e部分a8e5e4e..295bf31 master -> origin/master怎麼辦?可能你實際上並不在乎:正如他所建議的那樣,看着master...origin/master會更有趣。 但是,這個三點...語法實際上是什麼的意思是

答案是git rev-list文檔中:

另一種特殊的符號是<commit1>...<commit2>這是 合併有用。結果提交集合是兩個操作數之間的對稱差異 。 ...

我懷疑是混淆了足夠的措辭(實際上git diff採用了完全不同的含義)。但真的,這並不複雜。

鑑於一些提交,可以得出這樣的:

master origin/master 

    E  G 
    |  | 
    D  F 
    \ /
     C 
     | 
     B 
     | 
     A 

你有什麼是提交C分歧。當masterorigin/master均指向C時,您開始工作。顯然,您承諾DE,以及「他們」(他們是誰)承諾FG。提交C,順便說一下,被稱爲合併基地

什麼master...origin/master的意思是:我找C,然後給我的一切「從那裏」,在左,右兩側。也就是說,在masterorigin/master上的所有提交都不包含任何提交信息,並且不包括在它們首次遇到的地點以下的提交。

如果運行gitk master...origin/master你會看到這一點:所有作出的提交,和所有他們作出的提交。但是,如果您運行git diff flags master...origin/master,則git diff會將大部分內容拋出。相反,它會找到合併基礎C,並將其與右側名稱進行比較。

假設你在master分支(即HEAD簡單地意味着「主」),你可以進一步縮短這個。要查看哪些文件修改它們,因爲你和他們的分支機構分歧,只需要運行:

$ git diff --stat ...origin/master # or --name-status, etc 

留出了名的意思HEAD,所以這是一樣的HEAD...origin/master這是一樣的master...origin/master

如果你的Git是夠新,@{u}是指「當前分支的上游分支」(即從master,發現origin/master),所以你可以運行:

$ git diff --stat '[email protected]{u}' 

(引號是保護從外殼的括號;他們可能或可能不需要在你的特定外殼)。如果您對developorigin/develop作爲其上游,或featureXorigin/featureX作爲其上游這工作就算了,等


如果沒有gitk,請嘗試:

$ git log --graph --boundary ...origin/master 

(或如上所述的'[email protected]{u}')。您需要--boundary才能包含合併提交。您也可以添加--oneline --decorate

其實gitk會告訴你這次合併提交過,就像在腳註1這是命令,它使用--boundary包括滿足點承諾(這是不太一樣的合併基地,但接近足夠)。

這裏假設只有一個合併基礎提交。對於這些情況,這應該是真的。因此,git diffC的樹與上游分支頭部的G的樹進行比較。你會比較「他們在哪裏」和「他們在哪裏結束」,無論他們訪問的任何中間點可能是一個任意長的驅動器。 :-)例如,如果提交F添加文件this/that,然後提交G再次刪除它,您將看不到該文件。

相關問題