【发布时间】:2014-04-10 15:35:09
【问题描述】:
我使用git init 创建了一个新的仓库,然后提交了三个。现在我想重新定位以返回并修改我的第一个提交,但如果我这样做 git rebase -i HEAD~3 它会抱怨!如果我对HEAD~2 尝试相同的操作,那么它会起作用,但只能让我重新排列最后两个提交。
如何引用“有任何提交之前的提交”或返回并插入一个空提交?
【问题讨论】:
标签: git git-rebase
我使用git init 创建了一个新的仓库,然后提交了三个。现在我想重新定位以返回并修改我的第一个提交,但如果我这样做 git rebase -i HEAD~3 它会抱怨!如果我对HEAD~2 尝试相同的操作,那么它会起作用,但只能让我重新排列最后两个提交。
如何引用“有任何提交之前的提交”或返回并插入一个空提交?
【问题讨论】:
标签: git git-rebase
简单的方法,使用足够新的 git(这已经很久了,所以你应该有这个):
git rebase -i --root
另一种简单的方法,如twalberg noted in a comment,是使用git checkout --orphan 设置进行新的根提交,您可以在其上复制旧提交。 (这就是 rebase -i --root 最终在内部做的事情。)
【讨论】:
git rebase -i --root 尝试压缩第二次提交时出现错误error: cannot 'fixup' without a previous commit(我只想要第一次)
pick。将 second pick 更改为 squash 或 fixup,写出指令表,退出编辑器,Git 应该会完成这项工作。
--root 与 Git 1.6.2 一起使用,改进的版本在 1.7.12 中使用)。 “炸毁”是什么意思?
torek's answer 如果您想对已经在提交中的文件进行更改、编辑作者/消息等,那很好。但是如果您想拆分提交或类似的东西,那么您很可能是会遇到麻烦,因为您不能从初始提交中执行git reset HEAD~。
为此,您可以像这样插入一个空的初始提交:
git checkout --orphan empty-initial-commit
git commit --allow-empty -m 'Empty initial commit'
git checkout <branch>
git rebase empty-initial-commit
git branch -d empty-initial-commit
然后你可以做git rebase -i,编辑提交(第一个非空提交),然后像平常一样做git reset HEAD~。
【讨论】: