【问题标题】:remove multiple commits from multiple merged branches从多个合并的分支中删除多个提交
【发布时间】:2019-11-09 22:37:12
【问题描述】:

有人给了我一个回购协议。我以为这是一个公司回购,我很高兴地开始创建分支,最后我将它们合并成一个,删除临时分支并推送。 今天他给我发消息说这是他的个人回购,所以如果可能的话,我最好从他的回购中删除我的烂摊子。我保存了我的工作并将其移至一个新的仓库,但我不知道如何删除提交,所以我不会用我的名字“玷污”他的历史:D

 git reset --hard hislastcommitsha 

不起作用。它移动了头部,但提交仍然存在。我什至可以检查出来。我希望他们像从未存在过一样消失。

我假设它们没有被删除,因为即使只有一个分支(主分支),这些提交来自多个分支(开发和主题分支)的先前合并。

我可以做些什么来从他的历史记录中删除我的提交/名称?

非常感谢

【问题讨论】:

  • 我们可以安全地假设您的意思是--hard而不是-hard,这只是您的问题中的一个错字吗?
  • 是的,只是一个错字,已修复。我确实使用--hard 运行,并且头部移动到 hislastcommitsha

标签: git commit reset


【解决方案1】:

(基本假设:您在 repo 上有足够的权限使用 --force 推送,因为相反,您的朋友要求您清理任何东西将是一个无法满足的要求)

当你推送分支 (master) 时,git 实际上推送了任何通过祖先可以访问的新 commits,从你的新 ref master 指向的提交开始时刻。

但是当您最初克隆原始存储库时,它自己的 master 版本指向我们试图在顶部恢复的提交,hislastcommitsha

所以你需要

# as you already guessed, rewind your version of master
git reset --hard hislastcommitsha

# then push it to his repo
git push --force origin master

但是,重要提示:此时,您(错误地)推送的新提交不会从他的仓库中删除,它们只是未被任何分支引用,因此它们现在是候选垃圾回收。

这就是您仍然可以在本地存储库中查看它们的原因。

如果您的朋友出于任何原因不想等待典型的垃圾收集时间,他可以选择使用 git gc 手动触发它,并且任何参数都适合您的情况,这取决于他。

【讨论】:

  • 我爱你 :) 做到了!我什至不需要等待垃圾收集。如果我现在克隆他的存储库,我的提交和名称就消失了。可能本地提交没有消失的原因是因为它们是由 origin/master 指向的,但是当我强制推送时,它们也在本地消失了,甚至在克隆之前。
  • @cmu111 是的,为你感到高兴 :-) 我不确定你的问题是数据库中仍然存在一段时间的“悬空”提交,或者只是历史行。
猜你喜欢
  • 2017-04-26
  • 2012-02-24
  • 2021-12-24
  • 2017-01-24
  • 2020-10-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
相关资源
最近更新 更多