2017-05-03 40 views
1

雖然交互式衍合和合並的一個分支我「託管」創建以下分支迴路:如何刪除不需要的Git分支「循環」

---a-----------g--h----m--n--- 
    \--b--c--d--e--f--/ 
  • 的B,C,d,e和f提交在調試過程中完成。
  • 的G和H的提交源於交互式衍合
  • m個承諾導致合併...
  • 我想保留A-G-H-M-N的歷史和擺脫-B-C-d-E-F的歷史。我怎麼能這樣做?

讓我澄清一下,我的目標是消除-B-C-d-E-F-歷史系,保持合併,並與單線-A-G-H-M-N-的歷史結束了。

+0

你的意思是,你想擺脫合併引入的所有變化? – mipadi

+2

Git是一個DAG指向的非循環圖。 Git中沒有循環。這看起來像一個正常的合併歷史。 – Makoto

+0

這是一個正常的歷史,但歷史的b-c-d-e-f部分相當於g-h部分,我想刪除b-c-d-e-f部分。 – budan

回答

-1

如果您想要從分支中刪除所有提交,最簡單的解決方案是使用git revert <commit>

在頁Undoing changes處描述了回覆的使用。

使用還原意味着歷史記錄保持不變,如果您已將代碼推送到遠程存儲庫,則此歷史記錄尤其有用。

+0

有人可以請解釋爲什麼這個答案被拒絕投票?我對'git revert'的理解是錯誤的嗎? – gerard

+0

我同意'revert'對於共享回購更安全並且通常是更好的選擇。如果我不得不猜測爲什麼這會得到DV'd:OP想要擺脫實際歷史,而不是恢復內容。內容被認爲是相同的(儘管我不認爲它是這樣),所以沒有什麼可以回覆的。 – Schwern

0

我想保留A-G-H-M-N的歷史和擺脫-B-C-d-E-F的歷史。 ...歷史的b-c-d-e-f部分相當於g-h部分,我想刪除b-c-d-e-f一部分。我該怎麼做?

---a-----------g--h----m--n--- 
    \--b--c--d--e--f--/ 

我並不完全相信這是一個好主意。如果a-g-h-m和a-b-c-d-e-f-m相等,則合併不會發生。你可以看看與git diff h f的差異並決定。

但是,這裏是如何做到這一點。

您需要消除m合併。你想是這樣的:

---a-----------g--h----n 
    \--b--c--d--e--f 

要做到這一點,你需要移動主回h,然後移植到nh。分行負責人(master是分行負責人)隨着git reset --hard移動。嫁接是用git cherry-pick完成的。

  • git checkout master
  • git reset --hard h移動masterh
  • git cherry-pick n repshches n轉到h

請注意,這將導致n有一個新的提交ID。如果n被推送,這會對其他貢獻者造成問題。任何擁有n的人在下次嘗試推或拉時都會收到錯誤消息,並且需要git pull --force

+0

Re。 「我不完全相信這是一個好主意」,當我看到提交'm'中的變化時,我收到一條消息,說明兩個內容是平等的。因此我得出結論:'b-c-d-e-f'=='g-h'。 – budan

+2

@budan如果您使用的是'git log -p m'之類的東西,我相信合併提交不會顯示任何更改,除非發生衝突。改爲嘗試'git diff h f'。 – Schwern

+0

事實上,比這更糟糕的是,即使存在衝突,'git log -1 -p '也不會顯示任何內容*。你需要'git log -1 -m -p '來得到兩個差異,或者'git log -1 -m --first-parent -p '來得到一個僅僅是第一個父親的差異。 – torek