git - 在 Git 中展平旧历史

标签 git git-rebase

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

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

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

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

我想要的是:

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

这怎么可能? 谢谢。

编辑

我得到它的工作

git rebase -i cd1e8c9

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

最佳答案

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

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

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 

关于git - 在 Git 中展平旧历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4506758/

相关文章:

git - 为什么 Git 将随机的、不存在的目录或文件报告为未跟踪文件?

git - 在我的 emacs 文件中不断出现的这些 ^M 是什么?

git - "git rebase origin"与 "git rebase origin/master"

git - 在交互式 rebase 期间使用 git 的 prepare-commit-msg Hook

git - 将最新提交拆分为多个分支

git - 如果它是分支中唯一的提交,我该如何删除第一个也是唯一的提交?

c++ - 我应该如何与使用 Xcode 的开发人员协作?

git: stash 分支上的详细提交

git - 如何不对多个分支使用 rebase

git - 如何确定适用于 Windows 的 Git Credential Manager 的版本?