用Git展平旧历史

用Git展平旧历史,git,git-rebase,Git,Git Rebase,我有一个git项目已经运行了一段时间,现在我想扔掉旧的历史,比如从一开始到两年前。我的意思是用一次提交来替换这段时间内的许多提交 我选中了git-rebase-I,但这不会删除包含git中所有提交的其他(完整)历史记录 此处为图形表示(d为变更集): 我想要的是: 这怎么可能呢? 谢谢 编辑 我和它一起工作 git rebase -i cd1e8c9 cd1e8c9是挤压的起始版本(基础)。然后,我用fixup将修订融合在一起。谢谢。我对重新定基不太满意,所以请在单独的克隆上尝试,看看它是否有

我有一个git项目已经运行了一段时间,现在我想扔掉旧的历史,比如从一开始到两年前。我的意思是用一次提交来替换这段时间内的许多提交

我选中了
git-rebase-I
,但这不会删除包含git中所有提交的其他(完整)历史记录

此处为图形表示(d为变更集):

我想要的是:

这怎么可能呢? 谢谢

编辑

我和它一起工作

git rebase -i cd1e8c9

cd1e8c9是挤压的起始版本(基础)。然后,我用fixup将修订融合在一起。谢谢。

我对重新定基不太满意,所以请在单独的克隆上尝试,看看它是否有效,然后再在您的实际工作空间中进行

这是我的承诺

noufal@sanitarium% git log --pretty=oneline
967122e7d4e687c0707d25c62cb0d3b6a45d337f Added h
3b82cae737d5fb3317bc7a686a2fdf0fdd9d1c7e Added g
94d89e0455b12e1e4843e64a8f62f3ad6cdf42f3 Added f
a30321b7a367d9b7da6369783650acadbb773cfb Added e
04453f1c90ffde0574c9c8a76f154d741d7d83f4 Added d
ec723a3266e56cc39967bf117154465575905e31 Added c
f415d1f58e2f7bd4beea80ab9acd8309bf5b64e7 Added b
7f1f8d1f903168aa929818a0eb81e0ec7743fb85 Added a
21790602bd6c0a009899ea33e64fec63559c0a76 Added it
我正在将
04453f1c90ffde0574c9c8a76f154d741d7d83f4(添加d)
重定基址到
217902bd6c009899ea33e64fec63559c0a76(第一次提交)上,并将它们全部压扁,我使用这个命令来完成

git rebase 04453f1c90ffde0574c9c8a76f154d741d7d83f4 --onto 21790602bd6c0a009899ea33e64fec63559c0a76
当我完成这个之后,日志看起来像这样

noufal@sanitarium% git log --pretty=oneline
c76290666c8b868d36290d8f5276b879bb78d05d Added h
7001ce74f0837b35c0b82abbb82ad8f40801449c Added g
051062042e56759d83258c5e90a9876aa6f52764 Added f
fb1a62b0c0faefa0110ef7b8eee01a13f2f62034 Added e
21790602bd6c0a009899ea33e64fec63559c0a76 Added it

这就是您要寻找的吗?

使用git rebase--interactive

将相应的提交压缩成一个提交,如果您并不真正关心整个历史,另一种简单的方法是使用当前分支并基于此创建孤立分支。然后将所有文件添加到此分支并进行一次初始提交(这将丢失所有历史记录)。然后可以将其推送到远程存储库

假设您位于要展平的分支中。首先检查它是否干净:

git status -s
上述命令不应输出任何内容

现在创建一个孤立分支:

git checkout --orphan flattened
添加所有文件

git add .
创建单个提交

git commit -m "Initial flattened commit"
检查所有内容是否符合要求,并推送到远程(ex):


这似乎很不传统,但如果您不关心历史记录,并且存储库只有一个
分支,尚未发布到Github.com或其他网站,您可以:

  • 删除repo根目录中隐藏的
    .git
    文件夹
  • git init
  • 承诺

  • 请记住,第一步将清除所有git数据,包括branch和commit,因此请小心。

    您使用的git版本是什么?我得到:用法:git-rebase。。。使用git版本1.7.3.1.msysgit.0和选项--root,我得到了您的结果,但是当我签出master时,旧的历史记录将再次显示。如何将其从历史记录中完全删除?您必须将提交(
    d1
    d2
    )压缩到
    d1
    )。这是通过使用
    重设基础来完成的。移动你的
    只会显示提交前的日志。然后我会尝试使用rebase。谢谢有没有办法,例如git rebase squash TAIL:58c5e9?据我所知(而且文档似乎没有说明),这是不可能的。这会删除git/对象吗?这可能与本打算执行的操作重复吗?尝试一下,我做了上面的操作,服务器只剩下原来的分支(主分支),没有更少的提交——事实上,它还有一个,就是刚刚推送的“扁平化”提交。拉到本地主服务器也显示了同样多的提交。这似乎没有什么作用。上面的命令序列应该创建一个新的分支,只包含一个提交,其中包含本地存储库开始时所在分支中的所有文件。最后一次推送使用“一次提交”分支覆盖远程主分支。这将删除主分支的所有历史记录。这可以用于以后收缩存储库以节省空间和带宽。也许你错过了或者输入错误了“git checkout——孤儿变平”这一步。我想我困惑的是,这一步在哪里会在本地上演。在留下我的评论后,我又挖了一些,这似乎使服务器上的东西变得平坦,但是如果你在本地从一个主服务器拉到另一个主服务器,你会得到1个新的提交-你的本地历史记录仍然不平坦,现在与服务器的历史记录有很大的不同。要真正使其平坦化,似乎每个人都需要重新克隆,而不是拉动,这至少需要在这里明确解释,因为这不太可能是某些人想要扁平化历史时想要的。上面的顺序是重写历史,以便所有本地存储库不会与远程分支的新内容有共同的提交。因此,每个人都需要从服务器上强制更新,或者像您提到的那样重新关闭存储库。它不是针对正常的git开发周期。它针对的问题是,您希望将内容保存在git中,但不关心历史。我们使用它来减少工具存储库所需的存储量。它的总容量已经增长到18GB,但头提交只需要不到1GB。没有人关心3个旧的JDK。有道理,只是在你的答案中加入一个最后的花絮,用命令强制从服务器拉到本地。
    git add .
    
    git commit -m "Initial flattened commit"
    
    git status -s
    
    # (original_branch being the branch with the full history)
    git diff original_branch..flattened  
    
    # (assuming your remote is origin and the branch to overide is master) 
    # Think twice before doing this!
    git push origin +flattened:master