我获得了一个包含如下文件的项目:
MyProject/
a.txt
b.txt
c.txt
我在目录中初始化了一个Git repo,但是(愚蠢地)没有在开始时将所有文件添加到repo。相反,在我意识到我需要更改文件之前,我已经将文件添加到了回购邮件中。
git add a.txt; git commit -m "Pristine A"
<awesome changes to a.txt>
git commit -am "Awesome Changes"
不幸的是,在我狂热编辑的热情中,我忘了为某些文件做这件事。 (阅读:许多目录中的数十个文件,通过显式路径很难找到。)
<awesome changes to b.txt>
git status # Uh oh, new file b.txt
我可以在改变之前获得项目的快照,这样Git可以告诉我从那时起哪些文件发生了变化。但是,我不想丢失已经添加的数十个提交(包括描述)。
如何获取“原始”快照,并让Git计算哪些文件与我的工作目录相比发生了变化,而不会丢失我现有的提交,并且不会对那些确实发生更改但已经发生变化的文件产生误报提交记录?
FWIW我在开始时没有添加整个目录的原始“理由”是因为有数千个与我的工作无关的文件,该目录仅在高延迟SMB上可用,并且我认为我知道哪些文件很重要。
答案 0 :(得分:3)
使用您的pristine快照并使用它创建一个新的git存储库(添加所有文件并提交它们)。
在您当前的存储库中,执行
git remote add pristine /path/to/pristine/repository
之后
git remote update pristine
您现在可以在git diff
git diff pristine/master
查看工作目录和pristine提交之间的完全差异。如果您只需要变更集,--summary
应该是您正在寻找的选项。 git diff手册页详细介绍了所有其他开关。
这应该会产生一个变更集,其中已经添加的文件的提及与已修改但未添加的文件不同。
之后你做的事情取决于你,但是应该可以进行pristine提交和使用rebase,把它放在树的开头,添加每个文件,然后重放每个提交。