2012-07-12 196 views
1

我得到了一个项目文件,就像这样:跟踪更改

MyProject/ 
    a.txt 
    b.txt 
    c.txt 

我在目录初始化一个Git回购,但(愚蠢)没有添加所有文件到开始回购。相反,在我意识到需要更改它们之前,我将文件添加到回购中。

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

这是全部在一个分支上吗? – vergenzt 2012-07-12 17:14:57

+0

@vergenzt是的,所有在主分支。 – Phrogz 2012-07-12 17:19:43

+0

此外,只是为了澄清,这是准确的:你目前的回购显示'b.txt'和'c.txt'已被创建在后来的提交中,但你希望它显示它们已被创建(作为初始提交中的原始副本),以下提交只是更改它们? **编辑:**没关系,我想我现在明白你的问题。 – vergenzt 2012-07-12 17:20:14

回答

3

使用您的原始快照并创建一个新的git存储库(添加所有文件并提交它们)。

在当前的仓库,做

git remote add pristine /path/to/pristine/repository 

事后

git remote update pristine 

现在,您可以参考原始仓库的主人在git diff

git diff pristine/master 

看到之间的完全差异你的工作目录和原始提交。如果您只需要变更集,--summary应该是您正在寻找的选项。 git diff手册页详细介绍了所有其他交换机。

这应该会导致一个变更集,其中已经添加的文件与已经修改但未添加的文件不同。

你以后要做什么取决于你,但应该可以采用原始提交并使用rebase,将其放在树的开头,添加每个文件,然后重播每个提交。

+1

如果你使用'git remote update pristine'来获取原始的repo,那么你可以使用'pristine/master'来引用它的主分支,而不是在某处乱写hash:可能会使得这个过程更加简单和强壮。 – araqnid 2012-07-12 17:32:50

+0

谢谢,编辑它。 – Femaref 2012-07-12 17:54:20