搜尋
首頁科技週邊IT業界快點開始git:在git中分支

Git 分支:高效協作的利器

本文節選自《Jump Start Git》一書,該書免費提供給 SitePoint Premium 會員。實體書在全球各大書店有售,您也可以在此處訂購。希望您喜歡並能從中受益!

第一章中,我曾談到自己最初對在項目中嘗試新事物的恐懼。如果嘗試一些雄心勃勃的功能,卻破壞了之前正常運行的部分,該怎麼辦? Git 的分支功能完美解決了這個問題。

要點總結

  • Git 分支允許創建項目的副本,從而進行實驗而不會影響原始項目。如果實驗成功,可以輕鬆地將實驗性元素合併到主分支。
  • 分支允許同時處理多個任務而不會相互干擾。這在等待一個功能審批的同時需要處理另一個功能時非常有用。分支還可以通過分離不同的想法來使代碼更易於理解。
  • 在 Git 中創建分支使用命令 git branch [分支名称]。切換到該分支使用 git checkout [分支名称]。刪除分支使用 git branch -D [分支名称],但建議除非必要,否則不要刪除分支。
  • 在 Git 中合併分支是一個簡單的過程。確保所需分支處於活動狀態後,使用命令 git merge [分支名称]。但是,這可能會在項目歷史記錄中創建循環,這在大型團隊中可能難以導航。下一章將探討一種不創建循環的合併方法。

什麼是分支?

在項目中創建一個新分支,本質上意味著創建該項目的副本。您可以使用此副本進行實驗,而不會影響原始項目。因此,如果實驗失敗,您可以放棄它並返回到原始項目——主分支。

但如果實驗成功,Git 可以輕鬆地將實驗性元素合併到主分支中。而且,在後期,如果您改變主意,可以輕鬆地恢復到合併之前的項目狀態。

因此,Git 中的分支是獨立的開發路徑。您可以在分支中創建新的提交,而不會影響其他分支。分支的易用性是 Git 最好的特性之一。 (雖然其他版本控制選項(如CVS)也有分支選項,但在CVS 上合併分支的體驗非常繁瑣。如果您有使用其他版本控制系統中分支的經驗,請放心,在Git 中使用分支是完全不同的。)

在 Git 中,您默認處於主分支。名稱“master”(主)並不意味著它在任何方面都優越。這只是一個約定俗成的叫法。

注意:分支約定

雖然您可以自由地使用不同的分支作為 Git 中的基礎分支,但人們通常期望在主分支中找到特定項目的最新代碼。

您可能會爭辯說,由於能夠返回到任何提交,因此不需要分支。但是,想像一下,您需要向您的主管展示您的工作,同時還要開發一個不屬於您已完成工作的新功能的情況。由於分支用於分離不同的想法,因此它使存儲庫中的代碼易於理解。此外,分支使您能夠僅在主分支或主分支中保留重要的提交。

分支的另一個用途是它們使您能夠同時處理多件事情,而不會相互干擾。假設您提交了功能 1 以供審核,但您的主管需要一些時間才能審核它。同時,您需要處理功能 2。在這種情況下,分支就派上用場了。如果您在新分支上處理您的新想法,您可以隨時切換回您之前的分支,以將存儲庫恢復到之前的狀態,該狀態不包含與您的想法相關的任何代碼。

現在讓我們開始在 Git 中使用分支。要查看分支列表和您正在使用的當前分支,請運行以下命令:

<code>git branch</code>

如果您已克隆您的存儲庫或設置了遠程存儲庫,您也可以看到遠程分支。只需在上述命令後添加 -a:

<code>git branch -a</code>

Jump Start Git: Branching in Git

如上所示,紅色分支表示它們位於遠程存儲庫。在我們的例子中,我們可以看到 origin 遠程存儲庫中存在的各種分支。

創建分支

在 Git 中創建分支有多種方法。要創建一個新分支並保留在當前分支中,請運行以下命令:

<code>git branch test_branch</code>

這裡,test_branch 是創建的分支的名稱。但是,運行 <code>git branch</code> 後,似乎活動分支仍然是主分支。要更改活動分支,我們可以運行 checkout 命令(如下所示):

<code>git checkout test_branch</code>

Jump Start Git: Branching in Git

您還可以組合上述兩個命令,從而通過在 checkout 命令後添加 -b 來在一個命令中創建和檢出新分支:

<code>git checkout -b new_test_branch</code>

Jump Start Git: Branching in Git

我們剛剛創建的分支基於當前活動分支(在本例中為主分支)的最新提交。如果您想基於某個提交(例如 cafb55d)創建分支(例如 old_commit_branch),您可以運行以下命令:

<code>git checkout -b old_commit_branch cafb55d</code>

Jump Start Git: Branching in Git

要將當前分支重命名為 renamed_branch,請運行以下命令:

<code>git branch -m renamed_branch</code>

刪除分支

要刪除分支,請運行以下命令:

<code>git branch</code>

Jump Start Git: Branching in Git

注意:除非必須,否則不要刪除分支

由於保留分支實際上沒有任何缺點,因此我建議除非存儲庫中的分支數量變得太大而難以管理,否則不要刪除它們。

上面使用的 -D 選項即使分支尚未與遠程分支同步,也會刪除分支。這意味著,如果您的當前分支中有尚未推送的提交,-D 仍然會刪除您的分支,而不會發出任何警告。為了確保您不會丟失數據,您可以使用 -d 作為 -D 的替代項。 -d 僅在分支已與遠程分支同步時才刪除分支。由於我們的分支尚未同步,讓我們看看如果我們使用 -d 會發生什麼,如下所示:

Jump Start Git: Branching in Git

如您所見,Git 會向您發出警告併中止操作,因為數據尚未與分支合併。

分支和 HEAD

既然我們有機會嘗試分支的基礎知識,那麼讓我們花一點時間討論分支在 Git 中的工作方式,並介紹一個重要的概念:HEAD。

如上所述,分支只是不同提交之間的鏈接,或者說是通過提交的路徑。需要注意的是,在使用分支時,分支的 HEAD 指向分支中的最新提交。我將在接下來的章節中多次提到 HEAD。在 Git 中,HEAD 指向分支中的最新提交。換句話說,它指的是分支的頂端。

分支本質上是指向提交的指針,該提交具有父提交、祖父母提交等等。這個提交鏈形成了我上面提到的路徑。那麼,如何鏈接分支和 HEAD 呢?好吧,HEAD 和當前分支的頂端指向相同的提交。讓我們來看一個圖表來說明這個想法:

Jump Start Git: Branching in Git

如上所示,branch_A 最初是活動分支,HEAD 指向提交 C。提交 A 是基礎提交,沒有任何父提交,因此 branch_A 中的提交按時間反向順序排列(這也構成了我上面談到的路徑)是 C → B → A。 branch_B 中的提交是 E → D → B → A。 HEAD 指向活動分支 branch_A 的最新提交,即提交 C。當我們添加提交時,它將添加到活動分支。提交後,branch_A 指向 F,分支遵循 F → C → B → A,而 branch_B 保持不變。 HEAD 現在指向提交 F。同樣,當我們添加另一個提交時,更改在圖中得到演示。

高級分支:合併分支

如前所述,Git 最大的優勢之一是合併分支特別容易。現在讓我們看看它是如何完成的。

我們將創建兩個新分支——new_featureanother_feature——並添加一些虛擬提交。檢查每個分支的歷史記錄向我們顯示,another_feature 分支領先一個提交,如下所示:

Jump Start Git: Branching in Git

這種情況可以如下圖所示。每個圓圈代表一個提交,分支名稱指向其 HEAD(分支的頂端)。

Jump Start Git: Branching in Git

要將 new_feature 與主分支合併,請運行以下命令(首先確保主分支處於活動狀態):

<code>git branch</code>

結果可以如下圖所示:

Jump Start Git: Branching in Git

要將 another_featurenew_feature 合併,只需運行以下命令(確保 new_feature 分支處於活動狀態):

<code>git branch -a</code>

結果可以如下圖所示:

Jump Start Git: Branching in Git

重要提示:注意循環

上圖顯示此合併在您的項目歷史記錄中跨兩個提交創建了一個循環,其中工作流分別發散和收斂。在單獨工作或在小型團隊中工作時,此類循環可能不是問題。但是,在一個更大的團隊中——自從您偏離主分支以來可能有很多提交——這種大型循環使得難以導航歷史記錄並理解更改。我們將在第 6 章中探討使用 rebase 命令合併分支而不創建循環的方法。

Jump Start Git: Branching in Git

此合併沒有任何“衝突”。原因很簡單,與 another_feature 分支相比,沒有新的提交添加到 new_feature 分支。 Git 中的衝突發生在同一文件的同一部分在兩個分支中的非公共提交中都被修改時。 Git 會引發衝突以確保您不會丟失任何數據。

我們將在下一章詳細討論衝突。我前面提到過,分支可以通過簡單的提交路徑來可視化。當我們合併分支並且沒有衝突時,例如上面那樣,只有分支路徑發生更改,並且分支的 HEAD 會更新。這稱為快速前進類型的合併。

合併分支的另一種方法是非快速前進合併,方法是在合併命令後添加 --no-ff。通過這種方式,將在基礎分支上創建一個新的提交,其中包含來自另一個分支的更改。您還需要指定提交消息:

<code>git branch</code>

在上面的示例中,前者(將 new_feature 與主分支合併)是快速前進合併,而後者是非快速前進合併,帶有合併提交。

雖然快速前進樣式的合併是默認的,但通常最好對合併到主分支的合併使用非快速前進方法。從長遠來看,標識新功能合併的新提交可能是有益的,因為它將負責新功能的代碼部分邏輯地分離到一個提交中。

結論

您學到了什麼?

在本章中,我們討論了什麼是分支以及如何在 Git 中管理它們。我們研究了創建、修改、刪除和合併分支。

接下來是什麼?

我已經談到 Git 如何對團隊合作的開發人員有益。下一章將更詳細地探討這一點,以及在分佈式團隊中經常使用的特定 Git 操作和命令。

關於 Git 分支的常見問題

  • Git 分支的主要目的是什麼?

Git 分支是一個強大的功能,允許開發人員創建單獨的開發線路。這在處理新功能或修復程序時尤其有用,因為它允許您將工作與主項目隔離開來。功能或修復程序完成後並經過測試後,可以將其合併回主項目。這確保了主項目保持穩定,並允許多個開發人員同時處理不同的功能而不會相互干擾。

  • 如何在 Git 中創建新分支?

在 Git 中創建新分支很簡單。您可以使用 <code>git branch</code> 命令,後跟新分支的名稱。例如,git branch new_feature 將創建一個名為“new_feature”的新分支。要切換到此分支,您可以使用 git checkout 命令,如下所示:git checkout new_feature

  • 如何在 Git 中合併分支?

在 Git 中合併分支使用 git merge 命令。在合併之前,您需要位於要合併到的分支上。例如,如果您想將名為“new_feature”的分支合併到“master”分支,您首先需要使用 git checkout master 切換到主分支,然後使用 git merge new_feature 命令。

  • 什麼是 Git 分支指針以及它是如何工作的?

Git 分支指針是一個包含其指向的提交的 SHA1 哈希的文件。當您創建新分支時,Git 會創建一個新的指針,並隨著您進行的每次新提交一起移動它。這允許 Git 跟踪項目的歷史記錄。

  • 如何在 Git 中刪除分支?

在 Git 中刪除分支使用 git branch -d 命令,後跟分支的名稱。例如,git branch -d old_feature 將刪除名為“old_feature”的分支。但是,如果分支有尚未合併到另一個分支中的提交,Git 將阻止您刪除分支。要強制刪除,您可以使用 -D 選項。

  • Git 中的快速前進合併和三方合併有什麼區別?

當從當前分支尖端到目標分支存在線性路徑時,Git 中的快速前進合併是可能的。 Git 不創建新的提交,而是將當前分支指針向上移動到目標分支。另一方面,當不存在線性路徑時,使用三方合併。 Git 將創建一個具有兩個父級的新的提交,有效地連接兩個分支。

  • 如何查看 Git 存儲庫中的所有分支?

您可以使用不帶參數的 <code>git branch</code> 命令查看 Git 存儲庫中的所有分支。這將列出所有本地分支。如果您還想查看遠程分支,可以使用 -a 選項,如下所示:<code>git branch -a</code>。

  • 如何在 Git 中重命名分支?

在 Git 中重命名分支使用 git branch -m 命令,後跟舊名稱和新名稱。例如,git branch -m old_name new_name 將將分支“old_name”重命名為“new_name”。

  • 什麼是 Git 中的分離 HEAD 以及如何避免它?

Git 中的分離 HEAD 發生在您檢出提交而不是分支時。這可能很危險,因為當您檢出到另一個分支時,您所做的任何更改都將丟失。為避免這種情況,請務必始終檢出到分支,而不是提交。

  • 如何在 Git 中合併分支時解決衝突?

在 Git 中合併分支時,如果同一文件的同一部分在兩個分支中都被修改,則可能會發生衝突。 Git 將標記該文件為“未合併”,您需要手動解決衝突。您可以通過在文本編輯器中打開文件,找到衝突標記(),並決定保留哪些更改來執行此操作。解決所有衝突後,您可以使用 <code>git add 添加文件,然後使用 git commit 提交它。

以上是快點開始git:在git中分支的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
安卓首家接入DeepSeek背後:看見女性力量安卓首家接入DeepSeek背後:看見女性力量Mar 12, 2025 pm 12:27 PM

中国女性科技力量在AI领域的崛起:荣耀与DeepSeek合作背后的女性故事女性在科技领域的贡献日益显著。中国科技部数据显示,女性科技工作者数量庞大,在AI算法开发中展现出独特的社会价值敏感性。本文将聚焦荣耀手机,探究其率先接入DeepSeek大模型背后的女性团队力量,展现她们如何推动科技进步,重塑科技发展价值坐标系。2024年2月8日,荣耀正式上线DeepSeek-R1满血版大模型,成为安卓阵营首家接入DeepSeek的厂商,引发用户热烈反响。这一成功背后,女性团队成员在产品决策、技术攻坚和用户

DeepSeek'驚人”盈利:理論利潤率高達545%!DeepSeek'驚人”盈利:理論利潤率高達545%!Mar 12, 2025 pm 12:21 PM

DeepSeek公司在知乎發布技術文章,詳細介紹了其DeepSeek-V3/R1推理系統,並首次公開關鍵財務數據,引發業界關注。文章顯示,該系統單日成本利潤率高達545%,創下全球AI大模型盈利新高。 DeepSeek的低成本策略使其在市場競爭中佔據優勢。其模型訓練成本僅為同類產品的1%-5%,V3模型訓練成本僅為557.6萬美元,遠低於競爭對手。同時,R1的API定價僅為OpenAIo3-mini的1/7至1/2。這些數據證明了DeepSeek技術路線的商業可行性,也為AI大模型的高效盈利樹立了

2025年最佳10個最佳免費反向鏈接檢查器工具2025年最佳10個最佳免費反向鏈接檢查器工具Mar 21, 2025 am 08:28 AM

網站建設只是第一步:SEO與反向鏈接的重要性 建立網站只是將其轉化為寶貴營銷資產的第一步。您需要進行SEO優化,以提高網站在搜索引擎中的可見度,吸引潛在客戶。反向鏈接是提升網站排名的關鍵,它向谷歌和其他搜索引擎表明您的網站權威性和可信度。 並非所有反向鏈接都有利:識別並避免有害鏈接 並非所有反向鏈接都有益。有害鏈接會損害您的排名。優秀的免費反向鏈接檢查工具可以監控鏈接到您網站的來源,並提醒您注意有害鏈接。此外,您還可以分析競爭對手的鏈接策略,從中學習借鑒。 免費反向鏈接檢查工具:您的SEO情報員

美的推出首款DeepSeek空調:AI語音交互 可實現40萬 條指令!美的推出首款DeepSeek空調:AI語音交互 可實現40萬 條指令!Mar 12, 2025 pm 12:18 PM

美的即将发布搭载DeepSeek大模型的首款空调——美的鲜净感空气机T6,发布会定于3月1日下午1点30分举行。这款空调配备先进的空气智驾系统,可根据环境智能调节温度、湿度和风速等参数。更重要的是,它集成了DeepSeek大模型,支持超过40万条AI语音指令。美的此举引发业界热议,尤其关注白电产品与大模型结合的意义。不同于传统空调简单的温度设定,美的鲜净感空气机T6能够理解更复杂、更模糊的指令,并根据家庭环境智能调节湿度等,显著提升用户体验。

百度又一國民產品接入DeepSeek,是想開了還是跟風?百度又一國民產品接入DeepSeek,是想開了還是跟風?Mar 12, 2025 pm 01:48 PM

DeepSeek-R1賦能百度文庫與網盤:深度思考與行動的完美融合短短一個月內,DeepSeek-R1已迅速融入眾多平台。百度憑藉大膽的戰略佈局,將DeepSeek作為第三方模型夥伴,整合進自身生態系統,這標誌著其“大模型 搜索”生態戰略的重大進展。百度搜索和文心智能體平台率先接入DeepSeek及文心大模型的深度搜索功能,為用戶提供免費的AI搜索體驗。同時,“百度一下,你就知道”的經典slogan回歸,新版百度APP也整合了文心大模型和DeepSeek的能力,推出“AI搜索”、“全網信息提煉”

及時的網絡開發工程及時的網絡開發工程Mar 09, 2025 am 08:27 AM

AI及時的代碼生成工程:開發人員指南代碼開發的景觀已準備好進行重大轉變。 掌握大型語言模型(LLM)和及時工程對於未來幾年對開發人員至關重要。 Th

使用GO構建網絡漏洞掃描儀使用GO構建網絡漏洞掃描儀Apr 01, 2025 am 08:27 AM

此基於GO的網絡漏洞掃描儀有效地確定了潛在的安全弱點。 它利用了GO的並發功能的速度功能,包括服務檢測和漏洞匹配。讓我們探索它的能力和道德

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱工具

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。