(二)深刻淺出圖解Git,入門到精通(保姆級教程)

上一篇原創寫了圖解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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索