如何在Git裸仓库中压缩旧提交且保留变更内容?
裸Git仓库中保留变更的提交压缩方案
Git的交互式变基(包括squash压缩操作)必须依赖工作区处理提交合并和信息编辑,裸仓库没有工作区所以直接执行会报错。要实现保留所有文件变更的提交压缩,正确流程是先在本地创建带工作区的仓库副本,处理完成后再推回裸仓库,具体步骤如下:
第一步:克隆裸仓库到本地,生成带工作区的普通仓库
git clone /path/to/your/bare-repo.git local-working-repo cd local-working-repo(如果裸仓库在远程服务器,替换路径为对应的SSH/HTTPS地址即可)
第二步:在本地仓库执行交互式变基,压缩目标提交
先查看提交历史确认操作范围:git log --oneline假设要保留D、E提交,压缩前面的A、B、C提交,找到对应提交的相对位置(比如要操作最近5个提交,就用
HEAD~5),执行变基:git rebase -i HEAD~5 # 数字根据实际提交数量调整,需包含所有要压缩和保留的提交在弹出的编辑界面中,把要压缩的提交(A、B、C)前的
pick改成s(或squash),只保留D、E的pick,保存退出后编辑合并提交的信息,完成后就能得到压缩后的提交历史,且所有文件变更均保留。第三步:强制推回裸仓库
由于修改了提交历史,必须用强制推送覆盖裸仓库的分支:git push origin <your-branch-name> --force注意:强制推送会覆盖远程分支历史,务必提前通知所有协作者,让他们拉取后执行
git pull --rebase同步新历史,避免冲突。
补充说明:git-filter-repo更适合批量修改提交元数据、过滤文件这类场景,要合并提交且保留变更的话,交互式变基是更直接安全的方式,不会丢失任何文件变更。
内容的提问来源于stack exchange,提问作者GopherM
相关产品推荐
相关产品推荐

