移除/Cut off Git的版本/提交历史记录

21

我有一个项目,其中包含了指向我自己另一个项目的痕迹,我将其作为模板项目使用。现在我想完全从存储库中删除这些痕迹。基本上我想剪掉旧的无用提交记录。因此,我有:

A -- B -- C -- D -- E -- F

并且希望得到类似的结果

D -- E -- F

从代码仓库完全删除了A -- B -- C


2
重复问题。请在此处查看:https://dev59.com/D3RB5IYBdhLWcg3w1Kr0 - Snow Blind
6
不是重复内容。你不能使用 git rebase -i 命令来移除第一个提交记录。 - vergenzt
一个只有链接的答案,链接到了这个页面:https://help.github.com/articles/remove-sensitive-data/. - starball
3个回答

34

假设 master 所在的提交是 F

 # create a new branch with D's content
$ git checkout --orphan temp <d-sha1>
$ git commit

 # rebase everything else onto the temp branch
$ git rebase --onto temp <d-sha1> master

 # clean up
$ git checkout master
$ git branch -d temp

如果您想完全删除旧的松散对象 (A, B, & C),请确保您确实拥有所需的内容。这是不可逆转的。一旦您确认它是您想要的,运行:

$ git reflog expire --expire=now --all
$ git gc --prune=now

太棒了,谢谢!我猜“git push -f”会用新的覆盖远程仓库? - Alex
2
是的。但要小心,因为您正在编辑历史记录。如果其他人从您的存储库中拉取了内容,他们将会花费很长时间来弄清楚发生了什么。F不再是相同的提交,因此如果他们尝试提交到F并推送,它将无法正常工作。 - vergenzt
1
提交命令的附加标志:您可以使用 git commit -C <d-sha1> 以重用“原始”提交 D 的提交消息、作者、日期等。 - akavel
1
执行“git rebase --onto temp <d-sha1> master”命令后,我得到了“首先,将头倒回以重放您在其上的工作... 快进主分支到temp。” - maslick
有很多冲突,我们如何更改合并策略,以便自动解决冲突? - hsafarya
这最终只会在新的主分支上得到一个单独的提交,所以似乎无法实现期望的 D -- E -- F。 - Matt

0

我试图按照@vergenzt的答案操作,但是git开始从第一个提交应用补丁,这比我需要从中开始的提交要多3000个以上。

我的目的是为基于当前项目的新项目创建较小的repo。不幸的是,我需要保留当前项目的一些历史记录(几个月)。这就是我最终成功的方法:

命令行工具不太方便做到这一点,因为您需要解决冲突。幸运的是,TortoiseGit中有一个Rebase功能,您需要提供两个分支:master(左)和temp(右)。然后跳过所有在您的temp分支之前的提交,包括提交(选择提交并在右键菜单中使用“跳过”)。重新启动rebase后,您将得到一些冲突,您可以直接在rebase GUI中解决这些冲突。我总是在右键菜单中选择“使用主分支版本”。这比麻烦的CLI花费了更少的时间。

完成所有操作后,我还额外复制了原始存储库的最新版本中的所有项目文件到新存储库中的文件(覆盖所有内容),以确保没有任何丢失。我只得到了几个未被忽略的.gitignore文件。其他文件都是相同的。

希望这能帮助到某些人。


0

我知道这是一个老问题,但今天我在搜索这个主题时来到了这里...

针对大量提交的问题,您可以尝试在rebase命令中使用“-X theirs”或“-X ours”,即

git rebase -X theirs -i HEAD~20

两者之间的区别在这里解释

希望对某人有用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接