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

问题描述 投票:0回答:1

我使用“git Replace”来替换分支(没有共同祖先)22b2b25 来替换 master 中的提交。 我希望这种改变是永久性的。 我对以前的历史不感兴趣。 在下面的输出中,前 5 个提交来自原始 master 分支,后 2 个来自不同的分支。

当我将其推送到新存储库时,git-replace 丢失了,旧的历史记录又出现了。 有没有办法让这种改变永久存在?

branch master 在原始仓库中看起来如下所示。 我想在远程仓库和后续克隆中看到这一点。

[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
1个回答
13
投票

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

下一个提交现在必须引用替换的提交作为父级。

更新(灵感来自Stephen的评论)

正如我在 2019 年 10 月的“可以破坏/重写历史的 Git 命令”中指出的那样,

git filter-branch
BFG
已过时。
git filter-repo
更容易使用,更高效。


原答案:

正如“从 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
)以使用分支的新历史记录覆盖远程存储库。
或者你可以推送到一个新的空的裸仓库。

© www.soinside.com 2019 - 2024. All rights reserved.