git圖解3:分支操做

圖片描述

git 的分支是它最明顯的特性, 大部分人聽別人推薦使用git都會聽到「git分支操做方便...」,對比其餘版本控制系統git 分支操做有難以置信的輕量,建立新分支幾乎瞬間完成,不一樣分支之間切換也很是快捷方便;本文將結合實踐以及繪圖概括、總結git常見的分支操做指令以及注意事項;本文只總結git分支的實踐運用, git分支底層實現原理請閱讀ProGit第二版分支部分章節;git

1.GIT建立分支;

首先咱們得知道, GIT分支包括本地分支 跟 遠程分支; 慣例先上圖:
圖片描述github

有時遠程有的分支咱們本地沒有(其餘同事維護的分支), 或者本地有的分支遠程沒有(修復線上小問題開的本地小分支);如下具體說下如何建立本地分支和遠程分支:typescript

1.1 建立本地分支:

新分支都是基於原有分支建立, 而在實踐開發中基本從線上分支(與線上代碼同步的分支): master 分支建立。
圖片描述
而 從master建立本地分支也有兩種方式:基於本地master分支建立分支、基於線上master分支建立分支;
基於本地master分支建立分支(命令窗口進入工程根目錄):
查看當前是否在master分支:vim

// 查看本地分支信息
git branch

圖片描述
綠色分支表示其爲當前分支,因此得切換至master分支segmentfault

git checkout master
git pull
// 建立並切換到新分支至關於:git branch xxx, git checkout xxx
git checkout -b newBranchName

git checkout master 切換到本地master分支;windows

git pull 更新本地master分支代碼至最新(如 本地master分支未關聯遠程master分支,git pull origin master);緩存

git checkout -b newBranchName 基於本地master分支代碼建立新分支:newBranchName,並切換到該分支;
圖片描述sass

基於遠程master分支建立分支(命令窗口進入工程根目錄):工具

首先查看本地、線上分支信息(調用如下指令前建議先執行"git pull -p"防止本地git分支信息緩存):測試

git branch -a

圖片描述
白色顯示爲本地分支、綠色顯示爲當前分支、紅色顯示爲遠程分支;

切換至遠程分支:

git checkout remotes/origin/master

基於遠程master分支建立新分支:

git checkout -b newBranchName

圖片描述

1.2 建立遠程分支:

建立遠程分支能夠直接由本地新分支推送完成也能夠在遠程分支管理系統(例如:github 、gitLab)上可視化操做完成;

本地新分支推送建立遠程分支
在 1.1 部分咱們在本地建立了一新分支, 若是在該分支更新了代碼, 而後執行git add git commit指令後, 再執行如下指令可在遠程建立新分支;

// git push <遠程主機名> <本地分支名>:<遠程分支名>
git push origin newBranch:newBranch

圖片描述

GitHub上建立遠程分支

選中項目, 而後在項目首頁左上側點選分支按鈕, 彈出的彈層輸入新分支名稱便可;
圖片描述
圖片描述
PS: 上述建立的同名本地分支跟遠程分支並沒創建關聯, 這樣操做指令會比較不方便(如「git pull」指令得輸入對應的遠程分支名), 怎麼讓其創建關聯?

切換到newBranchName分支(如當前處在其餘分支):

git checkout newBranchName

執行更新代碼指令:

git pull

就能看到git 的關聯提示:
圖片描述

按照其提示提示執行指令便可:

// git branch --set-upstream-to=origin/<遠程分支名> <本地分支名>如設置當前分支,第二個參數可省略,;
git branch --set-upstream-to=origin/newBranchName

校驗是否關聯成功:

git pull

提示 「Already up-to-date.」 表示已關聯成功;

2.GIT切換分支;

2.1工做區沒新代碼切換分支:

建立好新分支後就能夠在新分支進行開發, 但可能中途須要去維護其餘分支代碼;這個時候就得切換分支了,切換分支指令:

git checkout newBranch2

ps: 編輯代碼不會直接在develop、master分支操做,由於最終代碼要同時合併到這兩個分支上,因此通常均在新分支開發(即便是很小的改動);

2.2工做區有新代碼切換分支:

工做區間的代碼均已提交到本地倉庫(當前分支), 那切換分支沒什麼問題, 但若是工做區域代碼還沒有提交,這時切換分支會怎樣呢?
有時候沒法切換, 有時候能正常切換;
能正常切換:改動的代碼能正常合併到切換後的分支(自動合併成功)
沒法切換:改動的代碼不能正常合併到切換後的分支(自動合併失敗)
工做區間有未提交代碼,切換分支自動執行git merge操做,故有衝突將沒法切換成功;
固然也會有這樣的場景: 當前分支代碼沒寫完,還不想提交且由於有緊急需求不得不切換分支;這個時候能夠 使用「工做現場」將代碼暫時放着:

// 如 直接 "git stash"則將上次commit註釋做爲說明
git stash save "存儲說明"
git checkout B

圖片描述
處理完緊急需求拿出繼續開發:

git checkout A
git stash pop

圖片描述

若是原本想在A分支上開發, 開發過程當中才發現當前處在B分支,想強制將工做區間代碼遷到A分支也能夠藉助「工做現場」完成:

git stash save "存儲說明"
git checkout B

圖片描述

git stash pop
// 若有衝突且處理完全部衝突
git add -A

圖片描述

2.3切換分支異常處理(windows下)

很多在windows下使用git的同窗會碰到這樣的問題: 從A分支切換到B分支因爲git異常致使雖然切換分支成功,但在當前B分支上留存了大量A分支的代碼(被git認爲是新的改動或新增文件);
這個時候就得用到上一篇博文(git圖解2:git 代碼回退;)知識了!
咱們能夠將全部改動提交, 而後使用遠程分支代碼覆蓋!放心提交到本地倉庫,反正後面這個commit會被覆蓋。

// 將全部改動提交到本地倉庫
git add -A
git commit -m "這個commit會被覆蓋"
//B 是當前分支名
git reset --hard origin/B

慣例放圖:

圖片描述

3.GIT合併分支;

3.1正常合併分支代碼

分支代碼合併也有兩方式: 合併本地分支代碼、合併遠程分支代碼;

合併本地分支代碼: 例如在新分支 newBranch開發的功能已完成並已提交;接下來走測試流程須要將代碼合併到develop分支(我所在團隊develop爲測試分支,不一樣團隊的測試分支會不同)。

// 切換到develop分支
git checkout develop
// 合併newBranch代碼
git merge newBranch
// 提交commit到遠程(newBranch分支有多少個commit就會生成幾個)
git push

圖片描述

合併遠程分支代碼: 若是新分支由多人維護,爲保證更新代碼爲最新,使用上述方式合併分支會比較麻煩:

首先得切換到本地newBranch分支(git checkout newBranch);

而後更新代碼(git pull);

再次切換回develop分支(git checkout develop);

最後才能執行合併操做(git merge newBranch);

其實可直接將遠程的 newBranch分支代碼合併到本地 develop分支:

git pull origin newBranch

圖片描述

3.2合併代碼衝突解決

不管哪一種方式合併分支代碼代碼衝突是無可避免的狀況, 開發流程使用了typescript/sass等須要執行編譯的語言更容易產生衝突;

分支合併代碼衝突跟通常代碼衝突同樣: git能處理的衝突會自動解決, 不然就得手動解決衝突;衝突是因爲多人維護代碼致使,必定要找到相關人一塊兒討論衝突代碼的取捨;

若是待合併分支代碼跟當前分支前幾回commit修改了同一文件,合併分支就會出現如下提示:
圖片描述
以上提示git自動合併失敗,須要手動解決衝突, 打開衝突文件會發現如下:
圖片描述
HEAD=======之間爲當前分支改動, =======>>>>>>> newBranch爲待合併分支的改動;

手動解決衝突後:
圖片描述

告訴git衝突已解決:

git add -A

合併完成,提交代碼:

git commit -m "[master]-合併newBranch代碼"
git push

3.3合併代碼異常處理

同切換分支異常狀況, 在windows下合併分支也會出現異常, 異常處理方式同上:

// 將全部改動提交到本地倉庫
git add -A
git commit -m "這個commit會被覆蓋"
//B 是當前分支名
git reset --hard origin/B

3.4合併代碼減小commit次數(簡潔合併)

在合併分支後使用可視化工具查看代碼提交記錄(或者 "git log" 指令), 有代碼潔癖的同窗可能接受不了。若是 newBranch分支開發過程當中有10個commit, 那合併完成後(沒產生衝突)也會產生10個commit;如何讓合併代碼後commit更簡潔?

使用git rebase合併分支代碼(實際開發中會發現git rebase執行起來很是麻煩):

rebase,合併的結果好看:清晰、直觀,但合併過程當中出現衝突處理比較麻煩(rebase過程當中,一個commit出現衝突,下一個commit也極有可能出現衝突,一次rebase可能要解決屢次衝突);

merge,合併結果很差看:一堆線交錯,但合併有衝突的話,只要解決一次就好了;

因此建議先git rebase xxx,若有衝突,git rebase --abort,再換用git merge xxx

另外一方案: 能夠合併完成後(git push以前)編輯commit 信息, 將多個commit合併成一個:

例如: 我再當前newBranch分支提交了三個commit :
圖片描述

執行git rebase -i進入交互模式,自動打開vim:

將後兩個「pick」改爲(vim模式輸入「i」進入編輯狀態)「s」, 而後保存退出(esc退出編輯狀態,而後":"輸入「wq」保存退出):
圖片描述
保存成功後還有一個編輯vim, 合併commit後,新的commit註釋填寫下,保存退出:
圖片描述

合併完成:
圖片描述

ps: 簡潔合併付出的就是多餘的操做, 實際開發講求的是效率, 因此不少人懶得弄這些(例如我);

4.GIT刪除分支;

git的分支在完成它使命後就不必存在了:

上線流程完成:應刪除本地分支及遠程分支(git lab分支): git branch -D xxxx, 上線完成意味着當前xxx分支代碼已經合併到線上分支(master)以及開發分支(develop), 該分支後續功能的改動(bug修復或代碼擴展)徹底能夠在master新開分支完成;(不然可能遺忘刪除,致使遠程分支原來越多) ----[git_tips - [ git經常使用指令排行榜 ] - 看雲](http://www.kancloud.cn/wteamx...

4.1刪除本地分支

// "-d" 若是該分支代碼未合併到其餘分支,將沒法刪除;
// "-D" 強制刪除分支,不會出現任何提示;
git branch -D xxxx

4.2刪除遠程分支

刪除遠程分支兩種方式:

1.在git管理系統的Web頁面操做(gitLab);
gitHub上沒法刪除遠程分支, 若是你團隊使用的是gitLab那能夠在gitLab管理頁面操做;

2.本地指令完成;

git push origin --delete newBranch

參考資料:

git branch官方API文檔
從新組織git本地提交 | yongpoliu.com
git經常使用指令排行榜

相關文章:

git圖解1:git區域總結;
git圖解2:git 代碼回退;

相關文章
相關標籤/搜索