2015-01-15 148 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的文件实例?),您可以使用--将“旨在控制差异本身的参数”与“旨在限制哪些路径被扩散的路径名称”分开。