![](/img/trans.png)
[英]How to tell what files would be over written by a git pull that I've changed since the last git pull or git push?
[英]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 pull
與git 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/master
的a8e5e4e
部分怎么辦? 可能你實際上並不關心:正如他所說的那樣,看着master...origin/master
可能會更有趣。 1但是,這個三點...
語法究竟意味着什么?
答案在git rev-list
文檔中:
另一個特殊符號是
<commit1>...<commit2>
,它對合並很有用。 生成的提交集是兩個操作數之間的對稱差異。 ...
我懷疑是混淆了足夠的措辭(實際上git diff
使用了一個完全不同的含義)。 但實際上,它並不復雜。
鑒於一些提交可以這樣繪制:
master origin/master
E G
| |
D F
\ /
C
|
B
|
A
你所擁有的是在提交C
的分歧。 當master
和origin/master
都指向C
時,你開始工作。 顯然,你犯了D
和E
,而“他們”(無論他們是誰)犯了F
和G
順便提一下,Commit C
稱為合並庫 。
什么master...origin/master
意思是:找我C
,然后在左右兩邊給我“從那里起”的一切。 也就是說, master
和 origin/master
所有提交,不包括它們第一次遇到的點上下的任何提交。
如果您運行gitk master...origin/master
您將看到: 2 您所做的所有提交以及它們所做的所有提交。 但是,如果你運行git diff flags master...origin/master
, git diff
會拋出大部分內容。 相反,它會找到合並基礎C
, 3和與右側名稱相對的差異。
假設你在你的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}'
(引號是為了保護支架免受外殼影響;在您的特定外殼中可能需要也可能不需要它們)。 如果你在這工作,甚至develop
與origin/develop
作為其上游,或featureX
與origin/featureX
作為其上游等
1如果您沒有gitk
,請嘗試:
$ git log --graph --boundary ...origin/master
(或如上所述的'...@{u}'
)。 您需要--boundary
來包含合並提交。 您可能還想添加--oneline --decorate
。
2實際上gitk
也會向你顯示合並提交,就像腳注1中的命令一樣。也就是說,它使用--boundary
來包含會合點提交(這與合並基礎不完全相同,但足夠接近)。
3這假設只有一個合並庫提交。 對於這些情況,這應該是真的。 因此, git diff
將C
的樹與上游分支頭部的G
樹進行比較。 你可以比較“他們在哪里”和“他們最終在哪里”,無論他們在任何長途駕駛中訪問過的任何中間點。 :-)例如,如果提交F
添加一個文件this/that
然后提交G
再次刪除它,你將看不到該文件。
git diff --stat master origin/master
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.