一文讓你明白 Git 分支是如何工作的
分支是 Git 版本跟蹤的核心功能,并且經(jīng)常被使用相同軟件代碼庫的團(tuán)隊(duì)使用。我們將深入研究它們?nèi)绾卧谀缓蠊ぷ鳎约叭绾问褂盟鼈儊砀倪M(jìn) Git 工作流程。
什么是分支?
分支用于拆分 Git 歷史記錄。您可以將 Git 提交想象成一系列可以追溯到過去的更改。您可以“簽出checkout”任何這些提交,并將本地目錄及時移回提交時的狀態(tài)。
分支通常用于處理實(shí)驗(yàn)性功能,或需要一段時間的更改,或任何其他可能破壞存儲庫的東西。例如,您可能正在重構(gòu)代碼庫的一個重要組件,并且在完成之前,您希望master 分支保持穩(wěn)定。
一旦新feature 分支穩(wěn)定了,它就可以重新合并到master中,通常是通過 拉取請求,這是一個允許在進(jìn)行更改之前進(jìn)行代碼審查和測試的過程。
然而,在幕后,分支的工作方式與您最初預(yù)期的略有不同。在 Git 中,分支只是指向特定提交的標(biāo)簽或指針。就是這樣,master 分支只是指向最新的提交master;當(dāng)您進(jìn)行新的提交時,標(biāo)簽會更新為指向新的提交。
雖然將提交視為及時推進(jìn)是有用的;實(shí)際上,Git 提交指向彼此。每個提交都有對最后一次提交的引用,并且這個鏈用于構(gòu)造存儲庫的狀態(tài)。
但是,如果您創(chuàng)建一個新分支,則情況會有所不同。您簽出的任何分支(使用git checkout <branch>)都將用作新提交的標(biāo)簽。
要在此示例中創(chuàng)建分支,您必須首先確保將存儲庫 HEAD 設(shè)置為master 分支。這是因?yàn)槟鷮?shí)際上可以從任何地方開始創(chuàng)建分支——包括過去的提交或其他分支上的提交。
git checkout master
然后創(chuàng)建一個新分支,并交換到它:
git branch feature
git checkout feature
此時,您的存儲庫中的任何內(nèi)容都沒有改變。feature 和分支標(biāo)簽都master 指向同一個提交。
但是,您從此時開始提交的任何內(nèi)容都將添加到feature 分支中。更具體地說,將創(chuàng)建一個新提交,設(shè)置為指向當(dāng)前提交,并且“功能”標(biāo)簽將更新為指向這個新提交。
您甚至可以checkout master 在主分支上進(jìn)行更多提交。它不會影響feature 分支,因?yàn)闃?biāo)簽所知道的只是它指向那個特定的提交。它不會隨master 標(biāo)簽更新。
合并和變基(Merging 和 Rebasing)
當(dāng)然,如果分支永遠(yuǎn)卡在那里,它們就不會太有用了,因此 Git 提供了將它們合并回master 分支的工具。從技術(shù)上講,只要?dú)v史兼容,您就可以將子分支合并到任何其他分支中。
最簡單的情況是您有一個只需要合并回來的簡單分支。您可以簽出master 分支,然后運(yùn)行g(shù)it merge feature 以將在功能分支上所做的所有提交“重播”到 master 上。
這會將它們合并到主時間線中,并使用更改創(chuàng)建一個新的“合并提交”。
但它并不總是那么簡單,而且在許多情況下,您將遇到 需要解決的合并沖突。這可能包括分支修改文件中的相同行、文件移動或刪除,或feature 在創(chuàng)建分支后更改軟件時出現(xiàn)的其他類型的錯誤。
如果您有一個長時間運(yùn)行的feature 分支,則將這個問題最小化的一種方法是執(zhí)行頻繁的合并,這次相反——從master 主支到 feature 分支上,這保持feature 最新,雖然它并沒有真正減少所需的工作量,但它可以防止它陷入一片混亂。
這種策略對于長期存在的分支很常見,通常被認(rèn)為是 Git 的最佳實(shí)踐。
在這種情況下也使用的另一個工具是變 基。基本上,變基就像拿起整個分支并將其移動到從新位置開始,通常是存儲庫中的最新提交。在某些情況下,這會導(dǎo)致更清晰的 Git 歷史記錄,并且是某些復(fù)雜情況的首選解決方案。
然而,Git 歷史是“不可變的”,并且由于這種變基復(fù)制提交而不是實(shí)際移動它們。如果沒有與您的團(tuán)隊(duì)正確協(xié)調(diào),這可能會導(dǎo)致共享分支上的許多問題——如果您重新設(shè)置基準(zhǔn),并且您的同事在“舊”、現(xiàn)已刪除的功能分支上進(jìn)行新提交,它將被擱置。他們將不得不隱藏提交并將其彈出到新分支以協(xié)調(diào)更改。
如何使用分支?
要開始創(chuàng)建新分支,您需要將存儲庫置于正確狀態(tài),以便新分支標(biāo)簽從您想要的位置開始。如果您要從 分支master,只需簽出整個分支以從最新提交開始。否則,您可以通過簽出單個提交將您的 repo 置于分離的 HEAD 狀態(tài)。
git checkout master
git checkout aa3e570923b8ee61414cec17d9033faab4f084a6
然后,您可以創(chuàng)建新分支,并使用checkout切換到它:
git branch feature
git checkout feature
這可以在一個命令中完成,帶有-b 結(jié)帳標(biāo)志:
git checkout -b feature
此時,您的 repo 中所做的任何提交都將提交到新分支。
如果您需要再次交換分支,只需運(yùn)行g(shù)it checkout master 即可恢復(fù)正常。
如果您有需要移動的本地更改,可以將它們放入git stash. 更改將被存儲,并且可以在交換分支后重新應(yīng)用。
git stash
git checkout feature
git stash apply