重写历史记录以包含分阶段文件

时间:2016-08-11 00:28:41

标签: git

我正在学习git而且我这样做了:

modify foo.file
git add foo.file
modify foo.file
git commit foo.file -m "yada yada"

当然,因为我包含了文件名,所以提交忽略了暂存的foo.file并提交了修改后的非暂存foo.file。目的是提交暂存的foo.file,然后添加第二个修改。应该更像是:

modify foo.file
git add foo.file
modify foo.file
git commit -m "yada yada"
git add foo.file
git commit -m "2nd change to foo"

如何重写历史记录以便我可以提交暂存的foo.file并使其看起来像是在第二次修改之前提交的?我的目标是让差异出现"正确"。记录在暂存文件(未提交)中的foo.file更改很重要,可能无法准确地重新创建它们。需要提交暂存的foo.file(不知何故),然后重写第一次提交以在错误提交之前移动跳过的更改

重现状态:

git init test
cd test
echo "1st version" > foo.file
git add foo.file
echo "2nd version" > foo.file
git commit foo.file -m "Was supposed to be 1st version"

1st version仍然存在于Git中,可以通过cat-file访问,但它不是任何提交的一部分,并且未在status中列出。

通过这样做我已经取得了一些进展:

git update-index --info-only --index-info
100644 <sha1-of-orphaned-modification> 0    foo.file

然后提交。

但是当我尝试使用

重新排序提交时
git rebase -i --root HEAD

Git认为第二次提交是一个修改,而不是一个新文件,并且无法执行rebase。我想我需要在索引更新中提供更多信息,但不知道是什么。

3 个答案:

答案 0 :(得分:0)

这个答案假定您在错误的提交之后没有提交过一堆提交。

首先,将您的状态重置为上一次提交。

git reset HEAD^

接下来,将其移动到您希望第一次提交的状态,暂存并提交它。然后进行第二组修改,再次进行阶段和提交。

答案 1 :(得分:0)

您可以进行第二次提交,然后尝试执行git rebase -i HEAD~2并在弹出的编辑器中交换两次提交的顺序。

答案 2 :(得分:0)

这需要重写历史记录,所以如果有人将他们的工作建立在提交之上,就不要这样做。

首先对上一次提交进行软重置 - 这将保持您的工作区域不变,但重置头部:

git reset --soft HEAD~1

然后以交互方式仅添加第一次提交所需的行:

git add -i foo.file
git commit -m "First commit"

之后,您可以添加&amp;提交其余的更改:

git add foo.file
git commit -m "Second commit"