2016-05-30 45 views
0

我们的一些开发人员已经在主服务器上提交了非工作提交。我想清理它,这样主服务器上的每个提交都是一个工作版本。如何将提交从主服务器排除到另一个分支

假设我们有如下的提交:

A - B - C - D - E - F 

如何提取一个或更多的提交到另一个分支:

A - B   E - F 
     \  /
     C - D 

编辑:

  • 提交C和d应除去。
+0

您是否还想从'master'分支中删除提交'C'和'D',还是只想将它们“提取”到另一个分支? –

+0

编辑的问题。 – SimpleMath

+2

您是否意识到,如果您从远程'master'分支中删除提交'C'和'D',那么许多开发人员可能会被迫删除其本地分支并从头开始提取? –

回答

2

执行:

git rebase -i B 

然后你可以选择和中引入的提交自B.

-i国旗代表互动,这意味着一个编辑器就会显示选择(默认情况下为vi,就像编辑提交消息时一样),并在每行中包含提交列表。您可以删除一行以跳过提交,替换提交的顺序,甚至可以将两个或多个提交合并为一个提交。

更多信息可在官方git文档的Rewriting History一章中找到。

1

因为你似乎能够容忍重写master分支的历史,尽管它是公共的(并可能在许多开发人员使用的),你可以考虑以下策略:

  • git cherry-pickCD提交到一个新的分支,顺序
  • git rebase --interactivemaster分支删除CD承诺

首先樱桃挑CD提交到一个新的分支:

git checkout new_branch 
git cherry-pick dk8cnj2 
git cherry-pick dn52bd6 

这里,cherry-pick后看起来很有趣的琴弦实际上是CD提交的SHA-1散列剂适量下面。这就是你如何告诉Git参考实际提交。

现在你已经打捞CD提交,你就可以开始一个互动变基从master分支删除:

git rebase -i HEAD~4 

这应该出现一个显示你最近的名单编辑4次提交(参见HEAD~4)像下面,在最古老的以最新:

pick dk8cnj2 Commit C 
pick dn52bd6 Commit D 
pick 9m38b2f Commit E 
pick ldkj093 Commit F 

删除(即删除)线提交CD,让你在编辑器中的以下内容:

pick 9m38b2f Commit E 
pick ldkj093 Commit F 

然后保存该文件,关闭它,然后继续变形。在此之后,您将有效拼接出您的master分支的CD提交。现在,既然你这样做本地,因为你也改写的master的历史,你将不得不迫使它推到仓库:

git push --force origin 

请记住,这将改写master历史分支机构,可能会导致与该分支机构合作的其他人感到困惑。解决这个问题的一种方法是告诉每个人在一天结束时冻结master的工作,然后完成交互式重新分配。第二天早上,每个人都删除他们的本地master并签出一份新的副本。

0

TMG提供的另一个交互式底座解决方案是在主设备上创建一个临时分支,将主设备重置为提交B并挑选需要保留的所有提交。

它给你这些命令。警告:请确保没有最新的变化,或存储它们。

// Starting point 
git checkout master 
// Create a new branch to avoid loosing some commit 
git branch tmp 
// Change master HEAD 
git reset --hard master commit_B 
// Get the commits you want 
git cherry-pick commit_E 
git cherry-pick commit_F 
// DONE, you can clean up tmp branch if you don't need commit C and D (you will loose them) 
git branch -D tmp 
相关问题