如何将整个存储库压缩到第一次提交?
我可以将base转换为第一次提交,但这将留给我2次提交。 有没有办法在第一个提交之前引用这个提交?
如何将整个存储库压缩到第一次提交?
我可以将base转换为第一次提交,但这将留给我2次提交。 有没有办法在第一个提交之前引用这个提交?
当前回答
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.")
其他回答
以下是我最后是如何做到这一点的,以防其他人也能做到:
记住,做这样的事情总是有风险的,在开始之前创建一个保存分支从来都不是一个坏主意。
从日志开始
git log --oneline
滚动到第一次提交,复制SHA
git reset --soft <#sha#>
将<#sha#>替换为从日志中复制的sha
git status
确保所有内容都是绿色的,否则运行git add -A
git commit --amend
将当前所有更改修改为当前首次提交
现在强制推这个分支,它会覆盖那里的内容。
最简单的方法是使用'plumbing'命令update-ref删除当前分支。
你不能使用git branch -D,因为它有一个安全阀来阻止你删除当前的分支。
这会让你回到“初始提交”状态,在那里你可以开始一个新的初始提交。
git update-ref -d refs/heads/master
git commit -m "New initial commit"
用嫁接压扁
添加一个文件。git/info/grafts,把你想要成为根的提交散列放在那里
Git日志现在将从该提交开始
要让它“真实”运行git filter-branch
由于我在这里提出的解决方案中遇到了一些麻烦,我想分享一个非常简单的解决方案(将一个特性分支上的所有提交压缩成一个):
git merge origin/master && git reset --soft origin/master
前面的合并cmd确保,在提交时,没有来自master的最近更改会出现在您的头上!之后,只需提交更改并执行git push -f
我用HEAD^{tree}尝试了不同的命令,但从zsh得到了这个错误:
zsh: no matches found: HEAD^{tree}
这是ohmyzsh处理扩展的方式,查看这个问题了解更多细节: https://github.com/ohmyzsh/ohmyzsh/issues/449
最简单的解决方法是运行这个命令:
unsetopt nomatch