2017-05-05 86 views
0

我在master分支上工作并没有意识到这一点。我做了一个本地提交'a'。之后,我做了git pull,它提交了'b'。之后,我做了另一个本地提交'c'。所以现在我的HEAD在提交'c'。如何用提交'a'和'c'创建另一个分支?实质上,这些提交应该从本地主服务器中删除并放到新分支中。git创建具有特定提交的分支

之后,我需要通过推这个分支来创建一个拉请求。

+0

的可能的复制[混帐:如何将一个分支的根两次提交回(http://stackoverflow.com/questions/43531189/git-how-to-move-a-branchs-root-two -commits-back) –

+0

你的情况比上面的链接稍微复杂一些。希望它仍会给你一个出发点。 –

回答

1

GIT有很多选项。这是另一个。 追随你的例子,假设您目前所掌握的分支,您可以:

  1. 建立一个新分支,你想工作在出最后一个“适当的”承诺(可能是你之前出现的一个你提交的“A”,让我们把它叫做X,在现实中,它会有一些SHA1):

    git checkout -b mygoodbranch X

  2. 现在,你就会自动切换到这个分支,并确保(只是为了便于理解),其最后一次提交确实是X.要查看最后一次提交,请键入以下内容并检查:

    git log -1

  3. 它的时间,不知何故只移动你的提交,对吧?在git中,分支只是一个指向提交图的指针。这就是为什么分支创建便宜且快速的原因。所以当你创建一个分支时,只需创建另一个指向其中一个提交的指针。 我们将在这里与樱桃采摘。这个概念基本上意味着你可以采取任意的提交方式并将它“挑选”给你的分支。提交将具有相同的消息,但具有不同的SHA1。所以我们将在这里确定只提交你的提交ac的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已经所以我们将:

  4. 切换回掌握

    git checkout master

  5. 执行实际复位:

    git reset --hard x_sha1

  6. 检查结果(而被上当然主):

    git log -1

    完成! 我知道这比我的同事提供的解释要长得多。我只是想表明git有很多不同的选择来实现你想要的,你总能找到最适合你的那个。

+0

因此,当我在步骤5中执行'git reset --hard'时,它会将远程头部的头部重置?当我在第6步做'git log -1'时,我应该看到提交b的SHA? – nishant

+0

对不起,它可能在一个格式问题。我的意思是最后一个参数是提交x的sha1。 Git重置只会将指针移动到您告诉它的任何位置。希望这可以帮助 –

0

查看git: how to move a branch's root two commits back的一些提示。基本上,我建议在当前主设备上创建一个新分支,将主设备重置为其原始提交,然后将更新提交给主设备并重新分配新分支以编辑其历史记录,以使您满意。

相关问题