2022/03/31 對分支進行管理
對分支進行管理
為什麼需要分支管理?
在實際開發過程中master
分支應該是最穩定的。不能再上面幹活。所以通常會開闢一個dev
分支。每個人在在dev
分支下建立自己的開發分支。
概括:
個人開發分支--->指向dev
分支--->指向master
分支
普通的Git
合併方式
Git會用Fast forward
模式merge
程式碼,但這種模式下,刪除分支後,會丟掉分支資訊。
需要禁用這種模式需要在合併的時候加引數:
方式如圖所示:
# 建立dev分支
git checkout -b dev
# 新建檔案、新增到暫存區、提交到版本庫
git add read.txt
git commit -m "新檔案"
# 切換到主分支
git checkout master
# 禁用模式合併程式碼
git merge --no-ff -m "新的提交" dev # 本次合併要建立一個新的commit,所以加上-m引數,把commit描述寫進去。
檢視分支歷史:
git log
區別在於:
- 之前的合併是直接更改了
master
的指標指向dev
版本 - 此次更改是在
master
分支上為dev
的版本建立了一個節點。然後將dev
和master
在該版本的後一個版本進行合併
處理Bug分支
簡單概述情況:
- 當正在
dev
分支開發的時候突然需要到master
分支修改一個Bug
-
dev
分支不能提交
Git
提供了一個stash
的功能用於儲存當前的工作區。後續可以恢復。
git stash
# 將工作區暫時儲存。此時可以切回主分支在新見一個分支進行bug的處理
修復Bug
# 位於dev分支,為Bug單獨建立分支進行修復
git checkout -b Bug-1
# 修復完成後新增到暫存區,提交版本庫
git add read.txt
git commit -m "修復了bug"
# 切回主分支,合併
git checkout master
git merge --no-ff -m "修復bug" Bug-1
切回dev
分支繼續開發,但是此時的工作區是空的。需要手動恢復一下儲存的工作區:
git checkout dev
# 檢視當前工作區狀態
git status
# 恢復儲存的工作區。有兩種方式:
# 恢復儲存的工作區不刪除儲存的工作區
git stash apply "儲存的工作區的標識。git stash list 可以檢視" # 手動刪除工作區 git stash drop
# 恢復工作區同時刪除分支
git stash pop
由於之前的Bug
已經在master
分支發現並修改說明dev
分支也存在該Bug
。如何將修改Bug
的提交複製到dev
分支上?
步驟:
- 位於
dev
分支 - 找到在
master
commit
號 - 通過指令將
master
提交的修改複製一份到dev
(這得益於git
記錄的是每一次修改而不是資源本身的特性)
git checkout dev
# 找到在master分支記錄的commit號
git log
# 將修改複製到dev分支
git cherry-pick "commit號"
有了這個支援可以直接在dev分支上修復bug,然後在master分支上“重放”。不過依然需要在master
分支儲存現場
總結
- 儲存工作區指令:
git stash
- 回到儲存的工作區:
git stash apply
(此時不會刪除該儲存) - 回到儲存的工作區同時刪除分支:
git stash pop 儲存的號
- 檢視所有儲存的工作區:
git stash
Feature分支
什麼是Feature
分支?
研發的日常工作:維護、檢測、研發。通常我們都處在dev
分支。接到新的開發任務的時候需要進行實際的編碼開發。那麼最好的做法不是在dev
分支進行直接開發而是新建一個分支進行開發
場景舉例:
git checkout -b newPoint
# 開發完成
git add new.cpp
git commit -m "新功能"
此時將程式碼合併到dev
分支的時候發現功能作廢。所以刪除分支:
git checkout dev
# 刪除分支
git branch -d newPoint
強行刪除分支:
git branch -d <分支名稱>
總結
- 強制刪除分支:
git branch -d <分支名稱>
Git多人協作
我們知道Git
是通過本地和遠端的關聯進行互動的。所以我們可以關聯多個遠端倉庫
檢視關聯的遠端倉庫:
git remote
可以檢視遠端倉庫更詳細的資訊:
git remote -v
# 顯示了可以抓取和推送的遠端倉庫地址
可以將程式碼指定的推送到遠端的指定分支(前提是本地的該分支與遠端的已經有關聯或者遠端目前沒有當前分支)
git push origin dev
當本地有dev
分支,遠端也有一個dev
分支,但是二者沒有建立任何關聯。此時進行推送的操作會被拒絕。需要手動設定兩個分支的關聯:
git branch --set-upstream-to=origin/dev dev
設定本地流到遠端流
當多人同時在遠端的dev
分支上進行開發的時候在每次一條程式碼之前建議先拉取一遍遠端的分支。
# 拉取遠端指定分支的提交--->在dev分支下
git pull
總結
- 設定本地流和遠端流關聯:
git branch --set-upstream-to=遠端分支 本地分支
Git的標籤管理
首先明白標籤和commit
提交時候帶的-m
引數說明不一樣。標籤是會和commit id
的資料記錄再一起。可以通過git log
檢視到
給分支或者commit
打標籤的方法也非常簡單:
使用git tag
指令
步驟 :
# 切換到需要打標籤的分支
git checkout dev
# 給dev分支打上v1.0的標籤
git tag v1.0
這樣分支dev
就被打上了v1.0
的標籤
# 檢視所有標籤
git tag
# 檢視標籤詳細資訊
git show <標籤名稱>
# 給指定的commit id打上標籤
git tag "標籤內容" "commit id"
在打標籤的同時可以新增說明文字:
git tag -a 版本號 -m 內容 "commit id"
總結
- 在
HEAD
指向的分支新建標籤git tag <標籤名稱> (可選是否指定一個commit id)
- 檢視所有標籤
git tag
- 指定標籤攜帶的資訊:
git tag -a <標籤名> -m "攜帶的資訊內容"
標籤的概念和提交不一樣。分支或者提交打了標籤以後不會隨著提交而提交到版本庫或者是提交到遠端(標籤只會在本地儲存)。需要自己另外進行推送。刪除標籤也是同理:
Git操作標籤
在建立標籤了以後標籤實質是儲存在本地。所以推送到遠端等操作需要另外執行。
將本地標籤推送到遠端:
git push origin 標籤名稱
# git push origin <tagname>
刪除本地儲存的標籤:
git tag -d 標籤名稱
如果想刪除遠端標籤,那麼做法是再次進行推送:
git push origin refs/tags/標籤名稱
總結
-
git push origin <tagname>
:推送一個本地標籤; -
git push origin --tags
:推送全部未推送過的本地標籤; -
git tag -d <tagname>
:刪除一個本地標籤; -
git push origin :refs/tags/<tagname>
:刪除一個遠端標籤。