Git學習-4 Git分支
1.Git主幹
Git以時間為主線對版本進行管理的,而這條時間主線就是Git主幹,主幹上的每一個節點就是一個版本,即一次commit提交。在主幹上可以定義多個指針,指向不同的節點,Git默認會創建一個名稱為master的指針;
默認情況下用戶操作的就是master指針,但用戶通過命令對操作的指針進行切換,用戶每次提交一次,就會形成一個新的節點,當前操作的指針就會向前移動一次;
2.Git分支:
指針的移動軌跡,一個指針就是一個分支,不同的指針操作不同的分支:master的分支的移動軌跡和主幹是重復的,所以master主分支,master中有一個特殊的指針HEAD,所以指向當前分支的當前節點,Git創建一個分支就是創建一個指針,分支的切換就是修改指針的指向,commit都是提交到當前分支,多分支下可以在各個分支之間進行任意的切換,各自的提交與其他分支是無關的。
HEAD:當前分支的節點
3.分支的合並
當前dev分支上的工作完成之後,需要將其合並到主分支master上,合並過程其實很快,只需要將master指針指向dev指針指向的節點,然後再將HEAD指針指向master指針指向的節點即可,即分支的合並就是修改了兩個指針的指向而已。
對於合並的較形象的理解是:合並就是將原來在dev分支上的節點,全部都投射到master分支上,即全部合並到master分支上
4.合並後的刪除
將dev分支合並到master分支修改的僅僅是master與HEAD指針,而dev指針並未修改,即僅僅是將dev上的節點投射到master分支上,並未將master分支上的節點投射到dev分支上。dev分支上的節點會少於master分支的節點。
5.分支基本操作
1>創建並切換分支:git checkout -b 分支名稱
創建並切換到dev分支: git checkout -b dev <==>
(1)git branch dev:新建分支dev
(2)git checkout dev:切換到分支dev
2>查看系統的分支:
git branch
3>切換分支:
git checkout 分支名稱
4>刪除分支:
git branch -d 分支名稱
刪除某分支,必須保證當前分支不能是被刪除的分支:
例如當前在dev分支就不能刪除dev,先切換到其他分支再刪除dev
5>合並分支:
git merge
如果將B合並到A,需要切換到A上面;
實例:
將dev合並到master上:
(1)dev提交hello.html; (git commit之後添加到版本庫)
(2)dev合並到master上;
切換到master分支:git checkout master
查看master主分支下的hello.html:cat hello.html,沒有發生變化;
將dev分支合並到master分支,必須要確保當前是master: git branch
合並: git merge dev
再次在master分支下查看hello.html,已經合並了;
6>分支合並與沖突
Git的沖突檢測單位是文件,即當不同的分支對同一個文件進行修改後進行合並,就會產生沖突,這是與svn不同的。
svn沖突檢測單位是文件中的列:若兩個分支修改的不是同一個文件,合並時不會產生沖突,但若修改的是同一個文件上的不同行的內容,合並時也不會產生沖突,如果修改的是同一個文件上同一行上的不同列,在合並時候也不會產生沖突,只有兩個分支修改的是同一個文件同一行的同一列的內容時候才會產生沖突;
修改dev分支下的內容添加並提交到dev
修改master分支下的內容添加並提交到master
切換到master分支: git checkout master
合並分支:git merge dev
查看狀態 git status
查看master分支下hello.html的內容:
解決沖突:
手動修改沖突的內容,然後add添加並commit提交;
查看兩個分支解決完沖突之後的內容:
master中是解決沖突之後的內容,dev分支是無改變的內容,是合並前的版本;
合並解決沖突之後需要註意:沖突解決之後提交的最終版本即合並後的版本僅僅是master分支中的版本,即對於解決沖突後的master的版本超前於dev中的版本;
由於合並的本意是將dev分支完成或階段性完成的工作提交到master分支中,dev分支的工作就暫告一個段落,後面dev分支的工作再開始的時候,要與master分支的內容保持一致,從master分支內容開始,所以一般在合並後,會立即將dev分支刪除,再開始時,重新創建dev分支。
查看master分支中的版本,為解決沖突後合並的最終版本。
7>查看歷史版本中合並顯示:沖突解決記錄
可以在命令後添加--graph選項,展示圖形化的提交記錄
git log --pretty=oneline --graph
該方式下的commitid顯示的是全長度id,可以以簡寫的commitid顯示,只需要添加--abbrev-commit
git log --pretty=oneline --graph --abbrev-commit
8>刪除dev分支:
切換到master分支,再刪除dev分支:
git checkout master
git branch -d dev
Git學習-4 Git分支