如何将git-replace推送到远程仓库?

mik*_*may 8 git

我用"git replace"替换了一个分支(没有共同的祖先)22b2b25来代替master中的提交.我希望这种改变是永久性的.我对以前的历史不感兴趣.在下面的输出中,前五个提交来自原始主分支,而底部2来自不同的分支.

当我把它推到一个新的存储库时,git-replace丢失了,旧的历史又重新出现了.有没有办法让这种变化永久化?

分支大师在原始仓库中看起来像下面.我希望在远程仓库和后续克隆中看到这一点.

[mike@localhost canal_site]$ git log --oneline --decorate
cdf0ae3 (HEAD, origin/master, master) MM: sqlencode course name for ad-hoc courses
2b57df5 MM: fixes for changes so far
7916eaf MM: ad hoc - more refactoring
1e00d22 MM: reformatted code
e36cee1 factored out equal ops
22b2b25 (origin/prod20140313, prod20140313) initial load from production 9-June-2015
08379cd initial inclusion of production files from 9-June-2015
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 10

git replace 单独是不够的:替换一个提交是不够的.

现在,下一次提交必须将替换的提交引用为父级.

正如" 从git中删除一大堆提交 "中所提到的:

通过git clone备份你的repo.
在你不喜欢的提交之后找出你喜欢的第一个提交,并记住它的直接祖先的哈希值(在下面bbb).
然后在您不喜欢的提交之前找到您喜欢的第一个提交(在下面aaa):

git replace bbb aaa
Run Code Online (Sandbox Code Playgroud)

查看您的存储库(with git log)并检查在您的预期更改之后是否一切正常.
但该replace命令只是添加了一些元信息.git/refs/replace,git命令相应地解释.
为了使这些更改永久化,您可以使用git filter-branch:

git filter-branch -- --all
Run Code Online (Sandbox Code Playgroud)

然后,您需要强制推送(git push --force)以使用分支的新历史覆盖远程仓库.或者你只是推动一个新的空裸仓库.