2015-01-15 147 views
1

我正在研究brach上的回購協議,並且我有一些未提交的更改。git diff最後提交加上所有未提交的更改?

$ git status 
<my local changes> 

我也有一個以前的「工作正在進行中」提交,由一位同事做了很多差異。

$ git log 
commit 6b388883f3e3cf2a864aeb335ce36e10f0e7a60d 
Date: Thu Jan 15 12:39:26 2015 +0000 

    Work in progress 

commit 91c868cda56e309b9a417f21c929a1beb1cc74d4 
Date: Thu Jan 14 12:39:26 2015 +0000 

    <Last "real" commit to master> 

我現在打算創建一個新的分支基於關老爺(又名91c868cda56e309b9a417f21c929a1beb1cc74d4),並進行了全新的一套整齊的結構化的提交,使乾淨的PR。

要做到這一點,自上次「真實」提交91c868cda56e309b9a417f21c929a1beb1cc74d4以來,輸出單個差異以及所做的所有更改(承諾和未承諾)將會非常有幫助。

這是一次性使用的分支,所以我在這個分支上做什麼並不重要。

這樣做的最好方法是什麼?

我的一個想法是我可以提交所有本地更改,然後在該提交和91c868cda56e309b9a417f21c929a1beb1cc74d4之間進行區分:可以看到這兩個提交之間所有更改的差異嗎?

+0

您確定只是想查看更改嗎?你不想只產生一個新的提交*包含*這些變化?我建議你將你的更改提交給你當前的WIP分支,然後從'master'和'git merge --squash '簽出你的新分支,這將把所有更改合併到索引中,準備提交。 – meagar 2015-01-15 18:11:39

+0

謝謝,但我需要將更改分成更細粒度的提交。 – Richard 2015-01-15 19:10:52

回答

2

隨着git diff你必須選擇兩組文件進行比較。您可以通過明確指定兩個修訂來實現此目的,例如git diff HEAD~3 HEAD^,它們會區分這兩個提交。或者,您可以使用工作樹或索引/分段區域來區分一些提交;或將您的索引/暫存區域與您的工作樹進行比較。

要區分一次違反當前工作樹的提交,請提交一個提交:git diff HEAD,git diff HEAD^,git diff HEAD~2,等等。但是,如果您未命名特定提交,則git diff會將您的索引/暫存區域與您的工作樹進行比較,而不是使用HEAD提交。

要區分一次違反索引/暫存區域的提交,請命名一次提交併使用--cachedgit diff --cached HEAD~2,依此類推。名稱提交和git在這裏默認使用HEAD

如果您姓名兩個提交,git diff比較這兩個提交。您可以將它們分別編寫爲git diff HEAD~2 HEAD,也可以使用..格式:git diff HEAD~2..HEAD。這裏--cached是沒有意義的,因爲它意味着「使用索引而不是工作目錄」,diff不使用工作目錄。

在您的具體情況下,將名稱爲91c868cda56e309b9a417f21c929a1beb1cc74d4HEAD^與您的工作樹進行比較即可。如果你現在做一個新的提交,但是,比較HEAD^^(或顯式提交91c868cda56e309b9a417f21c929a1beb1cc74d4)到你的新提交將是你想要的。您的新提交將爲新的HEAD,因此您可以在此處比較HEAD^^HEAD

請參閱the gitrevisions documentation瞭解拼寫特定修訂的多種方法。


注意,其他參數不在差異標誌(差異標誌是象-w東西忽略空白)被當作路徑說明符,限制設定顯示差異文件。舉例來說,如果你只是好奇,兩個版本之間發生了什麼事path/to/file.txt

git diff rev1 rev2 path/to/file.txt 

如果文件名「看起來像」一個差異標誌(如果你想看看發生了什麼名爲--cached的文件實例?),您可以使用--將「旨在控制差異本身的參數」與「旨在限制哪些路徑被擴散的路徑名稱」分開。