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

时间:2015-09-18 16:40:33

标签: git github version-control

第一个问题在这里!

我们正在使用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的内容然后删除我的其他分支,但我不确定这是否是正确的方法。

哦,顺便说一句,我们无法创建新的回购。这是一个在学术课程中给我们的私人回购,它是我们唯一拥有的回购。

提前致谢。

3 个答案:

答案 0 :(得分:2)

你想要

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

当您查看存储库时,问题变得更加简单。

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

"分行"只是提交上的标签。它们可以根据需要重命名和移动。 development已经是你想要master的地方了。因此,请重命名masterdevelopment

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;分支,所以他们不会将任何旧的提交推回到您的存储库。

相关问题