如何将整个存储库压缩到第一次提交?
我可以将base转换为第一次提交,但这将留给我2次提交。 有没有办法在第一个提交之前引用这个提交?
如何将整个存储库压缩到第一次提交?
我可以将base转换为第一次提交,但这将留给我2次提交。 有没有办法在第一个提交之前引用这个提交?
当前回答
用嫁接压扁
添加一个文件。git/info/grafts,把你想要成为根的提交散列放在那里
Git日志现在将从该提交开始
要让它“真实”运行git filter-branch
其他回答
以下是我最后是如何做到这一点的,以防其他人也能做到:
记住,做这样的事情总是有风险的,在开始之前创建一个保存分支从来都不是一个坏主意。
从日志开始
git log --oneline
滚动到第一次提交,复制SHA
git reset --soft <#sha#>
将<#sha#>替换为从日志中复制的sha
git status
确保所有内容都是绿色的,否则运行git add -A
git commit --amend
将当前所有更改修改为当前首次提交
现在强制推这个分支,它会覆盖那里的内容。
我读过一些关于移植的东西,但从来没有深入研究过。
不管怎样,你可以手动压缩最后2次提交,就像这样:
git reset HEAD~1
git add -A
git commit --amend
假设你的分支中有3个提交,并且它已经被推送到远程分支。
例子:
git log -4
将显示如下结果:
<your_third_commit_sha>
<your_second_commit_sha>
<your_first_commit_sha>
<master_branch_commit_sha - your branch created from master>
你想把最后3次提交压缩成一次提交,然后推送到远程分支。以下是步骤。
git reset --soft <master_branch_commit_sha>
现在所有提交的更改都被集成但未提交。验证:
git status
用一条消息提交所有更改:
git commit -m 'specify details'
强制将单次提交推到远程分支:
git push -f
这个答案改进了上面的几个(请投票),假设除了创建一个提交(no-parents - no-history),你还想保留该提交的所有提交数据:
作者(姓名及邮箱) 撰写日期 提交人(姓名及邮箱) 提交日期 提交日志消息
当然,新的/single提交的commit- sha会改变,因为它代表了一个新的(非)历史,变成了一个无父/根提交。
这可以通过读取git日志并为git提交树设置一些变量来实现。假设你想在一个新的分支one-commit中从master创建一个单独的提交,保留上面的commit-data:
git checkout -b one-commit master ## create new branch to reset
git reset --hard \
$(eval "$(git log master -n1 --format='\
COMMIT_MESSAGE="%B" \
GIT_AUTHOR_NAME="%an" \
GIT_AUTHOR_EMAIL="%ae" \
GIT_AUTHOR_DATE="%ad" \
GIT_COMMITTER_NAME="%cn" \
GIT_COMMITTER_EMAIL="%ce" \
GIT_COMMITTER_DATE="%cd"')" 'git commit-tree master^{tree} <<COMMITMESSAGE
$COMMIT_MESSAGE
COMMITMESSAGE
')
这对我来说效果最好。
git rebase -X ours -i master
这将使git更喜欢你的特性分支;避免艰苦的合并编辑。您的分支需要与主机同步。
ours
This resolves any number of heads, but the resulting tree of the merge is always that of the current
branch head, effectively ignoring all changes from all other branches. It is meant to be used to
supersede old development history of side branches. Note that this is different from the -Xours
option to the recursive merge strategy.