在Git中扁平旧历史

时间:2010-12-22 06:37:05

标签: git git-rebase

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

我检查了git rebase -i,但这并没有删除包含git所有提交的其他(完整)历史记录。

这里是图形表示(d是变更集):

(base) -> d1 -> d2 -> d3 -> (HEAD)

我想要的是:

(base) -> d1,d2 -> d3 -> (HEAD)

怎么可以这样做? 感谢。

编辑

我使用了

git rebase -i cd1e8c9

使用cd1e8c9作为压缩的起始修订版(基础)。然后我使用fixup将修订版本合并在一起。感谢。

4 个答案:

答案 0 :(得分:16)

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

假设您在分行中想要展平。首先检查它是否干净:

git status -s

上述命令不应输出任何内容。

现在创建一个孤儿分支:

git checkout --orphan flattened

添加所有文件

git add .

创建单一提交

git commit -m "Initial flattened commit"

检查一切是否符合要求并推送到远程(ex):

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 

答案 1 :(得分:4)

我不太习惯进行变基,所以在一个单独的克隆上尝试这个,看看它是否适用于你真正的工作空间。

这是我的提交

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 (Added d)重新定位到21790602bd6c0a009899ea33e64fec63559c0a76(第一次提交)并将它们全部压缩,然后使用此命令执行此操作

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

这是你要找的吗?

答案 2 :(得分:4)

squash使用git rebase --interactive各自提交为一个。

答案 3 :(得分:0)

这可能看似非常规,但如果您不关心历史记录,并且存储库只有单个master分支,尚未发布到Github.com或其他网站,你可以:

  1. 删除repo根目录中隐藏的.git文件夹
  2. git init
  3. 提交
  4. 请记住,第一步将清除所有git数据,包括分支和提交,所以请小心。