上一篇原創寫了圖解Git的第一篇,我的感受仍是能夠,比較基礎的那種,有興趣的能夠看一看[],這一篇咱們繼續圖解Git,上一篇基本就是基礎,這一篇算是進階。git
分支管理
Git中比較最重要的一點就是分支的概念,有了分支就有了合併和衍合的操做,「合併」和「衍合」可以「有效的對代碼版本的管理」。程序員
Git的初始化中有一條默認的主分支叫作master
,每一次的提交都會串成一條時間線,這就是一條分支,當前分支由HEAD
指針指向:web
當每次發生代碼提交的時候,當前指向就會向前造成一個新的版本,假如再建立一個新的分支bran,而且當前的提交指向新的分支,這樣新的分支隨着時間的推移就會造成許多版本:微信
當新分支開發完後,提交倉庫,併合併到主幹master,最後刪除bran分支,這樣就完成了一次我的的開發:app
因此,假如主分支上只創建一條分支的話,分支的合併是很是快速的,只須要移動master分支到當前提交,而後將HEAD指針指向master,最後刪除bran分支就完成了。編輯器
可是,事實上並非這樣的,在一個多人協做的開發團隊中,每每每一個人都會創建本身的分支,有本身的提交,最後合併到主幹,當本身提交的時候,遠程倉庫代碼就會存在本身本地倉庫並未有的代碼,這樣就會致使push失敗。fetch
例如:程序員Tom和Jerry同時遷出代碼,他們的初始代碼分支都以下圖所示:flex
當Tom開發本身的業務模塊,提交代碼而且合併到主幹後,遠程主幹分支以下圖所示:url
「遠程倉庫master已經再也不指向gs234,而是新生成了一個版本dfd453,做爲當前指向的版本」。spa
與此同時,Jerry的本地也同時開發完本身的模塊後,分支以下圖所示:
在Jerry的本地環境中,他的「本地倉庫master仍是指向gs234」,Jerry在本身新創建的一個分支bran
中進行開發,開發完後合併分支,最後master
就會指向ed489
。
當Jerry再次提交代碼,Git就會檢查遠程倉庫與Jerry的本地倉庫,進行對比後,發現遠程倉庫存在Jerry的本地倉庫不存在的代碼,就須要Jerry將遠程倉庫執行git pull
後,自行解決衝突。
上面說了分支基本原理,已經管理分支出現的問題,下面咱們就來一步一步的深刻操做分支的基本命令。
新建分支
Git新建一個分支的命令爲:git branch <分支名字>
,新創建後分以後,切換分支的命令爲:git checkout <分支名字>
。
新建分支的實質:「就是新創建一個引用,指向當前提交,master就比如一個引用」;切換分支的實質:就是將HEAD
由指向原來的引用,從新指向要切換的分支的引用上:
固然上面建立分支而且合併分支的兩條命令能夠合併成一條命令:git checkout -b <分支名字>
當切換分以後,每次commit提交代碼時HEAD指針就會跟隨着新的bran分支移動,造成bran分支上的每個版本:
假如,在新的bran分支上開發到某一個版本,再次切換回master分支進行開發就會造成分叉:
查看分支
當分支建立好了,你能夠經過:git branch
,來查看本身本地的分支狀況:
分支前面帶有*號的表示當前的分支,查看分以後,你就能夠很清楚的知道本身要checkout哪條分支了。
合併分支
開發完本身模塊後,後面就會在本身本地進行合併分支,合併分支的命令:git merge <分支名字>
,它表示「合併指定的分支到當前分支」,好比:當前分支爲master,執行:git merge bran
,表示合併bran分支到當前master分支上。
分支合併也會有失敗的狀況,當你的兩條分支都修改的相同的文件,這時候Git就沒法判斷你要保留哪個修改,就會出現merge衝突。
例如:我先在master
分支修改README.md文件,而後提交本地倉庫:而後切換回分支dev,再次修改README.md文件,再次提交
最後進行合併分支,此時在你兩次修改的README.md文件中就會出現兩次修改的衝突代碼:
由於你兩次修改同一文件的操做,合併後Git並不知道你要保留哪一次的操做,因此它就會將這個決定交給你本身決定,它只告訴你文件中哪裏的代碼衝突了,具體怎麼改就由你本身去弄。
刪除分支
最後是刪除本身新建的分支,經過:git branch -d <分支名字>
,進行刪除分支,假如分支刪除不了,能夠經過:git branch -D <分支名字>
,強制刪除分支:
Git中刪除分支的實質:dev只是一個分支的引用,因此刪除分支也就是刪除這個引用,並不會刪除任何conmit,因此刪除操做也是很是高效的。
假如一條分支commit的引用被刪除,那麼這條分支的就沒有任何引用指向,這樣就會找不到這條分支,最後就會被Git回收機制回收。
查看遠程
在多人協做的團隊下,你可能要隨時查看遠程倉庫的狀況,能夠經過:git remote,進行查看,加上-v參數能夠查看遠程倉庫的詳細狀況。
git remote
git remote -v
推送分支
分支的推送到遠程上一節已經提過,使用git push命令就能夠進行分支的推送,命令後面加上分支的命令,表示具體推送哪條分支:
git push origin master // 將本地master分支推送到遠程庫
拉取分支
分支的拉取使用git pull命令,這條命令至關於如下兩條命令:
git fetch
git merge
可是通常實際工做中,均可能會直接使用git pull命令:
分支管理策略
在合併分支的時候,Git會以快速合併的模式進行合併(Fast forward),可是這種模式刪除分支後,會丟失分支的信息。
Git中還能夠以「普通模式」進行合併,在原來git merge命令後面加上--no-ff參數便可,合併的命令以下:
$ git merge --no-ff -m "message" dev
臨時存取工做區的改動
在開發中,如果某一時刻你想把當前的改動臨時進行存放起來,可使用git stash
命令,它表示將改動的文件存儲到一個獨立的存儲區域,並不會被提交,當再次須要的時候能夠隨時取出來。
這裏要注意的是:「git stash的是改動的文件,也就是被Git追蹤的文件,新添加的文件並無被Git追蹤,因此git stash並不會stash」。
git stash命令也能夠加上save命令後面再加上備註信息,方便查看:
git stash save "備註信息"
git stash
成功後「本地的工做目錄的代碼會和本地倉庫同樣」,git stash
後能夠經過git stash list
命令查看以前stash的歷史記錄,當再次須要將改動的文件取出來時候,能夠經過如下命令:
git stash pop
git stash pop
表示「彈出第一個被stash的記錄,而且該stash會從歷史記錄中刪除」;也可使用git stash apply
命令「彈出stash,可是這條命令stash仍然會保存在stash歷史記錄中」,你也能夠經過:git stash drop
命令來刪除。
這一篇就只講解了Git的分支原理以及Git的臨時存取操做,限於篇幅,咱們今天就到這裏,咱們下一期繼續圖解Git操做,咱們下一期再見。
本文分享自微信公衆號 - 非科班的科班(LDCldc123095)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。