什么是Git搂抒?
Git直接翻譯是「蠢貨,飯桶」朝群,然而卻是由天才開發(fā)出來的燕耿,被全世界最活躍的開發(fā)者使用的版本管理系統(tǒng)〗郑可能是一些黑色幽默吧,就像Geek這個詞一樣淀散。
這里簡單介紹一下右莱,詳情請查閱資料蚜锨,本文主要是要講解一下使用中的一些問題。
Git是一款免費慢蜓、開源的分布式版本控制系統(tǒng)亚再,用于敏捷高效地處理任何或小或大的項目。 Git的讀音為/g?t/晨抡。
Git是一個開源的分布式版本控制系統(tǒng)氛悬,可以有效、高速的處理從很小到非常大的項目版本管理耘柱。 Git 是 Linus Torvalds 為了幫助管理 Linux 內(nèi)核開發(fā)而開發(fā)的一個開放源碼的版本控制軟件如捅。
常用基本命令
git init
:初始化
git clone
:克隆
git status
:查看狀態(tài)
git add
:添加
git commit
:提交
git pull
:拉
git push
:推
以上幾個命令比較簡單,略微查下資料即可順利使用调煎。
稍復雜基本命令
git log
: 查看所有commit
記錄镜遣。
git tag
: 在進行客戶端開發(fā)時,常會考慮到版本士袄。使用git tag v1.0
,那么就在當前代碼狀態(tài)下新建了一個v1.0
的標簽恐疲,使用git tag可以查看當前所有標簽逢捺。使用git checkout v1.1
的話,那么就切換到v1.1
的代碼狀態(tài)下。
git diff
: 比較當前文件和暫存區(qū)的差異笤受,兩次commit
之間的差異,兩條分支之間的差異架曹,兩個版本庫之間的差異捞蚂。
git checkout
: 切換,checkout
可以切換標簽需了,分支跳昼。checkout
還能撤銷還沒有add
進暫存區(qū)的代碼,比如git checkout readme.md
即可撤銷對于md文檔的改動肋乍。
git rm --cached
: 移除暫存區(qū)中等待提交的代碼
git remote add origin test
: 本地倉庫與遠程名為tes的t倉庫進行關聯(lián)
別名alias
當經(jīng)常使用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'
下面是這篇文章所要講的重點:團隊協(xié)作觅闽。
分支
- 什么是分支帝雇?為什么需要分支?
可以設想這么一個情況蛉拙,假如一款產(chǎn)品只有一份代碼尸闸,而需要多人開發(fā),那么每個人都在這一份代碼上隨意修改,那豈不是亂了套吮廉?
這時候我們就需要用到分支苞尝,使一個項目組中的不同開發(fā)者相互獨立,互不干擾宦芦。
在云端宙址,首先需要一份代碼之源,我們稱之為:主分支(master)调卑,猶如青藏高原巴顏喀拉山脈之于黃河抡砂。另外一條重要分支是開發(fā)分支(develop)。
可以概括為:
master:隨時處于準備發(fā)布狀態(tài)
develop:最新的開發(fā)狀態(tài)
- 初步協(xié)調(diào)團隊
線上一般保留master恬涧,develop兩條分支注益,開發(fā)者首先從master分支pull下代碼,然后在本地基于master再新建本地develop分支气破,然后在develop分支上進行開發(fā)聊浅。
- 若在本地完成開發(fā)內(nèi)容,可以將本地develop合并到本地master现使,將本地master推到線上master低匙,切換回本地develop,將本地develop推到線上develop碳锈。(有點拗口顽冶,其實就兩個步驟)
- 若在本地只開發(fā)到一半,可以將本地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
: 強制刪除本地分支,為什么要強制刪除封拧?因為在一些情況下是無法常規(guī)刪除的,比如:你的test
分支本身還存在未合并的代碼夭问,此時想要使用git branch -d a
是無法刪除這個分支的泽西,會出現(xiàn)智能提示。 -
git push origin :test
:刪除遠程分支缰趋。 -
git checkout develop origin/develop
:將遠程分支遷移到本地捧杉。
合并
合并有兩種方式:merge
rebase
- merge
假如在test
分支上進行開發(fā)陕见,開發(fā)完成后想要把分支合并到master
分支。
- 首先需要切換到master分支
git checkout master
-
git merge test
不出意外就能將test
分支合并進來糠溜,但是需要考慮意外情況:發(fā)生版本沖突淳玩。
- rebase
rebas
e和merge
有異曲同工之處直撤,使用rebase
也能達到合并分支的效果非竿。
git checkout master
git rebase test
但是這兩點的差異在哪?這是stormzhang的一個比喻:
rebase
跟merge
的區(qū)別你們可以理解成有兩個書架谋竖,你需要把兩個書架的書整理到一起去红柱,第一種做法是merge
,比較粗魯暴力蓖乘,就直接騰出一塊地方把另一個書架的書全部放進 去锤悄,雖然暴力,但是這種做法你可以知道哪些書是來自另一個書架的嘉抒;第二種做法就是rebase
零聚,他會把兩個書架的書先進行比較,按照購書的時間來給他重新排序些侍,然后重新放置 好隶症,這樣做的好處就是合并之后的書架看起來很有邏輯,但是你很難清晰的知道哪些書來自哪個書架的岗宣。
沖突
兩個人在兩條分支上開發(fā)不同的功能蚂会,然后依次合并到主分支,一般來說兩人各司其職是不會出現(xiàn)問題的耗式。但是有些情況胁住,兩個人對同一塊公共代碼進行了更改,比如工具類刊咳。
此時第一個人可以順利合并master彪见,但是第二個人提交時會出現(xiàn)沖突,需要手動解決沖突才能順利合并娱挨。
在解決沖突問題時余指,我們可以根據(jù)提示的代碼差異進行更改后重新提交。
Stash
假如我們已經(jīng)在一個分支開發(fā)到了一半让蕾,現(xiàn)在需要切換到別的分支去完成一些任務浪规,那么現(xiàn)在當前的代碼如何保留呢?
此時需要用到stash
探孝,當然前提是沒有commit
笋婿。
首先執(zhí)行 git stash
此時會將還沒有commit
的代碼保存到一個暫存區(qū),此時執(zhí)行git status
查看顿颅,會發(fā)現(xiàn)當前分支沒有等待提交的代碼缸濒。
git stash list
可以 查看暫存區(qū)有多少條記錄(一條分支暫存的所有代碼只會生成一條記錄)
此時可以切換到其他分支,將任務完成,再切回到原來的分支庇配,此時斩跌,如何將未提交的代碼還原?
執(zhí)行git stash apply
,然后使用git stash drop
將暫存區(qū)的記錄刪除捞慌。
而git stash pop
相當于將上述兩步變?yōu)橐徊健?/p>
進階協(xié)調(diào)
理想化的狀態(tài)是這樣:比如有三個人開發(fā)一款產(chǎn)品耀鸦,那三個人分別創(chuàng)建三個分支,在各自的分支上完成后合依次合并到master
啸澡。而現(xiàn)實情況的干擾因素卻多得多袖订。這時候需要用到分支管理流程GitFlow
。
- 一般狀態(tài)下有兩個主要分支:
master
:隨時處于準備發(fā)布狀態(tài)
develop
:最新的開發(fā)狀態(tài)
如果出現(xiàn)了線上版本出現(xiàn)嚴重bug需要緊急修復嗅虏,或者某些功能完成后出現(xiàn)了需求變更洛姑,這時,需要再引入三個輔助分支皮服。
-
feature
: 開發(fā)新功能的分支, 基于develop
, 完成后merge
回develop
-
release
: 準備要發(fā)布版本的分支, 用來修復 bug楞艾,基于develop
,完成后merge
回develop
和master
-
hotfix
: 修復master
上的問題,緊急情況龄广, 等不及release
版本就必須馬上上線. 基于master
, 完成后merge
回master
和develop
情景:
假如我們現(xiàn)在的項目有master
和develop
分支
現(xiàn)在我準備開發(fā)一個登錄功能硫眯,B同學準備開發(fā)一個注冊功能,那么我需要基于
develop
分支新建git branch feature/login
,B同學需要基于develop
新建git branch feature/register
比如突然說線上版本的圖片顯示出了bug蜀细,需要緊急修復舟铜,盡快上線,那么需要在
master
分支下執(zhí)行git branch hotfix/imgDisplay
,修復完成后合并到master
和develop
如果某一階段開發(fā)的差不多了奠衔,功能都已經(jīng)合并到了
develop
谆刨,現(xiàn)在需要對develop
上的代碼進行一個整體的測試,假如測試通過归斤,可以發(fā)布到正式環(huán)境痊夭,此時可以基于develop
新建一個分支git branch release/v1.0
這是一個規(guī)范化的分支管理流程,可能在小團隊的開發(fā)中脏里,有些步驟可以忽略她我,但是我建議還是按照這一套邏輯管理代碼會更為高效。
當然迫横,如果你覺得輸入這些命令很麻煩番舆,尤其是可以將命令行合并為命令塊的情況,你可以使用gitflow
[圖片上傳中...(git2.jpg-5e9156-1516778428798-0)]
推出的一套工具矾踱,簡化命令恨狈。開源地址:https://github.com/nvie/gitflow