我正在学习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。我想我需要在索引更新中提供更多信息,但不知道是什么。
答案 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"