2011-04-26 90 views
5

我以某种方式在分支中获得了一些重复的提交,每个都有相同的更改。这是一个公共分支,由几个用户从几个分支合并而成。我需要定期将这个分支重新分配到另一个回购的主分支上,这些重复使它变得笨拙。git:从公共分支删除重复的提交?

有没有办法删除这些并推送他们到公共回购w/out使其复杂的其他用户在分支机构工作?

+1

假设您认为从历史重写中恢复(即将原始公共分支中的所有内容重新分配到新分支)复杂,否则无法执行此操作。删除提交是重写历史记录。 – Cascabel 2011-04-26 20:16:17

+2

你确定你有重复的提交_on在同一个branch_?在我看来,唯一真正可行的方法是首先进行重新组装,然后合并之前重新组装的分支。然而,合并不会是快速的,并且合并的提交在技术上将是'从合并'而不是'从分支'(即,当仅跟随第一父母时,日志不会显示提交)。那有意义吗? – sehe 2011-04-26 21:04:43

+0

我认为sehe是对的 - 你得确保他们在同一个分支上。 “rebase -i”应该稍后澄清一下,因为如果问题确实存在,OP将马上看到 – 2011-04-27 15:16:15

回答

0

使用git filter-branch重写历史记录。下面是从GitHub一个很好的介绍:

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

+0

OP的问题的一个关键部分是“不会让其他用户变得复杂” - 这实际上是不可能的。他们将不得不采取一些措施来重写历史重写。 – Cascabel 2011-04-26 20:15:10

4

过滤分支没有必要在这种情况下恕我直言和Jefromi没有使生活变得有点复杂了其他人提到它是不可能的。 Git的第一条规则 - 不要重写已发布的历史记录。

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

为了做到这一点(想象分支在本地签出最后已知的良好状态之后,你已经开始得到这些重复的是20个提交前)

git checkout yourPublicBranch 
git rebase -i HEAD~20 

这会火起来的编辑器,您可以在其中管理提交。然后,你将不得不保存文件并退出rebase开始工作。这可能会导致冲突。

+0

我知道如何做交互式重新装订以摆脱提交。如果必须的话,我可以强制它进入公开回购。用户在完成同步后必须做些什么?如果他们没有对他们的本地分支进行任何更改(我知道(?)他们可以拉新分支并且没问题。但是,如果他们在此期间做出了自己的本地更改?谢谢。 – michael 2011-04-27 17:33:01

+1

您需要通知他们该分支的历史记录已被重写。然后他们必须: 1.“git fetch remoteName” - 这将更新远程跟踪分支,并将通知他们关于在感兴趣的分支上强制更新 2。如果他们在这个分支没有本地变化,他们可以拉动它并被覆盖。如果他们确实在跟踪这个重写过的地方布告上发生了变化,他们可以做“git pull --rebase”,所以他们的本地变化将在新的历史记录之上重新发布。如果他们有其他分支从这个公共分支衍生出来,他们也必须重新分配它们。 – 2011-04-27 17:39:46

+0

太好了,谢谢。我没有意识到它可以像他们做“git pull --rebase”一样简单。手指穿过那将照顾它。 – michael 2011-05-02 19:03:23