第一个问题!
我们正在使用git来控制一个项目的版本。我们的仓库是这样的:
master: C0-C1-C2-C3-C4
development: C5-C6-C7
当我们开始这个项目时,我们被建议使用gitflow工作流。不管怎么说,因为我们是一个小团队,以前没有git的经验,在一个相当小的项目上工作,我们现在认为这可能是多余的。相反,我们想开始使用一个特征分支模型。
长话短说,我们想要这样的东西:
master: C0-C1-C2-C5-C6-C7
所以从C7开始,我们可以从头开始(但保留我们到现在所做的),但现在使用单独的分支功能。
如您所见,我们还想去掉C3和C4。这是因为它们是完全无用的(这些提交添加了一些在C6和C7中添加的文件),也因为我们希望从一个单一的,干净的主分支开始,在我们的历史中没有合并。我以为这很简单,但是在谷歌上搜索了几个小时后,我有点迷路了。我读到创建一个新的孤立分支,复制C7的内容,然后删除我的其他分支,但我不确定这是否是正确的方法。
哦,顺便说一下,我们不能创建一个新的回购。这是在学术课程的背景下给我们的一个私人回购,也是我们唯一拥有的一个。
你想
C0-C1-C2-C5-C6-C7 [master]
当您像这样查看您的存储库时,问题就变得简单了。
C0-C1-C2-C5-C6-C7 [development]
C3-C4 [master]
"Branches"只是提交时的标签。它们可以按照您的喜好进行重命名和移动。development
已经在你想要的master
的位置了。所以重命名master
和development
git branch -m master old/master
git branch -m development master
Ta哒!
C0-C1-C2-C5-C6-C7 [master]
C3-C4 [old/master]
由于您的master
已经偏离了远程master
,您将需要强制推送。
git push -u --force origin master
-u
将确保您的新master
分支跟踪远程master
。
最后,当你准备好了,删除old/master
。
git branch -D old/master
暂时还可以通过git reflog
恢复。
我会这样做:
git checkout master
git branch master_backup # Save the older master repo locally just in case
git reset --hard C2 # This sets the branch to C0-C1-C2
git cherry-pick C5..C7 # This sets the branch to C0-C1-C2-C5-C6-C7
您可能必须在最后一个命令中解决冲突。这不会产生任何合并提交,但会改变你的SHA1:
git mergetool
然后,替换远程主分支:
git push origin :master
git push origin master:master
也可以使用
git checkout master
git rebase development
git reabse -i <SHA of initial commit> master
现在你可以重新排序,选择和编辑你想要保留的提交。不要忘记推送你重新组织的分支,并通知你的同事拉出"新"分支,这样他们就不会将任何旧的提交推回你的存储库。