2016-06-29 23 views
0

如何在做出更改後恢復線性歷史記錄然後執行pull(無衝突),然後執行/ push(創建人工分支和合並)。清除拉/推後的git歷史記錄並且無衝突地轉移

有幾個人在同一個分支上工作,但在單獨的文件/文件夾中。在提交之前,git有時會指出必須在提交完成之前從存儲庫中取出一些更改。在沒有衝突的成功拉動之後,新代碼將被提交併推送。然而,git的歷史,現在看起來就像這樣:

git tree with branches

我所期望的,因爲是在合併沒有衝突的歷史是線性的。在做了一些閱讀之後,我明白如果沒有衝突,我應該做一個抓取,然後進行重新分配以獲得線性歷史記錄。但是,行爲已經完成。我怎樣才能恢復線性歷史?

git tree linear

回答

2

git rebase可以工作。假設當前分支爲master,並且第一個圖中的提交從底部到頂部標記。第一4個綠色是A B C d,接下來的5紫色是E F G H I,左2綠色J個K,右2紫色是L M和頂綠色是N.

git rebase --onto J D master 

,我們得到一個線性歷史A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'E'E是具有不同sha1的等價提交。

還有另一種方式

git rebase --onto I D master 

,我們得到一個線性的歷史A-B-C-D-E-F-G-H-I-J'-L'-M'

如果git rebase不是那麼清楚,也可以通過git resetgit cherry-pick來完成,前者爲剪切而後者爲移植。

由於K和N是合併提交,它們不應該存在於線性歷史記錄中。我們可以忽略它們。

git reset J --hard 
git cherry-pick E F G H I L M 
#or one by one: git cherry-pick E;git cherry-pick F;... 

最後我們得到線性歷史A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'

或者以另一種方式

git reset I --hard 
git cherry-pick J L M 

而我們得到的線性歷史A-B-C-D-E-F-G-H-I-J'-L'-M'。如果沒有衝突,這兩棵樹的內容相同。

1

mergepull不具有根據配置或參數等於fetch + merge,可以使pull等於fetch + rebase但如果你想要或手動執行的那些命令)將保持如果合併是快進的話,則表示線性歷史記錄,這意味着您正在合併的分支沒有獨特的提交。您還可以告知merge只在合併時執行合併,或者指示它永不保留線性歷史記錄,但始終創建​​合併提交。

A rebase總是保持線性歷史記錄。

是否存在衝突不會以任何方式影響歷史線性。

如果您想作爲線性歷史記錄,則使用mergerebase這一決定相對簡單。

如果您的操作的目標分支是本地分支,意味着它的唯一提交沒有被推送,您可以安全地執行rebase,因爲它只會影響您的本地歷史記錄。

如果您的操作的目標分支已被推送,即有獨特的提交已經推動,因此最終被其他人提取,你應該使用merge,並與非線性歷史一起生活,因爲你的所有同事都會討厭你,因爲每個人都必須構建一個非顯而易見的如果他們已經拉入你提交的這些提交,就會發生重新分配。

對於您當前的情況也是如此,因爲我瞭解您已推動您的合併更改,這意味着如果您將其更改爲線性歷史記錄,則會更改已發佈歷史記錄,並且所有同事在您之後必須重新分配工作推動你改變的歷史。

如果你還沒有推動或不關心會擊中你的仇恨浪潮,你可以輕鬆地用rebasing來實現。如果你e。 G。可以從所有天鵝絨提交的底部開始進行第五次綠色提交,您可以簡單地簽出您的綠色分支並執行git rebase pink,您將以線性歷史記錄結束。