我有一个特殊的问题,我正在努力解决我没有为提交而进行的更改。
如果你做git status --porcelain
你可以得到这样的输出:
M change1
M change2
MM change3
M change4
M change5
更改1和2分阶段,更改3到5不分阶段。 MM
意味着我尚未看到的其他东西。
我可以解析这个输出,但我想知道是否有更好的方法来显示git status
的“更改未提交提交”类别中的文件。
您可以使用git diff --name-only
或git ls-files . -m
获取哪些跟踪文件具有未分级的更改。
您可以使用git ls-files . --exclude-standard --others
获取未跟踪但未被忽略的文件。 (From this answer)。
将它们放在一起以获取所有未被忽略且未跟踪或未分级更改的文件。
git ls-files . --exclude-standard --others -m
MM
国家意味着有一些变化上演,一些变化没有上演。
更确切地说,这意味着该路径的索引版本与HEAD
版本不同 - 这是第一个M
- 并且该路径的工作树版本与索引版本不同。
例如,假设您有自述文件并且您进行了更改:
$ 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'的“更改未提交提交”中的文件。
您需要决定如何处理此状态下的文件,以及是否存在未合并状态的可能性 - 如果可能存在尚未解决冲突合并的文件,则这些是未合并的文件 - 如何为它们执行操作好。
但是,一般来说,如果你想要一个差异,请使用git diff
。 diff
有许多子风格:您可以将树(例如HEAD
的树)与索引或工作树进行比较,或将两棵树相互比较。有关详细信息,请参阅the documentation,但简而言之,git diff
将索引与工作树进行比较,因此对应于状态输出的第二列。
要使diff仅发出文件名,请使用--name-only
。因此,git diff --name-only
将为您提供可以进行的更改。 (这对未跟踪文件没有帮助;请参阅Schwern's answer以获取使用git ls-files
。)