Git: 如何压缩`master`分支上的所有提交记录?

26
我正在寻找一种将所有git提交压缩成单个大提交的方法,以应用在主分支(master branch)中。我充分理解我所要做的事情的后果,不需要解释这很危险或者这不是正确的做法。我想失去我的所有历史记录,并将此存储库转换为单个大提交。
主要问题是:我没有其他活动分支,没有本地提交记录,并且以前的所有提交记录都已经被推送到了远程主分支(master)。
欢迎使用hacky脚本。

我脑海中首先想到的是:git rebase -i <first-commit-hash>。然后使用编辑器的查询替换功能将所有的 pick 替换为 squash 并保存。最后执行 git push --force - JB Nizet
https://stackoverflow.com/search?q=%5Bgit%5D+squash+all+commits - phd
嗯,有很多解决方案,不确定哪一个是正确的。 - milosmns
2个回答

63

我会使用 git reset --soft

git reset --soft id-of-first-revision-of-master
git commit --amend -m "single commit for master"

然后你可以在需要新分支的地方使用git push --force命令。

更新

我可以想到另一种更多Git命令的简单方法:

git checkout --orphan some-branch
git commit -m "First commit"
git branch -f master # move the local branch
git checkout master
git branch -d some-branch # delete the temp branch

也可以像这样以更hackish的方式完成:

git commit-tree -m "First commit" HEAD^{tree}

如果你进行检查,那么这将会写入一个修订版本......你将只有一个修订版本,内容会与你之前的位置完全相同......随意移动本地分支(如前面的提示所述)


@eftshift0,git命令git checkout --orphan -b some-branch导致错误fatal: 'some-branch'不是提交和分支'-b'无法从中创建。您是否实际意味着git checkout --orphan some-branch`? - Boris
可能没有-b也可以。我的意思是,如果你正在检出一个“--orphan”,那么它就是一个新分支,对吧?那么就不需要指定-b。也许这就是逻辑。 - eftshift0

14

您仍然可以使用git push --force-with-lease在上游修改历史记录。 但是,您必须意识到后果。

使用git push --force将在上游创建一个并行树,因此所有开发人员可能会在旧分支中迷失。

为了压缩您的历史记录,请执行以下操作:

git rebase -i HEAD~10

如果您想要将所有提交压缩在一起,则将<first-commit-hash>代替HEAD~10。然后在编辑器中,选择squash将所有要分组的提交都压缩在一起,其中10是您要压缩的提交数加1。您可以进行搜索/替换:pick改为squash

完成后,只需推送您的更改即可:

git push --force-with-lease

我永远不会建议使用--force,因为如果另一个开发者同时推送了一次提交,你将覆盖他的更改。使用--force-with-lease,Git将防止您在其他人在您最后更改的基础上进行推送(有关详细信息,请参见此问题)。


21
我认为,你可以使用 git rebase -i --root 命令将所有提交的代码都变基到最初的提交,而不是使用 <first-commit-hash> - Ru Chern Chong
2
--root参数对我很有用。使用HEAD~number或第一个提交哈希的解决方案对我不起作用 - 它们会结束两个提交,而不是仅一个。 - eNca
1
完美的@RuChernChong,谢谢你,使用--root也对我有帮助。 - Fernando Torres

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接