我在master分支上工作并没有意识到这一点。我做了一个本地提交'a'。之后,我做了git pull
,它提交了'b'。之后,我做了另一个本地提交'c'。所以现在我的HEAD在提交'c'。如何用提交'a'和'c'创建另一个分支?实质上,这些提交应该从本地主服务器中删除并放到新分支中。git创建具有特定提交的分支
之后,我需要通过推这个分支来创建一个拉请求。
我在master分支上工作并没有意识到这一点。我做了一个本地提交'a'。之后,我做了git pull
,它提交了'b'。之后,我做了另一个本地提交'c'。所以现在我的HEAD在提交'c'。如何用提交'a'和'c'创建另一个分支?实质上,这些提交应该从本地主服务器中删除并放到新分支中。git创建具有特定提交的分支
之后,我需要通过推这个分支来创建一个拉请求。
GIT有很多选项。这是另一个。 追随你的例子,假设您目前所掌握的分支,您可以:
建立一个新分支,你想工作在出最后一个“适当的”承诺(可能是你之前出现的一个你提交的“A”,让我们把它叫做X,在现实中,它会有一些SHA1):
git checkout -b mygoodbranch X
现在,你就会自动切换到这个分支,并确保(只是为了便于理解),其最后一次提交确实是X.要查看最后一次提交,请键入以下内容并检查:
git log -1
它的时间,不知何故只移动你的提交,对吧?在git中,分支只是一个指向提交图的指针。这就是为什么分支创建便宜且快速的原因。所以当你创建一个分支时,只需创建另一个指向其中一个提交的指针。 我们将在这里与樱桃采摘。这个概念基本上意味着你可以采取任意的提交方式并将它“挑选”给你的分支。提交将具有相同的消息,但具有不同的SHA1。所以我们将在这里确定只提交你的提交a和c的SHA1-s(你不需要提交b,因为你想保持你的分支不受其他提交的影响,对吧)? 虽然是分支mygoodbranch类型:
git cherry-pick <sha1 of a>
git cherry-pick <sha1 of b>
检查结果:
git log -3
你会看到,的确是你的分支现在包含一个承诺和c,但他们有不同于原始提交的SHA1。在这一点上理解git认为一个原始的和一个在你的分支是不同的提交是重要的(因为相同的提交具有相同的sha1,这在这里显然不是这种情况)。 但是,谁在乎,我们将“重置”主提交X,它不会再包含原始提交。我们要做的是将大师的“HEAD”(当前的主分支状态)的指针提交X已经所以我们将:
切换回掌握
git checkout master
执行实际复位:
git reset --hard x_sha1
检查结果(而被上当然主):
git log -1
完成! 我知道这比我的同事提供的解释要长得多。我只是想表明git有很多不同的选择来实现你想要的,你总能找到最适合你的那个。
因此,当我在步骤5中执行'git reset --hard'时,它会将远程头部的头部重置?当我在第6步做'git log -1'时,我应该看到提交b的SHA? – nishant
对不起,它可能在一个格式问题。我的意思是最后一个参数是提交x的sha1。 Git重置只会将指针移动到您告诉它的任何位置。希望这可以帮助 –
查看git: how to move a branch's root two commits back的一些提示。基本上,我建议在当前主设备上创建一个新分支,将主设备重置为其原始提交,然后将更新提交给主设备并重新分配新分支以编辑其历史记录,以使您满意。
的可能的复制[混帐:如何将一个分支的根两次提交回(http://stackoverflow.com/questions/43531189/git-how-to-move-a-branchs-root-two -commits-back) –
你的情况比上面的链接稍微复杂一些。希望它仍会给你一个出发点。 –