2011-03-16 136 views
210

假設我們有一個穩定的應用程序。何時刪除Git中的分支?

明天,有人會報告我們決定立即修復的一個大酒吧錯誤。因此,我們創建一個分支與該修補程序關「高手」,我們將其命名爲「2011_Hotfix」,我們向上推,使所有的開發人員可以修復它合作。

我們修復了該錯誤,並將「2011_Hotfix」合併到「master」以及當前的開發分支中。並推「主人」。

我們做什麼用「2011_Hotfix」現在呢?它是否應該永遠坐在那裏作爲一個分支直到時間的盡頭,或者我們現在應該刪除它,因爲它符合它的目的?由於分支機構的名單可能會變得很長,而且大部分都不再是必要的,所以看起來不太清楚分支機構到處都是。

在它應該被刪除的情況下,會發生什麼歷史?即使實際分支不再可用,這是否會被保留?另外,我將如何刪除遠程分支?

+20

通常可以將分支視爲想法。一個相當好的經驗法則是,如果你已經完成了分支所代表的想法 - 包括完成測試併合並這些改變(將它們合併成主) - 你就完成了分支本身。 – Cascabel 2011-03-17 04:30:16

+2

我想知道的是:如果遠程修補程序正在被刪除,它會在本地爲所有合作的開發者刪除嗎?如果不;如何做到這一點?我認爲有人將修補程序遷移到master,但在此之後,還應該清除所有協作者,以防止它們向該分支添加提交。 – rolandow 2015-12-22 10:17:02

+0

您不能影響您的同事電腦的本地存儲庫。你要麼告訴他在本地刪除分支,要麼你也可以用git hooks/branch security來強制執行這個服務器端,以防止你的分支被推到你想要刪除的地方 – srz2 2016-02-12 15:10:08

回答

130

您可以安全地刪除分支git branch -d yourbranch。如果它包含未合併的更改(即,您將通過刪除分支而失去提交),git會告訴您並且不會將其刪除。

所以,刪除合併分支便宜,不會讓你失去任何歷史。

要刪除遠程分支,請使用git push origin :mybranch,假設您的遠程名稱是源,並且要刪除的遠程分支名爲mybranch。

+25

「刪除一個合併的分支很便宜」它周圍。如果你保持它的話,那麼在git使用的時間或空間方面沒有明顯的性能影響。也就是說,我會刪除這個分支,因爲所有提交已經存在於'master'的歷史記錄中,所以它確實使事情變得更加簡潔。 – MatrixFrog 2011-03-17 03:37:58

+13

我想要刪除分支的原因之一是:我們對分支進行了很多更改(實際上,所有更改),因此最終在使用命令「git分支」時會得到一長串列表。對於概述,我想縮短這個列表。所以舊的分支將被刪除。 Reale版本被加了標籤,所以不在我這個討論中。 – 2014-05-21 06:59:15

+5

雖然我同意刪除已經合併的分支,但是如果你想看到還沒有合併到你當前分支的分支列表,你可以使用: git分支 - 不合並 – lsklyut 2014-09-29 13:54:13

1

如果它已成功合併回來,甚至可能被標記,那麼我會說它已經沒有用了。所以你可以安全地做git branch -d branchname

41

你需要做的是你釋放標籤什麼。當你積極發展時,保持分支。

刪除老枝與

git branch -d branch_name 

從服務器中刪除他們

git push origin --delete branch_name 

或舊的語法

git push origin :branch_name 

其內容爲 「沒有推入branch_name在原產地」 。

也就是說,只要DAG(有向無環圖)可以指向它,提交就會在歷史中出現。

谷歌「git-flow」,這可能會提供一些關於發佈管理,分支和標記的更多見解。

25

由於問題具有「github上」的標籤,我也補充一點:在Github具體地說,如果您拉請求一個分支,它被合併(通過用戶界面或者通過合併拉請求的分支),即使你刪除分支你不會失去拉請求數據(包括註釋),

這樣做的一個後果:如果您將拉取請求作爲工作流程的一部分(與代碼審閱完美融合),您可以在合併後儘快刪除分支。這很常見,以至於最近Github添加了一個(甜)功能,在合併請求後彈出一個「刪除分支」按鈕。

但值得注意的是,每個團隊都應該採用最適合它的工作流程(並且可能會或可能不會導致刪除此類分支)。例如,我的當前工作團隊在他們的拉取請求合併後立即修剪所有與主或與部署無關的分支(例如,生產,分段等),並且我們仍然完全跟蹤相關的提交是如何形成的每個產品的每個增量改進。

當然,沒有歷史管理(拉取請求或其他)會替換版本的正確標記(您最好使用部署/打包版本的相同工具/腳本自動化),所以您可以隨時快速切換到任何用戶恰好在某個特定的時刻。標記也是解決原始問題的關鍵:如果您確定合併到「工作」分支的任何分支可以並且應該被刪除,並且任何合併到版本標籤,「生產」等的分支不應該,您將始終擁有修補程序,直到它們被集成到未來的版本中。

+1

感謝您解釋爲什麼Github向我展示了一個「刪除分支」按鈕。 – 2014-06-15 02:56:15

+0

我們使用sourcetree,它提供了保持本地修補程序分支和遠程修補程序分支打開的選項。 **我認爲關閉修補程序分支意味着刪除它,並且您不能重新使用它。我們需要在接下來的5天內每天推送熱修復程序。然後我們關閉它。但是,讓我們說在第6天,我們需要另一個修補程序。我們是否創建了新的修補程序分支? – Danger14 2015-07-01 16:43:56

+0

這就是人們通常所做的。如果單獨命名它們是不可行的,您可以根據當天的名稱或管理它們的售票系統的參考資料(如果有的話)命名它們。當然,git工作流程應該應用於「適合您的團隊的最佳組合」的基礎上,所以如果您決定以不同的方式工作,請不要擔心。 – chesterbr 2015-07-04 04:33:42

6

我會補充說,刪除分支的缺點是你會打破任何超鏈接到GitHub上的這些分支(這個問題被標記爲github)。這些鏈接會出現404 Not Found錯誤。這就是爲什麼我在GitHub上刪除分支後,將鏈接更改爲指向提交或標記。

由於某些鏈接無法更改,例如在電子郵件中,我現在完全避免超鏈接到GitHub分支,並從第一天鏈接到提交或標記。

我更喜歡在合併後刪除分支。這可以防止存儲庫中分支的長列表的視覺混亂。這些分支也會傳播到所有存儲庫的分支。

首先我刪除我的本地分支。這可以防止以後意外推送它。

git branch -d branchName 

然後我刪除遠程跟蹤分支

git branch -dr remoteName\branchName 

然後我刪除GitHub上的分支。我使用網絡界面,但等效的命令如下。

git push remoteName :branchName 

即使分支從不合並,通常我仍然希望保留子孫後代的提交。不過,我仍然想刪除分支。爲了傳播提交,並防止它們被垃圾收集器吃掉,我創建了一個帶註釋的標記,指向與已刪除分支相同的提交。

git tag -a tagName commitOrBranchName 

然後我推標籤GitHub的

git push remoteName tagName 
3

看來你要刪除的2011_Hotfix分支不失它的歷史。我將首先討論刪除,然後再討論歷史。

上面已經描述了通常的git分支刪除方法,它們按預期工作。git沒有一個或兩個字的命令,這意味着,「嘿git,同時刪除本地和遠程分支」。但是這種行爲可以通過shell腳本來模擬。例如,拿Zach Holman's shell script 'git-nuke'。這是非常簡單的:在你的$PATH目錄之一

#!/bin/sh 
git branch -D $1 
git push origin :$1 

把這個可執行文件(例如,git-nuke)。如果您不在2011_Hotfix分支上,只需運行git-nuke 2011_Hotfix就會刪除本地和遠程分支。這比標準的git命令更簡單 - 儘管可能更危險。

您對保存歷史的關注是一個不錯的選擇。在這種情況下,你不必擔心。一旦你合併2011_Hotfixmaster,所有來自2011_Hotfix的提交將被添加到master的提交歷史。總之,你不會因爲簡單的合併而失去歷史。

我還有一句話要補充說,這可能超出了你的問題的範圍,但仍然是相關的。讓我們假設在2011_Hotfix上有20個小小的「正在進行中」提交;不過,您只需要將2011_Hotfix的一個完整提交添加到master的歷史記錄中。你如何將20個小提交合併爲一個大提交?幸運的是,git允許您通過使用git-rebase將多個提交合併爲一個提交。我不會在這裏解釋這是如何工作的;儘管如果你有興趣,the documentation for git-rebase非常好。請注意0​​重寫歷史記錄,所以應該謹慎使用它,特別是如果你是新手。最後,你的2011_Hotfix場景是關於一個開發團隊,而不是一個獨立開發者。如果項目團隊成員使用git rebase,團隊明智地指定使用git rebase以便團隊中的某位牛仔開發人員不會在無意中損害項目的歷史記錄git

0

您可以刪除所有主要網絡用戶界面(如github,BitBucket)中的分支。在線刪除分支後,您可以使用刪除本地分支

git remote prune origin