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倉庫進行關聯
當常用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分支上進行開發。
git branch test
:新建test
分支。須要提一下的是,所建分支是基於當前分支的。git checkout test
:切換到分支test
。git checkout -b test
:將上述兩步合爲一步。git push origin test
:將本地test
分支推送到遠程倉庫。git branch
:查看本地分支列表。git branch -r
:查看遠端分支列表。git branch -d test
:刪除本地分支test
。git branch -D test
: 強制刪除本地分支,爲何要強制刪除?由於在一些狀況下是沒法常規刪除的,好比:你的test
分支自己還存在未合併的代碼,此時想要使用 git branch -d a
是沒法刪除這個分支的,會出現智能提示。git push origin :test
:刪除遠程分支。git checkout develop origin/develop
:將遠程分支遷移到本地。####合併 合併有兩種方式:merge
rebase
假如在test
分支上進行開發,開發完成後想要把分支合併到master
分支。
git checkout master
git merge test
不出意外就能將test
分支合併進來,可是須要考慮意外狀況:發生版本衝突。rebas
e和merge
有殊途同歸之處,使用rebase
也能達到合併分支的效果。 git checkout master
git rebase test
可是這兩點的差別在哪?這是stormzhang的一個比喻:
rebase
跟merge
的區別大家能夠理解成有兩個書架,你須要把兩個書架的書整理到一塊兒去,第一種作法是merge
,比較粗魯暴力,就直接騰出一塊地方把另外一個書架的書所有放進 去,雖然暴力,可是這種作法你能夠知道哪些書是來自另外一個書架的;第二種作法就是rebase
,他會把兩個書架的書先進行比較,按照購書的時間來給他從新排序,而後從新放置 好,這樣作的好處就是合併以後的書架看起來頗有邏輯,可是你很難清晰的知道哪些書來自哪一個書架的。
兩我的在兩條分支上開發不一樣的功能,而後依次合併到主分支,通常來講兩人各司其職是不會出現問題的。可是有些狀況,兩我的對同一塊公共代碼進行了更改,好比工具類。 此時第一我的能夠順利合併master,可是第二我的提交時會出現衝突,須要手動解決衝突才能順利合併。
在解決衝突問題時,咱們能夠根據提示的代碼差別進行更改後從新提交。
假如咱們已經在一個分支開發到了一半,如今須要切換到別的分支去完成一些任務,那麼如今當前的代碼如何保留呢?
此時須要用到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
, 完成後 merge
回 develop
release
: 準備要發佈版本的分支, 用來修復 bug,基於 develop
,完成後 merge
回 develop
和 master
hotfix
: 修復 master
上的問題,緊急狀況, 等不及 release
版本就必須立刻上線. 基於 master
, 完成後 merge
回 master
和 develop
假如咱們如今的項目有master
和develop
分支
如今我準備開發一個登陸功能,B同窗準備開發一個註冊功能,那麼我須要基於develop
分支新建 git branch feature/login
,B同窗須要基於develop
新建git branch feature/register
好比忽然說線上版本的圖片顯示出了bug,須要緊急修復,儘快上線,那麼須要在master
分支下執行 git branch hotfix/imgDisplay
,修復完成後合併到master
和develop
若是某一階段開發的差很少了,功能都已經合併到了develop
,如今須要對develop
上的代碼進行一個總體的測試,假如測試經過,能夠發佈到正式環境,此時能夠基於develop
新建一個分支git branch release/v1.0
這是一個規範化的分支管理流程,可能在小團隊的開發中,有些步驟能夠忽略,可是我建議仍是按照這一套邏輯管理代碼會更爲高效。
固然,若是你以爲輸入這些命令很麻煩,尤爲是能夠將命令行合併爲命令塊的狀況,你可使用gitflow
推出的一套工具,簡化命令。開源地址:https://github.com/nvie/gitflow