2015-10-29 42 views
2

我有一個特定的問題,我正在處理需要解析更改的地方不是爲提交而暫存。顯示更改沒有在git中提交

如果你這樣做git status --porcelain,你可以得到這樣的輸出:

M change1 
M change2 
MM change3 
M change4 
M change5 

變化1和2都在上演,改變了3〜5都沒有。 MM意味着別的東西我還沒有看過。

我可以分析此輸出,但我想知道如果有一個更好的方式來只顯示「無法上演提交變化」的git status類別中的文件。

回答

1

MM狀態表示有一些變化上演,有些變化沒有上演。

更確切地說,這意味着該路徑的索引版本不同於HEAD版本 - 這是第一個M - 並且該路徑的工作樹版本與索引版本不同。

例如,假設你有一個README和你上演一場變革:

$ echo stuff >> README; git add README; git status --porcelain 
M README 

現在,您對同一個文件中的第二個變化。爲了使它特別有趣,讓我們刪除已添加stuff線:

$ ed README << 'end' 
$d 
w 
q 
end 
2634 
2628 
$ git status --porcelain 
MM README 

現在,如果我們git add的文件,這個階段的工作樹版本,這是一樣的HEAD版本和:

$ git add README 
$ git status --porcelain 
$ 

我可以解析這個輸出,但是我想知道是否有更好的方法來顯示'git status'中的「未進行提交的更改」文件。

你需要決定如何處理文件,在這種狀態下,如果有未合併爲潛在的狀態,有沒有可能尚未有合併衝突解決文件,這些都是未合併文件 - 他們應該爲他們做些什麼。

一般來說,如果你想要diff,請使用git diffdiff有許多子版本:您可以比較樹(如HEAD)與索引或工作樹,或者將兩棵樹相互比較。有關詳細信息,請參見the documentation,但簡而言之,git diff將索引與工作樹進行比較,因此對應於狀態輸出的第二列。

要得到差異只發出文件的名稱,請使用--name-only。所以git diff --name-only會給你變化你可能階段。 (這不與未跟蹤文件的幫助;見Schwern's answer使用git ls-files了點。)

+0

我認爲提問者已經知道'git status --porcelain'是如何工作的。他們正在尋求一種更好的方式來列出已更改的文件。 – Schwern

+0

我在這裏填寫'MM'狀態,在完成之前我意外地收到了部分帖子(貓在鍵盤上!)。 – torek

3

你可以得到哪些跟蹤文件有git diff --name-only或不分級的git ls-files . -m變化。

您可以獲得未追蹤但未被忽略文件與git ls-files . --exclude-standard --others。 (From this answer)。

將它們放在一起可以獲得所有不被忽略的文件,這些文件都是未被跟蹤的或者未經過暫存的更改。

git ls-files . --exclude-standard --others -m