【问题标题】:git: remove duplicate commits from public branch?git:从公共分支中删除重复的提交?
【发布时间】:2011-04-26 19:28:40
【问题描述】:

我不知何故在一个分支中有一些重复的提交,每个都有相同的更改。它是一个公共分支,由多个用户从多个分支合并而来。我需要定期将此分支 rebase 到另一个 repo 的 master 分支上,而这些重复使它变得笨拙。

有没有办法删除这些并将它们推送到公共 repo 而不会使在分支中工作的其他用户变得复杂?

【问题讨论】:

  • 假设您认为从历史重写中恢复(即将所有内容从原始公共分支重新定位到新分支)很复杂,不,没有办法做到这一点。删除提交就是改写历史。
  • 你确定你有重复的提交在同一个分支上?在我看来,发生这种情况的唯一真正方法是首先重新定位,然后合并以前重新定位的分支。但是,合并不会快进,并且合并的提交在技术上将是“来自合并”而不是“来自分支”(即,当仅关注第一个父母时,日志不会显示提交)。这有意义吗?
  • 我认为 sehe 是对的 - 你必须确保它们在同一个分支上。 “rebase -i”应该立即澄清这一点,因为如果问题真的如所描述的那样存在,OP 将能够立即看到
  • 是的,它们现在在同一个分支上,我可以在 git log 中看到它们。 gitx 显示它们最初来自不同的分支。我不知道这是怎么发生的,但毫无疑问我在做这件事的过程中搞砸了一些事情——我正在慢慢习惯 git。过去,我将分支重新定位到另一个仓库的主分支上,然后将其推送到公共仓库。有三个相同的提交,每个都有相同的更改。我通过为每个父提交创建一个补丁来检查它们,它们显示了相同的更改。当我尝试交互式变基时,它们都会出现。

标签: git rebase


【解决方案1】:

filter-branch 在这种情况下是不必要的,恕我直言,正如 Jefromi 所说,如果不让其他人的生活变得有点复杂,这是不可能的。 Git 的第一条规则 - 不要重写已发布的历史记录。

如果你真的想清理已经搞砸的分支,那么你应该在本地重新设置它,重新安排提交并在需要时将其强制推送到主线。

为了做到这一点(假设分支在本地签出,并且您开始获取这些副本的最后一个已知良好状态是 20 次提交前)

git checkout yourPublicBranch
git rebase -i HEAD~20

这将启动编辑器,您可以在其中管理提交。然后你必须保存文件并退出,以便 rebase 开始工作。这可能会导致冲突。

【讨论】:

  • 我知道如何进行交互式变基以摆脱提交。如果必须,我可以将其强制提交给公共回购。之后用户必须做什么才能同步?如果他们没有对我知道的分支的本地副本进行任何更改(?),他们可以拉新分支并没问题。但是,如果他们同时进行了自己的本地更改?谢谢。
  • 您需要通知他们该分支的历史记录已被重写。然后他们必须: 1."git fetch remoteName" - 这将更新远程跟踪分支,并通知他们感兴趣的分支上的强制更新 2. 如果他们在这个分支中没有本地更改,他们可以拉取它将被覆盖。如果他们在跟踪这个重写的分支中确实有更改,他们可以执行“git pull --rebase”,因此他们的本地更改将基于新历史记录。如果他们有从这个公共分支衍生的其他分支,他们也​​必须重新设置它们。
  • 太好了,谢谢。我没有意识到它可以像他们做“git pull --rebase”一样简单。手指交叉,这将解决它。
【解决方案2】:

使用 git filter-branch 重写历史记录。这是来自 github 的一个很好的介绍:

http://help.github.com/removing-sensitive-data/

【讨论】:

  • OP 问题的一个关键部分是“不让其他用户变得复杂”——这基本上是不可能的。他们总是需要采取一些措施才能从历史的改写中恢复过来。
猜你喜欢
  • 2022-10-15
  • 2017-01-24
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2014-09-01
  • 2014-03-23
  • 2016-12-29
  • 2021-08-02
相关资源
最近更新 更多