Git | 如何優♂雅地管理版本

Git

什麼是Git?

Git直接翻譯是「蠢貨,飯桶」,然而倒是由天才開發出來的,被全世界最活躍的開發者使用的版本管理系統。多是一些黑色幽默吧,就像Geek這個詞同樣。git

這裏簡單介紹一下,詳情請查閱資料,本文主要是要講解一下使用中的一些問題。github

Git是一款免費、開源的分佈式版本控制系統,用於敏捷高效地處理任何或小或大的項目。  Git的讀音爲/gɪt/。app

Git是一個開源的分佈式版本控制系統,能夠有效、高速的處理從很小到很是大的項目版本管理。 Git 是 Linus Torvalds 爲了幫助管理 Linux 內核開發而開發的一個開放源碼的版本控制軟件。分佈式

經常使用基本命令

git init:初始化 git clone:克隆 git status:查看狀態 git add:添加 git commit:提交 git pull:拉 git push:推工具

以上幾個命令比較簡單,略微查下資料便可順利使用。測試

稍複雜基本命令

git log: 查看全部commit記錄。命令行

git tag: 在進行客戶端開發時,常會考慮到版本。使用git tag v1.0,那麼就在當前代碼狀態下新建了一個v1.0的標籤,使用git tag能夠查看當前全部標籤。使用git checkout v1.1的話,那麼就切換到v1.1的代碼狀態下。翻譯

git diff: 比較當前文件和暫存區的差別,兩次commit之間的差別,兩條分支之間的差別,兩個版本庫之間的差別。版本控制

git checkout: 切換,checkout能夠切換標籤,分支。checkout還能撤銷尚未add進暫存區的代碼,好比git checkout readme.md便可撤銷對於md文檔的改動。code

git rm --cached: 移除暫存區中等待提交的代碼

git remote add origin test: 本地倉庫與遠程名爲tes的t倉庫進行關聯

別名alias

當常用Git時,會在輸入命令上消耗一些時間,尤爲是一些比較長的命令,這時候用戶能夠自定義別名,用來簡化命令。好比: git config --global alias.co checkout git config --global alias.ci commit git config --global alias.psm 'push origin master' git config --global alias.plm 'pull origin master'

###下面是這篇文章所要講的重點:團隊協做。

####分支

  • 什麼是分支?爲何須要分支?

能夠設想這麼一個狀況,假如一款產品只有一份代碼,而須要多人開發,那麼每一個人都在這一份代碼上隨意修改,那豈不是亂了套?

這時候咱們就須要用到分支,使一個項目組中的不一樣開發者相互獨立,互不干擾。 在雲端,首先須要一份代碼之源,咱們稱之爲:主分支(master),猶如青藏高原巴顏喀拉山脈之於黃河。另一條重要分支是開發分支(develop)。

能夠歸納爲: master:隨時處於準備發佈狀態 develop:最新的開發狀態

  • 初步協調團隊

線上通常保留master,develop兩條分支,開發者首先從master分支pull下代碼,而後在本地基於master再新建本地develop分支,而後在develop分支上進行開發。

  1. 若在本地完成開發內容,能夠將本地develop合併到本地master,將本地master推到線上master,切換回本地develop,將本地develop推到線上develop。(有點拗口,其實就兩個步驟)
  2. 若在本地只開發到一半,能夠將本地develop推到線上develop。
  • 命令行
  1. git branch test :新建test分支。須要提一下的是,所建分支是基於當前分支的。
  2. git checkout test:切換到分支test
  3. git checkout -b test:將上述兩步合爲一步。
  4. git push origin test:將本地test分支推送到遠程倉庫。
  5. git branch:查看本地分支列表。
  6. git branch -r:查看遠端分支列表。
  7. git branch -d test:刪除本地分支test
  8. git branch -D test: 強制刪除本地分支,爲何要強制刪除?由於在一些狀況下是沒法常規刪除的,好比:你的test分支自己還存在未合併的代碼,此時想要使用 git branch -d a是沒法刪除這個分支的,會出現智能提示。
  9. git push origin :test:刪除遠程分支。
  10. git checkout develop origin/develop:將遠程分支遷移到本地。

####合併 合併有兩種方式:merge rebase

  • merge

假如在test分支上進行開發,開發完成後想要把分支合併到master分支。

  1. 首先須要切換到master分支 git checkout master
  2. git merge test 不出意外就能將test分支合併進來,可是須要考慮意外狀況:發生版本衝突。
  • rebase rebase和merge有殊途同歸之處,使用rebase也能達到合併分支的效果。 git checkout master git rebase test

可是這兩點的差別在哪?這是stormzhang的一個比喻:

rebasemerge 的區別大家能夠理解成有兩個書架,你須要把兩個書架的書整理到一塊兒去,第一種作法是 merge ,比較粗魯暴力,就直接騰出一塊地方把另外一個書架的書所有放進 去,雖然暴力,可是這種作法你能夠知道哪些書是來自另外一個書架的;第二種作法就是 rebase ,他會把兩個書架的書先進行比較,按照購書的時間來給他從新排序,而後從新放置 好,這樣作的好處就是合併以後的書架看起來頗有邏輯,可是你很難清晰的知道哪些書來自哪一個書架的。

衝突

兩我的在兩條分支上開發不一樣的功能,而後依次合併到主分支,通常來講兩人各司其職是不會出現問題的。可是有些狀況,兩我的對同一塊公共代碼進行了更改,好比工具類。 此時第一我的能夠順利合併master,可是第二我的提交時會出現衝突,須要手動解決衝突才能順利合併。

在解決衝突問題時,咱們能夠根據提示的代碼差別進行更改後從新提交。

Stash

假如咱們已經在一個分支開發到了一半,如今須要切換到別的分支去完成一些任務,那麼如今當前的代碼如何保留呢?

此時須要用到stash,固然前提是沒有commit。 首先執行 git stash 此時會將尚未commit的代碼保存到一個暫存區,此時執行git status查看,會發現當前分支沒有等待提交的代碼。 git stash list能夠 查看暫存區有多少條記錄(一條分支暫存的全部代碼只會生成一條記錄)

此時能夠切換到其餘分支,將任務完成,再切回到原來的分支,此時,如何將未提交的代碼還原? 執行git stash apply,而後使用git stash drop將暫存區的記錄刪除。 而git stash pop至關於將上述兩步變爲一步。

進階協調

理想化的狀態是這樣:好比有三我的開發一款產品,那三我的分別建立三個分支,在各自的分支上完成後合依次合併到master。而現實狀況的干擾因素卻多得多。這時候須要用到分支管理流程GitFlow

  • 通常狀態下有兩個主要分支: master:隨時處於準備發佈狀態 develop:最新的開發狀態

若是出現了線上版本出現嚴重bug須要緊急修復,或者某些功能完成後出現了需求變動,這時,須要再引入三個輔助分支。

  • feature: 開發新功能的分支, 基於 develop, 完成後 mergedevelop
  • release: 準備要發佈版本的分支, 用來修復 bug,基於 develop,完成後 mergedevelopmaster
  • hotfix: 修復 master 上的問題,緊急狀況, 等不及 release 版本就必須立刻上線. 基於 master, 完成後 mergemasterdevelop
情景:

假如咱們如今的項目有masterdevelop分支

  • 如今我準備開發一個登陸功能,B同窗準備開發一個註冊功能,那麼我須要基於develop分支新建 git branch feature/login,B同窗須要基於develop新建git branch feature/register

  • 好比忽然說線上版本的圖片顯示出了bug,須要緊急修復,儘快上線,那麼須要在master分支下執行 git branch hotfix/imgDisplay,修復完成後合併到masterdevelop

  • 若是某一階段開發的差很少了,功能都已經合併到了develop,如今須要對develop上的代碼進行一個總體的測試,假如測試經過,能夠發佈到正式環境,此時能夠基於develop新建一個分支git branch release/v1.0

這是一個規範化的分支管理流程,可能在小團隊的開發中,有些步驟能夠忽略,可是我建議仍是按照這一套邏輯管理代碼會更爲高效。

固然,若是你以爲輸入這些命令很麻煩,尤爲是能夠將命令行合併爲命令塊的狀況,你可使用gitflow 推出的一套工具,簡化命令。開源地址:https://github.com/nvie/gitflow

相關文章
相關標籤/搜索