git 差异最后一次提交加上所有未提交的更改?

git diff last commit plus all uncommitted changes?

我正在 brach 上进行回购,我有一些未提交的更改。

$ git status
<my local changes>

我也有一个以前的 "work in progress" 提交,其中有很多差异,由同事提交。

$ 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>

我现在计划创建一个基于 master 的新分支(又名 91c868cda56e309b9a417f21c929a1beb1cc74d4),并进行一组全新的整洁的结构化提交,以进行干净的 PR。

要做到这一点,输出单个差异非常有帮助,其中包含自上次 "real" 提交以来所做的所有更改(已提交和未提交),91c868cda56e309b9a417f21c929a1beb1cc74d4.

这是一个一次性分支,所以我在这个分支上做什么并不重要。

最好的方法是什么?

我的一个想法是我可以提交我所有的本地更改,然后在该提交和 91c868cda56e309b9a417f21c929a1beb1cc74d4 之间进行比较:是否可以看到这两个提交之间所有更改的单个差异?

使用 git diff 您必须 select 两组文件进行比较。您可以通过显式指定两个修订来做到这一点,例如 git diff HEAD~3 HEAD^,这会区分这两个提交。或者,您可以将一些提交与您的工作树或 index/staging-area 进行比较;或将您的 index/staging-area 与您的工作树进行比较。

要将一项提交与您当前的工作树区分开来,命名一项提交:git diff HEADgit diff HEAD^git diff HEAD~2,依此类推。但是,如果您没有命名特定的提交,git diff 会将您的 index/staging 区域与您的工作树进行比较,而不是使用 HEAD 提交。

要将一项提交与您的 index/staging 区域进行比较,命名一项提交并使用 --cached: git diff --cached HEAD~2,依此类推。 Name no commits and git defaults to using HEAD here.

如果您命名 两个 提交,git diff 将比较这两个提交。您可以将它们都写为单独的提交,例如 git diff HEAD~2 HEAD,或者您可以使用 .. 格式:git diff HEAD~2..HEAD。这里 --cached 没有意义,因为它意味着 "use index instead of work-directory" 并且 diff 没有使用工作目录。

在您的特定情况下,比较 HEAD^,名称提交 91c868cda56e309b9a417f21c929a1beb1cc74d4 与您的工作树是您现在想要的。但是,如果您 do 现在进行新提交,则将 HEAD^^(或显式提交 91c868cda56e309b9a417f21c929a1beb1cc74d4)与您的新提交进行比较将是您想要的。您的新提交将是新的 HEAD,因此您可以在那时区分 HEAD^^HEAD

有关拼写特定修订的多种方法,请参阅 the gitrevisions documentation


请注意,不是差异标志的其他参数(差异标志类似于 -w 以忽略白色 space)被视为路径说明符,以限制差异文件集。例如,如果您只是好奇 path/to/file.txt 在两次修订之间发生了什么:

git diff rev1 rev2 path/to/file.txt

如果一个文件名 "looks like" 一个差异标志(例如,如果你想查看名为 --cached 的文件发生了什么?)你可以使用 -- 来分隔 "arguments meant to control the diff itself" 来自 "path names meant to limit which paths are diffed".