branch由兩部分組成。
概念:定義,約束。
操作:三類。
- 基礎:新增,刪除,查看,重命名。
- commit相關:檢出,集合相關(交集,並集,差集)。
- 遠程:與遠程分支的相關操作
1、概念
1.1 定義
A branch is the fundamental means of launching a separate line of development within a software project. A branch is a split form a kind of unified, primal state, allowing development to continue in multiple directions simultaneously and, potentially, to produce different versions of the project. Often, a branch is reconciled and merged with other branches to reunite disparate efforts.
分支個人理解,就是鏈表,鏈表上的每個節點對象就是commit,鏈表不能循環,鏈表的下一個引用和上一個引用都可以指向多個節點對象(這段不是翻譯)。
1.2 約束
在使用分支時,約定俗稱的一些約束。
第一,不允許修改分支,以及分支的結構。
第二,在給分支命名時,兩種分類方法,第一種是環境, dev, test, prod等。第二種是功能, feat, bug等。
第三,刪除分支之前,需要合併。分支刪除之後,不會在版本庫中刪除任意的對象,但是它會造成一些對象變爲不可達對象,在進行垃圾回收時,會被刪除。
2、操作
2.1 基礎類
2.1.1 新增
格式:
git branch [--track | --no-track] [-f] <branchname> [<start-point>]
選項:
track:是用於建立本地分支和遠程分支的聯繫。
f:force的縮寫,當分支名已存在時,分支創建失敗,添加-f選項,會覆蓋之前的分支
start-point:是指定新分支基準對應的commit對象,若不指定,默認是當前分支的HEAD。
示例:
git branch –no-track -f learn/test HEAD
2.1.2 重命名
格式:
git branch -m <oldbranch> <newbranch>
選項:
m:rename的縮寫,不是message的縮寫,重新命名。
oldbranch:分支的舊名稱,必須存在,否則無意義。
newbranch:分支新名稱。
示例:
git branch -m learn/test learn/git
2.1.3 查看分支
格式:
git branch [--color[=<when>] | --no-color] [--show-current] [-v [--abbrev=<length> | --no-abbrev]] [--column[=<options>] | --no-column] [--sort=<key>] [(--merged | --no-merged) [<commit>]] [--contains [<commit]] [--no-contains [<commit>]] [--points-at <object>] [--format=<format>] [(-r | --remotes) | (-a | --all)] [--list] [<pattern>…]
選項:
color:選項使用特定顏色區分當前分支和其他分支。它是默認值,不用設置。除此之外,*號也可以區分,有*號的爲當前分支。
show-current:只顯示當前分支。
v:全稱爲verbose,會顯示分支以及最近一次提交的信息
–abbrev –no-abbrev: --abbrev選項縮寫提交ID, 它是默認值。
merged:用於查找可以刪除的分支。以當前分支的HEAD爲起點,沿着root(初始提交)方向查找,若分支上的所有提交記錄都是可達的,那麼它就是可以刪除的,存在不可達提交,即是不可刪除的。--no-merged是逆操作。
contains:用於查找包含commitID的所有分支。
points-at:與contains類似。
r:表示列出所有遠程分支
all:表示列出所有分支
list:表示列出所有本地分支
pattern:添加分支名稱的過濾條件。
示例:
git branch [-r | -a | --list]
2.1.4 查看提交歷史
格式:
git show-branch [-a|--all] [-r|--remotes] [--topo-order | --date-order] [--current] [--color[=<when>] | --no-color] [--sparse] [--more=<n> | --list | --independent | --merge-base] [--no-name | --sha1-name] [--topics] [(<rev> | <glob>)…]
選項:
a, r:a是all的縮寫,表示所有,r是remote的縮寫,表示遠程分支。
topo-order:拓撲圖排序。 子提交排在父提交之前。
date-order: 日期排序。最近的日期排在最前。
more=<n>:顯示分支的最近N次提交,--list,只顯示分支的最近一次提交。類似於sql中的limit語句。
no-name,sha1-name:不顯示提交的名稱。sha1-name,顯示提交的SHA1值縮寫。
rev:全稱是revision,意思是變更集,變更集與commit是一一對應的關係,所以rev代表commit的標識,顯示提交的信息。
glob,全稱是指global,意思是全局的,指在整個版本庫中,分支名稱符合特定的格式。
示例:
查看某個分支下的提交歷史,執行git show-branch –-more=n master,下述爲我執行的結果(n爲3),
[master] 提交內容 [master^] 提交內容 [master~2] 提交hello.txt [master~3] 提交
2.1.5 刪除
格式:
git branch (-d | -D) [-r] <branchname>…
選項:
d:全稱爲drop,丟棄的意思。
r:全稱爲remote,遠程。
示例:
git branch -d learn/git
2.2 commit類
2.2.1 檢出
檢出的本質是將HEAD引用到對應的commit對象,當在分支之間檢出時,默認爲分支的最新一次提交。這個過程,伴隨着工作區的還原(restore)。
git checkout總共有7中語法格式。
第一種格式:
git checkout [-q] [-f] [-m] [<branch>]
選項:
q:全稱爲quiet,不輸出任何信息,本來也沒有信息。
f:全稱爲force,在檢出分支時,若存在未提交的變更集,未追蹤的變更集,檢出會失敗,因爲底層本質上是在比較tree對象,tree對象是與commit關聯的,而未提交,未追蹤的變更集都無法通過tree對象關聯到,所以切換之後,這些內容會丟失,git爲了防止這種情況,此時會檢出失敗。添加-f選項,檢出成功,內容也會丟失。
m:全稱爲merge,對於公共部分的文件內容嘗試合併。
第二種,第三種格式:
git checkout [-q] [-f] [-m] --detach [<branch>] git checkout [-q] [-f] [-m] [--detach] <commit>
選項:
detach:在切換的最近一次提交上創建遊離分支,此後的提交都會發生在遊離分支上。遊離分支除沒有名稱,無法引用到之外,與其他分支是相同的。遊離分支在檢出到其他分支之後,遊離分支上的提交記錄都無法訪問。
第四種格式:
git checkout [-q] [-f] [-m] [-b|-B|--orphan] <new_branch>] [<start_point>]
選項:
b: 同時執行創建分支,檢出分支。
orphan:創建出的新分支與當前分支無基準點。屬於完全獨立的提交歷史記錄,所以它無法進行合併,變基操作。
第五種,第六種格式:
git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] [--] <pathspec>… git checkout [-f|--ours|--theirs|-m|--conflict=<style>] [<tree-ish>] --pathspec-from-file=<file> [--pathspec-file-nul]
選項:
ours,theirs:通常用戶分支合併時,發生衝突時,採取的解決策略。ours使用本地覆蓋遠程,theirs使用遠程覆蓋本地。
pathspec:衝突策略的適用範圍,默認爲全部文件,當存在該參數時,只適用於參數指定的文件。
第七種格式:
git checkout (-p|--patch) [<tree-ish>] [--] [<pathspec>…]
選項:
p:全稱爲patch(補丁),它會彈出與用戶交互的語句,當切換分支遇到衝突時,讓用戶挨個去指定解決衝突的策略。
2.2.2 集合相關
假設存在A,B兩個分支
差集(A-B):git log --pretty=format:"%h %an %ad %s" --date=short -n 10 B..A
並集(AUB):git show-branch --more=10 A B
交集:
第一步,先找出二者的基點。git merge-base A B
第二步,基點之前的提交爲二者的交集。git log --pretty=format:"%h %an %ad %s" --date=short -n 10 baseCommitId
2.3 遠程類
2.3.1 關聯
格式:
git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
選項:
set-upstream-to:與遠程版本庫的分支建立關聯。
u:全稱爲set up,與set-upstream-to含義相同。
示例:
git branch –set-upstream-to origin/master
2.3.2 解除關聯
格式:
git branch --unset-upstream [<branchname>]
選項:
unset-upstream:與遠程版本庫的分支解除關聯。
示例:
git branch –unset-upstream master