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 上可用,我认为我知道哪些文件很重要。

4

1 回答 1

3

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

在您当前的存储库中,执行

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

然后

git remote update pristine

您现在可以在git diff

git diff pristine/master   

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

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

之后如何处理取决于您,但是应该可以获取原始提交并使用 rebase,将其放在树的开头,添加每个文件,然后重播每个提交。

于 2012-07-12T17:19:51.320 回答