第一个问题在这里!
我们正在使用git进行项目的版本控制。我们的回购看起来像这样:
master: C0-C1-C2-C3-C4
\
development: C5-C6-C7
当我们启动项目时,建议我们使用gitflow工作流程。无论如何,由于我们是一个没有git经验的小团队,在一个相当小的项目上工作,我们现在认为这可能是过度的。相反,我们想开始使用feature branch model。
长话短说,我们想要这样的事情:
master: C0-C1-C2-C5-C6-C7
因此,从C7开始,我们可以“从头开始”(但保留我们迄今为止所做的),但现在使用单独的分支进行功能。
如您所见,我们还想摆脱 C3 和 C4 。这是因为它们完全无用(那些提交添加了一些在 C6 和 C7 中添加的文件),还因为我们想从一个单一的,干净的开始主分支,在我们的历史中没有合并。
我认为这很简单,但经过几个小时的谷歌搜索,我有点迷失。我读到了关于创建一个新的孤儿分支,复制C7的内容然后删除我的其他分支,但我不确定这是否是正确的方法。
哦,顺便说一句,我们无法创建新的回购。这是一个在学术课程中给我们的私人回购,它是我们唯一拥有的回购。
提前致谢。
答案 0 :(得分:2)
你想要
C0-C1-C2-C5-C6-C7 [master]
当您查看存储库时,问题变得更加简单。
C0-C1-C2-C5-C6-C7 [development]
\
C3-C4 [master]
"分行"只是提交上的标签。它们可以根据需要重命名和移动。 development
已经是你想要master
的地方了。因此,请重命名master
和development
。
git branch -m master old/master
git branch -m development master
Ta da!
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
恢复一段时间。
答案 1 :(得分:0)
我会做以下事情:
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
答案 2 :(得分:0)
你也可以用
来实现这个目标git checkout master
git rebase development
git reabse -i <SHA of initial commit> master
现在,您可以重新排序,选择和编辑要保留的提交。不要忘记推动你的重新分支的分支,并通知你的同事拉新的&#34;分支,所以他们不会将任何旧的提交推回到您的存储库。