@
mrsatangel 感谢。你的方案可行。
我原本以为本地截断后,不能强行推送到远端。原来是可以的。
不过你提到
“为当前的这个 branch 新建一个临时的 branch:`git branch tmp`,然后将 tmp branch 推送到远程的 repo 里想要更新的 branch (如 master ):`git push <remoteRepoName> tmp:<remoteBranchName>`,此时远程 repo 里面的**<remoteBranchName>**已经将**newRoot**之前的所有 commit 对象删除。”
感觉这个 tem branch 是多余的吧。直接强推截断的 master 就可以的。
另外对你的答案补充下;
假如你有如下的分支结构图
现在想从"57dd13f even"这个点截断。保留这个点上面的所有分支和 commit
首先需要 git push origin :test 将 test 分支删除。也就是说截断点以下的所有都删除。
再者 将截断点以上的所有分支都在本地有追踪分支 git checkout -b new origin/new
之后就执行
“在`.git/info/`下建立`grafts`文件,在其中输入`newRoot`对象的 SHA1 值,保存。此时使用`git log`命令应该只能看到`newRoot`的 commit 记录。
之后使用`git filter-branch`使这个新建的 root 生效. ”
最后执行
将本地所有分支都强推到远端一遍。
本例就是 git push --force origin master:master 和 git push --force origin new:new
哦对了,还要删除 original 文件夹保存的临时记录
rm -r .git/refs/original/
最后效果:
其实这样的好处还有一个就是,所有 clone 这个仓库的本地仓库都可以执行一个相同的脚本。这样就不用大家都重新 clone 了,本地的 branch 和没有推送的 commit 也可以保留。
不知道理解对不对。可以再讨论。