【问题标题】:How can I push git-replace to a remote repo?如何将 git-replace 推送到远程仓库?
【发布时间】:2015-08-29 23:48:09
【问题描述】:

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

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

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

[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

【问题讨论】:

  • @Mat 感谢重新格式化和投票。我宁愿认为是代码内容用于非代码让某人感到不安,但 -1 杀死了你的问题。

标签: git


【解决方案1】:

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

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

如“Removing a whole bunch of commits from git”中所述:

通过 git clone 备份你的 repo。
在你不喜欢的提交之后找出你喜欢的第一个提交并记住它的直接祖先的哈希(在下面的 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 commands that could break/rewrite the history”中指出的那样,git filter-branch 或 BFG 已过时。
git filter-repo 更易于使用且更高效。

【讨论】:

猜你喜欢
  • 2013-02-21
  • 2014-12-22
  • 2020-01-03
  • 1970-01-01
  • 2019-06-29
  • 2011-07-08
  • 2014-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多