Git:在新的分支中重新开始,从历史记录中删除提交



第一个问题!

我们正在使用git来控制一个项目的版本。我们的仓库是这样的:

master: C0-C1-C2-C3-C4
                            
    development: C5-C6-C7

当我们开始这个项目时,我们被建议使用gitflow工作流。不管怎么说,因为我们是一个小团队,以前没有git的经验,在一个相当小的项目上工作,我们现在认为这可能是多余的。相反,我们想开始使用一个特征分支模型。

长话短说,我们想要这样的东西:

master: C0-C1-C2-C5-C6-C7

所以从C7开始,我们可以从头开始(但保留我们到现在所做的),但现在使用单独的分支功能。

如您所见,我们还想去掉C3C4。这是因为它们是完全无用的(这些提交添加了一些在C6C7中添加的文件),也因为我们希望从一个单一的,干净的主分支开始,在我们的历史中没有合并。

我以为这很简单,但是在谷歌上搜索了几个小时后,我有点迷路了。我读到创建一个新的孤立分支,复制C7的内容,然后删除我的其他分支,但我不确定这是否是正确的方法。

哦,顺便说一下,我们不能创建一个新的回购。这是在学术课程的背景下给我们的一个私人回购,也是我们唯一拥有的一个。

你想

C0-C1-C2-C5-C6-C7 [master]

当您像这样查看您的存储库时,问题就变得简单了。

C0-C1-C2-C5-C6-C7 [development]
       
        C3-C4 [master]

"Branches"只是提交时的标签。它们可以按照您的喜好进行重命名和移动。development已经在你想要的master的位置了。所以重命名masterdevelopment

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

现在你可以重新排序,选择和编辑你想要保留的提交。不要忘记推送你重新组织的分支,并通知你的同事拉出"新"分支,这样他们就不会将任何旧的提交推回你的存储库。

最新更新