【问题标题】:Git: How to squash all commits on `master` branch? [duplicate]Git:如何压缩“master”分支上的所有提交? [复制]
【发布时间】:2019-08-14 23:50:51
【问题描述】:

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

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

Hacky 脚本也受到欢迎。

【问题讨论】:

  • 我想到的第一件事:git rebase -i <first-commit-hash>。然后使用编辑器的查询替换功能将所有pick 替换为squash 并保存。然后git push --force.
  • 嗯,有很多解决方案所以这个,不知道哪个是对的

标签: git


【解决方案1】:

我会使用 git reset --soft

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

然后,您可以在需要该新分支的任何地方推送 --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

也可以像这样,以更骇人听闻的方式完成:

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

这将编写一个修订版....如果您检查它,您将有一个修订版,内容将与您之前所在的位置完全相同....随意移动本地分支(如前面的食谱中解释过)

【讨论】:

  • 这让我很开心
  • @eftshift0 git 命令git checkout --orphan -b some-branch 导致错误fatal: 'some-branch' is not a commit and a branch '-b' cannot be created from it。你的意思是git checkout --orphan some-branch
  • 没有 -b 可能有意义。我的意思是,如果您要查看--orphan,那么它就是一个new 分支,对吧?然后不需要指定-b。也许这就是逻辑。
【解决方案2】:

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

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

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

git rebase -i HEAD~10

10 是要合并在一起的提交数 + 1。如果您想压缩 所有 提交,则只需参考您的 <first-commit-hash> 而不是 HEAD~10。然后在编辑器上选择 squash 来将所有要组合在一起的提交。您可以搜索/替换:pick by squash

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

git push --force-with-lease

我绝不会推荐 --force,因为如果其他开发人员在此期间推送了提交,您将删除它的举动。通过使用--force-with-lease Git 将阻止您推送,如果其他人推送了您最后一次更改的顶部(请参阅question 了解更多详细信息)。

【讨论】:

  • 我相信您可以使用git rebase -i --root 来重新定位到初始提交,而不是使用<first-commit-hash>
  • --root 参数对我有用。 HEAD~number 或第一次提交哈希的解决方案对我不起作用-他们完成了两次提交-不是唯一的一次。
猜你喜欢
  • 2014-10-10
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
  • 2015-03-08
  • 2010-12-12
  • 1970-01-01
相关资源
最近更新 更多