在Git中扁平旧历史

sch*_*tbi 13 git git-rebase

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

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

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

(base) -> d1 -> d2 -> d3 -> (HEAD)
Run Code Online (Sandbox Code Playgroud)

我想要的是:

(base) -> d1,d2 -> d3 -> (HEAD)
Run Code Online (Sandbox Code Playgroud)

怎么可以这样做?谢谢.

编辑

我得到了它

git rebase -i cd1e8c9
Run Code Online (Sandbox Code Playgroud)

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

mur*_*ybo 18

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

假设你在分支机构中想要展平.首先检查它是否干净:

git status -s
Run Code Online (Sandbox Code Playgroud)

上面的命令不应输出任何内容.

现在创建一个孤儿分支:

git checkout --orphan flattened
Run Code Online (Sandbox Code Playgroud)

添加所有文件

git add .
Run Code Online (Sandbox Code Playgroud)

创建单个提交

git commit -m "Initial flattened commit"
Run Code Online (Sandbox Code Playgroud)

检查一切是否符合要求并推送到远程(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 
Run Code Online (Sandbox Code Playgroud)

  • 上面的序列重写历史记录,以便所有本地存储库不会与远程分支的新内容有共同的提交。因此,每个人都需要从服务器强制更新,或者正如您提到的重新克隆存储库。它不针对正常的开发 git 周期。它针对的是你想将东西保存在 git 中但不关心历史记录的问题。我们用它来减少工具存储库所需的存储量。总共已经增长到 18GB,但头部提交只需要不到 1GB。没有人关心 3 个旧的 JDK。 (3认同)
  • 有道理,在您的答案中包含最后的花絮以及强制从服务器拉到本地的命令是有意义的。 (2认同)

Nou*_*him 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
Run Code Online (Sandbox Code Playgroud)

04453f1c90ffde0574c9c8a76f154d741d7d83f4 (Added d)将基于21790602bd6c0a009899ea33e64fec63559c0a76(第一次提交)并将其全部压缩,并使用此命令执行此操作

git rebase 04453f1c90ffde0574c9c8a76f154d741d7d83f4 --onto 21790602bd6c0a009899ea33e64fec63559c0a76
Run Code Online (Sandbox Code Playgroud)

完成此操作后,日志如下所示

noufal@sanitarium% git log --pretty=oneline
c76290666c8b868d36290d8f5276b879bb78d05d Added h
7001ce74f0837b35c0b82abbb82ad8f40801449c Added g
051062042e56759d83258c5e90a9876aa6f52764 Added f
fb1a62b0c0faefa0110ef7b8eee01a13f2f62034 Added e
21790602bd6c0a009899ea33e64fec63559c0a76 Added it
Run Code Online (Sandbox Code Playgroud)

这是您要找的东西吗?