2017-05-05 36 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的一些提示。基本上,我建議在當前主設備上創建一個新分支,將主設備重置爲其原始提交,然後將更新提交給主設備並重新分配新分支以編輯其歷史記錄,以使您滿意。