簡體   English   中英

如何判斷自上次git pull以來遠程存儲庫上的哪些文件發生了變化?

[英]How to tell what files on remote repository changed since last git pull?

我正在嘗試使用$git push origin master推送一些代碼,但是我得到了錯誤

! [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我得到了兩個repos之間不同的所有文件和更改的列表。 但是我只對在遠程存儲庫和我上一次在本地框上執行$ git pull origin master之間已更改的文件列表感興趣。

有沒有辦法可以做到這一點?

git pullgit fetch相同,后跟git merge (或git rebase )。

git fetch顯示哪些refs更新了。 它會顯示如下:

a8e5e4e..295bf31  master     -> origin/master

這意味着你最后一次獲取master時它位於a8e5e4e,現在它是295bf31。 您可以使用以下內容查看已更改的文件:

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

但也許更有趣的是獲取后gitk master...origin/master的輸出。 這樣,您可以檢查側面的變化和原點側的變化。

對於這個問題, michas的回答是正確的。

如果你沒有舊的參考,即a8e5e4e..295bf31 master -> origin/mastera8e5e4e部分怎么辦? 可能你實際上並不關心:正如他所說的那樣,看着master...origin/master可能會更有趣。 1但是,這個三點...語法究竟意味着什么?

答案在git rev-list文檔中:

另一個特殊符號是<commit1>...<commit2> ,它對合並很有用。 生成的提交集是兩個操作數之間的對稱差異。 ...

我懷疑是混淆了足夠的措辭(實際上git diff使用了一個完全不同的含義)。 但實際上,它並不復雜。

鑒於一些提交可以這樣繪制:

master  origin/master

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

你所擁有的是在提交C的分歧。 masterorigin/master都指向C時,你開始工作。 顯然,你犯了DE ,而“他們”(無論他們是誰)犯了FG 順便提一下,Commit C稱為合並庫

什么master...origin/master意思是:找我C ,然后在左右兩邊給我“從那里起”的一切。 也就是說, master origin/master所有提交,不包括它們第一次遇到的點上下的任何提交。

如果您運行gitk master...origin/master您將看到: 2 所做的所有提交以及它們所做的所有提交。 但是,如果你運行git diff flags master...origin/mastergit diff會拋出大部分內容。 相反,它會找到合並基礎C3和與右側名稱相對的差異。

假設你在你的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 '...@{u}'

(引號是為了保護支架免受外殼影響;在您的特定外殼中可能需要也可能不需要它們)。 如果你在這工作,甚至developorigin/develop作為其上游,或featureXorigin/featureX作為其上游等


1如果您沒有gitk ,請嘗試:

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

(或如上所述的'...@{u}' )。 您需要--boundary來包含合並提交。 您可能還想添加--oneline --decorate

2實際上gitk也會向你顯示合並提交,就像腳注1中的命令一樣。也就是說,它使用--boundary來包含會合點提交(這與合並基礎不完全相同,但足夠接近)。

3這假設只有一個合並庫提交。 對於這些情況,這應該是真的。 因此, git diffC的樹與上游分支頭部的G樹進行比較。 你可以比較“他們在哪里”和“他們最終在哪里”,無論他們在任何長途駕駛中訪問過的任何中間點。 :-)例如,如果提交F添加一個文件this/that然后提交G再次刪除它,你將看不到該文件。

git diff --stat master origin/master

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM