Git:如何压缩“master”分支上的所有提交?

mil*_*mns 10 git

我正在寻找一种方法将所有git 提交压缩到master分支中的单个大提交中。我完全理解我试图做的事情的后果,不需要解释这是危险的或者不是正确的方法 - 我想丢失我所有的历史并将这个存储库变成一个单一的大提交。

主要问题是:我没有其他活动分支,没有本地提交,并且之前的所有提交都已经推送到 remote master

也欢迎使用 Hacky 脚本。

eft*_*ft0 33

我会使用 git reset --soft

git reset --soft id-of-first-revision-of-master
git commit --amend -m "single commit for master"
Run Code Online (Sandbox Code Playgroud)

然后,您可以在需要新分支的任何地方推送 --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
Run Code Online (Sandbox Code Playgroud)

也可以这样做,以一种更黑客的方式:

git commit-tree -m "First commit" HEAD^{tree}
Run Code Online (Sandbox Code Playgroud)

这将写一个修订版......如果你检查它,你将有一个单一的修订版,内容将与你之前站立的地方完全一样......随意移动本地分支(如在以前的食谱)


now*_*wox 9

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

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

为了压缩您的历史,只需执行以下操作:

git rebase -i HEAD~10
Run Code Online (Sandbox Code Playgroud)

10您想要压缩在一起的提交数 + 1在哪里。如果你想压缩所有提交,那么只需引用你的<first-commit-hash>而不是HEAD~10. 然后在编辑器上squash为要组合在一起的所有提交选择。您可以进行搜索/替换:pick通过squash

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

git push --force-with-lease
Run Code Online (Sandbox Code Playgroud)

我永远不会推荐这样做,--force因为如果另一个开发人员在此期间推送了一个提交,您将删除它的移动。通过使用--force-with-leaseGit 将阻止您在其他人推送您上次更改的顶部时进行推送(有关更多详细信息,请参阅此问题)。

  • 我相信你可以使用 `git rebase -i --root` 来重新设置基础到初始提交,而不是使用 `&lt;first-commit-hash&gt;` (10认同)
  • `--root` 参数对我有用。“HEAD~number”或第一个提交哈希的解决方案对我来说不起作用 - 他们以两次提交结束 - 而不是唯一的一次。 (2认同)

归档时间:

查看次数:

9700 次

最近记录:

4 年,7 月 前