我在主分公司工作,并没有意识到这一点。我做了一个本地提交' a。在那之后我做了git pull
,这带来了提交' b'。之后我又做了一次本地提交' c。所以现在我的HEAD正在提交'。如何使用提交创建另一个分支' a'和' c'?基本上这些提交应该从本地主服务器中删除并放到新的分支。
之后,我需要通过推送此分支来创建拉取请求。
答案 0 :(得分:1)
GIT中有很多选项。这是另一个。 按照您的示例并假设您当前在主分支上,您可以:
创建一个您想要在最后一个"适当的"提交(可能是在你提交之前出现的那个' a',让我们称之为X,实际上它会有一些SHA1):
git checkout -b mygoodbranch X
现在你将自动切换到这个分支,并确保(仅为了理解)最后一次提交确实是X.要查看最后一次提交,请输入以下内容并检查:
git log -1
它的时间以某种方式只移动你的提交,对吧?在git中,分支只是指向提交图的指针。这就是为什么分支创建便宜而快速,BTW。因此,在创建分支时,只需创建另一个指向其中一个提交的指针。 我们将在这里采摘樱桃。这个概念基本上意味着你可以采取任意的提交和" cherry-pick"它到你的分支。提交将具有相同的消息但不同的SHA1。因此,我们将在此处识别仅提交 a 和 c 的SHA1-s(您不需要提交b,因为您希望保持分支清洁其他的提交,右)? 在分支 mygoodbranch 时输入:
git cherry-pick <sha1 of a>
git cherry-pick <sha1 of b>
检查结果:
git log -3
您确实会看到您的分支现在包含提交a和c,但它们与原始提交具有不同的SHA1。在这一点上理解git认为原始和你的分支是不同的提交很重要(因为相同的提交具有相同的sha1,这显然不是这里的情况)。 但是谁在乎呢,我们会重新开始#34;重置&#34; master提交X并且它不再包含原始提交a b c。我们要做的是移动主人的指针&#34; HEAD&#34; (当前主分支状态)提交X,我们将:
切换回主人
git checkout master
执行实际重置:
git reset --hard x_sha1
检查结果(当然是在掌握时):
git log -1
完成! 我知道这比同事提供的解释要长得多。我只是想表明git有很多不同的选项来实现你想要的东西,你总能找到最适合你的那个。
答案 1 :(得分:0)
有关提示,请参阅git: how to move a branch's root two commits back。基本上,我建议在当前主服务器上创建一个新分支,将主服务器重置为其原始提交,然后将更新提取到主服务器并重新定位新分支以编辑其历史记录,使其满意。