17

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

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

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

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

我想要的是:

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

怎么可能做到这一点?谢谢。

编辑

我得到了它的工作

git rebase -i cd1e8c9

cd1e8c9 是要压缩的开始修订(基础)。然后我使用 fixup 将修订合并在一起。谢谢。

4

4 回答 4

26

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

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

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 
于 2013-01-09T11:45:39.757 回答
5

我对做变基不是很舒服,所以在一个单独的克隆上试试这个,看看它是否有效,然后再在你的真实工作空间上做。

这是我的提交

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

这是你要找的吗?

于 2010-12-22T06:51:50.650 回答
4

squash使用git rebase --interactive.

于 2010-12-22T07:55:09.603 回答
1

这可能看起来不合常规,但是如果您不关心历史,并且存储库只有一个master分支并且尚未发布到 Github.com 或其他站点,您可以:

  1. 删除.gitrepo 根目录中的隐藏文件夹
  2. git init
  3. 犯罪

请记住,第一步将清除所有 git 数据,包括分支和提交,所以请小心。

于 2017-10-16T10:23:55.057 回答