Git——分支——基礎

  branch由兩部分組成。

  概念:定義,約束。

  操作:三類。

  1. 基礎:新增,刪除,查看,重命名。
  2. commit相關:檢出,集合相關(交集,並集,差集)。
  3. 遠程:與遠程分支的相關操作

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章