如何将整个存储库压缩到第一次提交?

我可以将base转换为第一次提交,但这将留给我2次提交。 有没有办法在第一个提交之前引用这个提交?


当前回答

一行6个字:

git checkout --orphan new_root_branch  &&  git commit

其他回答

对我来说是这样的: 我总共提交了4次,并使用了交互式rebase:

git rebase -i HEAD~3

第一次提交仍然存在,我最近进行了3次提交。

如果你卡在接下来出现的编辑器中,你会看到smth:

pick fda59df commit 1
pick x536897 commit 2
pick c01a668 commit 3

你必须先做出承诺,然后把其他人推到上面。你需要的是:

pick fda59df commit 1
squash x536897 commit 2
squash c01a668 commit 3

为此,使用INSERT键更改“插入”和“编辑”模式。

使用:wq保存并退出编辑器。如果您的光标位于这些提交行之间或其他位置,请按ESC并重试。

结果我有两次提交:第一次仍然存在,第二次带有“这是3次提交的组合”的消息。

详情请点击此处: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

echo "message" | git commit-tree HEAD^{tree}

这将创建一个带有HEAD树的孤立提交,并在stdout上输出其名称(SHA-1)。然后重置你的分支。

git reset SHA-1

要在一个步骤中完成上述工作:

git reset $(git commit-tree HEAD^{tree} -m "Initial commit.")

假设你有这些从06年到10年的提交。

您希望将06年后的提交合并为一个提交Id。

commit 10
commit 09  
commit 08  
commit 07  
commit 06

你可以软复位git。

git reset --soft "06"

然后,运行下面的命令将这些更改推送到远程分支。

git push origin HEAD --force

现在,您之前所做的所有提交都应该作为您的本地更改可用,您可以将所有这些提交合并到单个提交中。

现在,新的提交结构应该如下所示:

commit <new_commit_containing_all_7_8_9_10>
commit 06

我读过一些关于移植的东西,但从来没有深入研究过。

不管怎样,你可以手动压缩最后2次提交,就像这样:

git reset HEAD~1
git add -A
git commit --amend

我用HEAD^{tree}尝试了不同的命令,但从zsh得到了这个错误:

zsh: no matches found: HEAD^{tree}

这是ohmyzsh处理扩展的方式,查看这个问题了解更多细节: https://github.com/ohmyzsh/ohmyzsh/issues/449

最简单的解决方法是运行这个命令:

unsetopt nomatch