我已经使用“ git replace”来替换分支(没有共同祖先)22b2b25来进行master提交。我希望此更改是永久的。我对以前的历史不感兴趣。在下面的输出中,前五个提交来自原始master分支,下两个提交来自另一个分支。
当我将其推送到新的存储库时,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
git replace
仅凭光是不够的:仅替换一次提交是不够的。
现在,下一个提交必须将替换后的提交作为父引用。
如“从git中删除一堆提交”所述:
通过git clone备份仓库。
在您不喜欢的提交之后找出您喜欢的第一个提交,并记住其直接祖先的哈希(在下文中bbb
)。
然后在您不喜欢的提交之前找到您喜欢的第一个提交(在以下内容中aaa
):
git replace bbb aaa
查看您的存储库(带有
git log
),并检查您的预期更改之后一切是否都应该保持原样。
但是该replace
命令只是将一些元信息添加到.git/refs/replace
,git命令会相应地解释这些信息。
为了使这些更改永久生效,您可以使用git filter-branch
:
git filter-branch -- --all
然后,您需要强制推送(git push --force),以便使用分支的新历史记录覆盖远程仓库。或者,您只需推送到一个新的空裸仓库。
更新(摘自Stephen的评论)
正如我在2019年10月的“可能破坏/重写历史记录的Git命令”中指出的那样,git filter-branch或BFG已过时。
git filter-repo
更容易使用和更高效。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句