在 Git 中压平旧历史

问题描述 投票:0回答:5

我有一个已经运行了一段时间的 git 项目,现在我想扔掉旧的历史,比如从一开始到两年前的历史。我所说的“丢弃”是指将这段时间内的许多提交替换为一个执行相同操作的单个提交。

我检查了

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

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

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

我想要的是:

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

这怎么办?

git git-rebase
5个回答
40
投票

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

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

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 

4
投票

squash
使用
git rebase --interactive
将各自的提交合并为一个。


3
投票

我不太习惯进行变基操作,因此请先在单独的克隆上尝试一下,看看它是否有效,然后再在真正的工作空间上进行。

这是我的承诺

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

这是您要找的吗?


3
投票

这可能看起来非常规,但如果您不关心历史记录,并且存储库只有单个

master
分支并且尚未发布到Github.com或其他站点,您可以:

  1. 删除存储库根目录中隐藏的
    .git
    文件夹
  2. git init
  3. 承诺

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


0
投票

我可以使用它

git rebase -i cd1e8c9

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

这最初是作为问题的修订版 3 添加的。

© www.soinside.com 2019 - 2024. All rights reserved.