我们的一些开发人员已经在主服务器上提交了非工作提交。我想清理它,这样主服务器上的每个提交都是一个工作版本。如何将提交从主服务器排除到另一个分支
假设我们有如下的提交:
A - B - C - D - E - F
如何提取一个或更多的提交到另一个分支:
A - B E - F
\ /
C - D
编辑:
- 提交C和d应除去。
我们的一些开发人员已经在主服务器上提交了非工作提交。我想清理它,这样主服务器上的每个提交都是一个工作版本。如何将提交从主服务器排除到另一个分支
假设我们有如下的提交:
A - B - C - D - E - F
如何提取一个或更多的提交到另一个分支:
A - B E - F
\ /
C - D
编辑:
执行:
git rebase -i B
然后你可以选择和中引入的提交自B.
的-i
国旗代表互动,这意味着一个编辑器就会显示选择(默认情况下为vi
,就像编辑提交消息时一样),并在每行中包含提交列表。您可以删除一行以跳过提交,替换提交的顺序,甚至可以将两个或多个提交合并为一个提交。
更多信息可在官方git文档的Rewriting History一章中找到。
因为你似乎能够容忍重写master
分支的历史,尽管它是公共的(并可能在许多开发人员使用的),你可以考虑以下策略:
git cherry-pick
的C
和D
提交到一个新的分支,顺序git rebase --interactive
的master
分支删除C
和D
承诺首先樱桃挑C
和D
提交到一个新的分支:
git checkout new_branch
git cherry-pick dk8cnj2
git cherry-pick dn52bd6
这里,cherry-pick
后看起来很有趣的琴弦实际上是C
和D
提交的SHA-1散列剂适量下面。这就是你如何告诉Git参考实际提交。
现在你已经打捞C
和D
提交,你就可以开始一个互动变基从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
删除(即删除)线提交C
和D
,让你在编辑器中的以下内容:
pick 9m38b2f Commit E
pick ldkj093 Commit F
然后保存该文件,关闭它,然后继续变形。在此之后,您将有效拼接出您的master
分支的C
和D
提交。现在,既然你这样做本地,因为你也改写的master
的历史,你将不得不迫使它推到仓库:
git push --force origin
请记住,这将改写的master
历史分支机构,可能会导致与该分支机构合作的其他人感到困惑。解决这个问题的一种方法是告诉每个人在一天结束时冻结master
的工作,然后完成交互式重新分配。第二天早上,每个人都删除他们的本地master
并签出一份新的副本。
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
您是否还想从'master'分支中删除提交'C'和'D',还是只想将它们“提取”到另一个分支? –
编辑的问题。 – SimpleMath
您是否意识到,如果您从远程'master'分支中删除提交'C'和'D',那么许多开发人员可能会被迫删除其本地分支并从头开始提取? –