分支是git的一個殺手級應用,和其他版本控制工具不一樣的是,git創建及切換分支的效率極其高效。
分支簡介
何為分支呢?我們從一個我們非常熟悉的場景來講述,一個已經上線的產品,現在需要新增一個功能。這個時候,如果我們在原分支上繼續開發的話,就很不方便,因為是一個已經上線的應用了,肯定需要先測試完畢后才能夠上線。一般我們的做法是,建立一個新的分支,在這個新的分支上開發新的功能,測試完畢后,再合并到主分支上。
分支的創建、切換
目前我的版本庫分支情況如下:
創建分支
現在我們創建一個新的分支,dev。創建分支的及查看分支命令如下:
git?branch?分支名 git?branch #?git?branch?dev #?git?branch ??dev *?master
切換分支
分支已經建立成功了?,F在我們來切換到新的分支,切換分支的命令如下git checkout 分支名
#?git?checkout?dev Switched?to?branch?'dev'
現在,我們在新的分支做一些修改,然后提交,然后切換到master分支上做點修改并提交。然后,我們看看分支的狀態。
git?vim?config.php?#?修改config.php文件 git?add?.?&&?git?commit?-m?'add?config.php' git?checkout?master?#?切換到主分支 git?vim?config.php git?add?.?&&?git?commit?-m?'change?config.php'
$?git?log?--oneline?--decorate?--graph?--all *?ca4589c?(HEAD?->?master)?add?config?file |?*?43a5a8f?(dev)?add?config.php |/ *?19e3186?add?index.php *?9cc82f9?first?commit
一條命令完成分支的創建及切換分支
git?checkout?-b?新分支名
分支的合并
首先引入一個場景,該場景非常的常見:
-
一個系統已經上線
-
該系統需要更新一個新的功能,所以你新建了一個分支(dev)并在此分支上開展工作。
-
此時,系統突然出現的一個問題,需要緊急排查處理。
-
那么,這時候你需要先切換到線上版本(master),然后新建立一個分支(fixbug),在新的分支上修正錯誤
-
完成測試后,切換到線上分支,然后來合并fixbug分支,再將改動推到線上的分支。
-
最后,我們就可以切換到dev分支來繼續工作了。
目前,我們版本庫狀態如下:
現在,需要新建一個新分支,在新分支上添加新的功能。
git?checkout?-b?dev
然后在新的分支上做一些修改。
此時,發現線上出現了一個嚴重的bug,需要緊急處理。那么,首先我需要切換到master分支。但在切換的時候發生了一個錯誤
$?git?checkout?master error:?Your?local?changes?to?the?following?files?would?be?overwritten?by?checkout: ????????login.php Please?commit?your?changes?or?stash?them?before?you?switch?branches. Aborting
以上錯誤我們經常會碰到,這是因為在合并分支的時候,工作區和暫存區必須是“干凈”的。有兩種方法可以達到上述要求
-
提交修改
-
暫存
我們這里使用暫存的方法來演示
$?git?stash $?git?checkout?master Switched?to?branch?'master'
當你切換分支的時候,Git 會重置你的工作目錄,使其看起來像回到了你在那個分支上最后一次提交的樣子。
現在,我們新建fixbug分支,在這個分支上修復bug。
$?git?checkout?-b?fixbug
合并分支
修復完成且測試通過時,就可以把它合并到master上了。合并使用git ?merge 分支名
$?git?checkout?master?Switched?to?branch?'master'? $?git?merge?fixbug
刪除分支
這個時候,fixbug功能已經完成了,可以將它給刪除掉了。
$?git?branch?-d?fixbug? Deleted?branch?fixbug?(was?cca73bb).
現在,我們可以繼續在dev分支上工作了。我們需要把之前暫存的內容取出來。
$?git?checkout?dev $?git?stash?pop On?branch?dev Changes?not?staged?for?commit: ??(use?"git?add?<file>..."?to?update?what?will?be?committed) ??(use?"git?checkout?--?<file>..."?to?discard?changes?in?working?directory) ????????modified:???login.php no?changes?added?to?commit?(use?"git?add"?and/or?"git?commit?-a") Dropped?refs/stash@{0}?(2f8476defbaa813e31f3e1b081f5b88416b2ff50)</file></file>
新功能完成后,提交到版本庫。
沖突解決
現在我們新的功能完成了,那么就可以把它合并到master分支上了。現在我們來演示合并時遇到沖突時,如何去解決。
$?git?checkout?master Switched?to?branch?'master' $?git?merge?dev Auto-merging?index.php CONFLICT?(content):?Merge?conflict?in?index.php Automatic?merge?failed;?fix?conflicts?and?then?commit?the?result.
提示我index.php合并的時候有沖突,我們來看看該文件
$?cat?index.php <?php <<<<<<< HEAD echo 'hello world'; ======= echo 'version 1.1 finished'; >>>>>>>?dev
<br>
$?cat?index.php? <?php echo 'version 1.1 finished';
然后再add并提交,最后在提交
$?git?commit?-m?'merge?dev'
這個時候就合并成功了,現在就去刪除dev分支吧。
$?git?branch?-d?dev