我有一个已经运行了一段时间的 git 项目,现在我想扔掉旧的历史,比如从一开始到两年前的历史。我所说的“丢弃”是指将这段时间内的许多提交替换为一个执行相同操作的单个提交。
我检查了
git rebase -i
但这并没有删除包含来自 git 的所有提交的其他(完整)历史记录。
这是图形表示(d 是变更集):
(base) -> d1 -> d2 -> d3 -> (HEAD)
我想要的是:
(base) -> d1,d2 -> d3 -> (HEAD)
这怎么办?
如果您并不真正关心整个历史记录,另一种简单的方法是获取当前分支并基于此创建一个孤立分支。然后将所有文件添加到该分支并进行一次初始提交(这将丢失所有历史记录)。然后可以将其推送到远程存储库。
假设您位于要展平的分支中。首先检查是否干净:
git status -s
上述命令不应输出任何内容。
现在创建一个孤立分支:
git checkout --orphan flattened
添加所有文件
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
squash
使用 git rebase --interactive
将各自的提交合并为一个。
我不太习惯进行变基操作,因此请先在单独的克隆上尝试一下,看看它是否有效,然后再在真正的工作空间上进行。
这是我的承诺
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
这是您要找的吗?
这可能看起来非常规,但如果您不关心历史记录,并且存储库只有单个
master
分支并且尚未发布到Github.com或其他站点,您可以:
.git
文件夹git init
记住第一步会清除所有git数据,包括分支和提交,所以请小心。