git rebase删除额外的初始提交

时间:2014-10-29 14:31:56

标签: git github rebase

我一直试图在我的回购开始时删除2个额外的提交 - 但是当我认为我成功时,我在github上推送一个空的回购,网络图表显示没有变化。

它是如何发生的:我的朋友推出了一个初始提交 - 一个10兆的库。我告诉他我们会重新开始,所以我没有拉,我做了一个新的初始提交和强制推动。我告诉他删除他的git文件夹,但他只删除了文件夹中的所有文件,不包括.git文件夹。当他拉,他做了合并提交,我暂时没有注意到。

现在我们的git历史的开头是这样的:

enter image description here

蓝色位是我的第二个初始提交。当他合并时,他只是用我的提交覆盖了所有内容。在这一点上,我已经尝试回到我在新分支中的初始提交并重新定位并确保我不“选择”他的初始提交,但是当我推送到空仓库时,他的额外初始提交再次出现。我还尝试回到标记为2的初始提交,并从标记为4的一个提交(从跳过其他初始提交1并合并提交3)开始每次提交。这两个都没有起作用,因为在rebase完成后,1和3仍然被推送到空回购。有没有办法删除1和3?由于3简单地抛弃了所有1,我认为它应该能够。

我使用的rebase命令是

git checkout -b tmpfix

git rebase --root -i

git branch -b tmpfix <sha1>

git cherry-pick <sha1>

1 个答案:

答案 0 :(得分:0)

我找到了自己的解决方案。繁琐,但值得回购的98%减少。我会尝试尽可能清楚地说明这一点--AFAIK这只适用于从初始提交中重写整个git历史记录。

Messed up git history

  • 假设主要回购在〜/ repo
  • 在〜/ newRepo中创建一个新的仓库(mkdir ~/newRepocd ~/newRepogit init
  • 将主回购的远程添加到newRepo(git remote add original git@github.com:...
  • 找到您要开始的提交。由于我的初始提交不正确,我开始使用我想要作为我的初始提交的提交(在我的图像中标记为2,我认为您可能必须从您预期的初始提交开始。如果您的预期初始提交有历史,您可以必须压扁它。)
  • 将原始遥控器提取到新的仓库(git fetch original
  • 开始挑选樱桃,从初始提交开始(git cherry-pick xxxxxxx用于单个提交,或git cherry-pick xxxxxxx^..xxxxxxx用于范围,包括在内)
  • 完成主分支后,转到来自主
  • 的所有分支
  • 找到另一个分支分支的提交(另一个分支和主分支之间的最后一个共享提交),在获取樱桃后,newRepo中的哈希值会有所不同,所以请仔细检查它,否则你将完全拉入事故的旧历史
  • 使用git checkout xxxxxxx
  • 跳转到该提交
  • 当你跳跃时,git应该给你一个命令(git checkout -b branch-name)来保存一个新的分支。确保与您所在的分支完全匹配。
  • 现在再次开始挑选,从对该分支的第一次唯一提交开始

完成主分支和所有连接分支后,强制推送应重写历史记录。

我还没有找到一种方法来保存分支和合并的历史记录 - 它最终成为我的一条连续线,但是任何未合并的分支仍然会显示出来。