什么是Git
Git是一個開源的分布式版本控制系統(tǒng),可以有效絮重、高速地處理從很小到非常大的項目版本管理。
Git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)(沒有之一)
好不好用,看看它的開發(fā)者是誰就知道了:Linux之父 Linus Torvalds
小歷史: Linux內(nèi)核社區(qū)原本使用的是名為BitKeeper的商業(yè)化版本控制工具桥嗤,2005年,因為社區(qū)內(nèi)有人試圖破解BitKeeper的協(xié)議仔蝌,BitMover公司收回了免費(fèi)使用BitKeeper的權(quán)力泛领。
Linus原本可以出面道個歉,繼續(xù)使用BitKeeper敛惊,然而并沒有渊鞋。。瞧挤。Linus大神僅用了兩周時間锡宋,自已用C寫了一個分布式版本控制系統(tǒng),于是Git誕生了特恬!
為什么要使用Git.
1执俩、適合分布式開發(fā),強(qiáng)調(diào)個體癌刽。
2役首、公共服務(wù)器壓力和數(shù)據(jù)量都不會太大。
3显拜、速度快衡奥、靈活。
4远荠、任意兩個開發(fā)者之間可以很容易的解決沖突杰赛。
5、離線工作矮台。
基本的 Git 工作流程如下:
在工作目錄中修改某些文件乏屯。
對修改后的文件進(jìn)行快照根时,然后保存到暫存區(qū)域。
提交更新辰晕,將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲到 Git 目錄中蛤迎。
所以,我們可以從文件所處的位置來判斷狀態(tài):如果是Git目錄中保存著的特定版本文件含友,就屬于已提交狀態(tài)替裆;如果作了修改并已放入暫存區(qū)域,就屬于已暫存狀態(tài)窘问;如果自上次取出后辆童,作了修改但還沒有放到暫存區(qū)域,就是已修改狀態(tài)惠赫。
創(chuàng)建版本庫
有兩種取得Git項目倉庫的方法把鉴。第一種是在現(xiàn)存的目錄下,通過導(dǎo)入所有文件來創(chuàng)建新的Git倉庫儿咱。 第二種是從已有的Git倉庫克隆出一個新的鏡像倉庫來庭砍。
在目錄中創(chuàng)建新倉庫
如果一個目錄還沒有使用Git進(jìn)行管理,只需到此項目所在的目錄混埠,執(zhí)行git init
怠缸,初始化后,在當(dāng)前目錄下會出現(xiàn)一個名為.git的目錄
$ mkdir learngit
$ cd learngit
$ git init
從已有的倉庫克隆
如果Git項目已經(jīng)存在钳宪,可以使用git clone
從遠(yuǎn)程服務(wù)器上復(fù)制一份出來
版本庫基本操作
檢查當(dāng)前文件狀態(tài)
使用git status
命令可以查看文件的狀態(tài)
$ git status
On branch masterInitial commit
nothing to commit (create/copy filesanduse"git add"to track)
出現(xiàn)如上的提示揭北,說明現(xiàn)在的工作目錄相當(dāng)干凈,所有已跟蹤文件在上次提交后都未被更改過吏颖。
現(xiàn)在我們做一些改動搔体,添加一個readme.txt進(jìn)去,然后再看一下狀態(tài)
$ cat readme.txt
hello git
^C
git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
readme.txt
nothing added to commit but untracked files present (use "git add" to track)
Untracked files顯示了這個新創(chuàng)建的readme.txt處于未跟跟蹤狀態(tài)
使用git add
命令開始跟蹤一個新文件
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.txt
readme.txt已被跟蹤侦高,并處于暫存狀態(tài)
將本次修改暫存
現(xiàn)在我們再對readme.txt進(jìn)行修改,添加一行厌杜,再執(zhí)行g(shù)it status查看狀態(tài)
$ git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: readme.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: readme.txt
可以看到readme.txt 不僅出現(xiàn)在了Changes to be committed奉呛,還出現(xiàn)在了Changes not staged for commit
由此可見,Git關(guān)心的是Changes夯尽,而不是文件本身瞧壮。
再次執(zhí)行git add
,可以將本次修改提交到暫存區(qū)匙握,Changes not staged for commit提示消失
提交更新
使用git commit
命令將暫存區(qū)中的內(nèi)容提交至版本庫咆槽,工作區(qū)又是干凈的了
$ git commit -m "my first commit"
[master (root-commit) 6c8912a] my first commit
1 file changed, 2 insertions(+)
create mode 100644 readme.txt
$ git status
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working tree clean
注意:一定要使用-m參數(shù)加入注釋,認(rèn)真描述本次的提交具體做了些什么圈纺,這對于以后我們查詢歷史記錄非常重要秦忿。
如果覺得使用暫存區(qū)過于繁瑣麦射,可以在commit時直接使用-a參數(shù),Git就會自動把所有已經(jīng)跟蹤過的文件暫存起來一并提交灯谣,從而跳過git add
步驟潜秋。
$ git commit -a -m"my first commit"
撤消操作
撤消操作在這里這里不做重點描述了,只列出幾個常用命令胎许。
修改最后一次提交:
git commit --amend
取消已經(jīng)暫存的文件:
git reset HEAD readme.txt
取消對文件的修改:
git checkout -- readme.txt
那我們?nèi)绾问褂肎IT呢峻呛,下面介紹一款git使用工具來給大家簡化操作。
先簡單介紹下sourceTree的使用
1.下載安裝包
官網(wǎng)提供下載地址sourcetree官網(wǎng)地址
2.安裝
在安裝過程中需要注冊賬戶辜窑,可以注冊atlassian賬號進(jìn)行登錄钩述,或在網(wǎng)上找教程跳過登錄步驟;點擊進(jìn)入免注冊地址
3.使用
依次打開 工具-選項
首先先明白一個東西穆碎,那就是暫存的操作是將工作區(qū)的文件add到暫存區(qū)牙勘,最后commit到遠(yuǎn)程倉庫。
add類比購物車
commit類比支付
想想如果沒有add 那不是每買一件物品就要付一次款惨远?
有了購物車我可以一次買好多東西谜悟,還可以把不想買的扔掉反正還沒付款,付款時錢也一次性付完北秽。
還有就是某個功能開發(fā)葡幸,add相當(dāng)于是一次文件的快照版,如果你想回滾可以直接找到你暫存的快照版本贺氓,而不是一直commit到服務(wù)器上面蔚叨。
儲藏區(qū)的概念。將沒有commit的東西扔進(jìn)去辙培,下次可以pop出來(stash pop)蔑水。比如你還沒有修改完所有你想要修改的東西,但是此時需要做別的修改(比如pull代碼合并沖突)扬蕊,沒有commit是不會允許你merge的搀别,此時就用到stash了。
下面是一些git的基本操作指令:
mkdir: XX (創(chuàng)建一個空目錄XX指目錄名)
pwd: 顯示當(dāng)前目錄的路徑尾抑。
git init 把當(dāng)前的目錄變成可以管理的git倉庫歇父,生成隱藏.git文件。
touch xx文件或者新建文件
git add XX 把xx文件添加到暫存區(qū)去再愈。
git commit –m “XX” 提交文件 –m后面的是注釋榜苫。
git status 查看倉庫狀態(tài)
git diff XX 查看XX文件修改了那些內(nèi)容
git log 查看歷史記錄
git reset --hard HEAD^
cat XX 查看XX文件內(nèi)容
gitreflog 查看歷史記錄的版本號id
git checkout -- XX 把XX文件在工作區(qū)的修改全部撤銷。
gitrm XX 刪除XX文件
git remote add originhttps://github.com/sgl/testgit 關(guān)聯(lián)一個遠(yuǎn)程庫
git push –u(第一次要用-u 以后不需要) origin master 把當(dāng)前master分支推送到遠(yuǎn)程庫
git clonehttps://github.com/sgl/testgit 從遠(yuǎn)程庫中克隆
git checkout –b dev 創(chuàng)建dev分支 并切換到dev分支上
git branch 查看當(dāng)前所有的分支
git checkout master 切換回master分支
git merge dev 在當(dāng)前的分支上合并dev分支
git branch –d dev 刪除dev分支
git branch name 創(chuàng)建分支
git remote 查看遠(yuǎn)程庫的信息
git remote –v 查看遠(yuǎn)程庫的詳細(xì)信息
git push originmaster Git會把master分支推送到遠(yuǎn)程庫對應(yīng)的遠(yuǎn)程分支上
Git倉庫中的分支:
Release(發(fā)布) 分支
當(dāng)項目開始時翎冲,第一件事情就是創(chuàng)建發(fā)布分支垂睬。發(fā)布分支是基于 master 分支創(chuàng)建而來。
所有與本項目相關(guān)的代碼都在發(fā)布分支中,這個分支也是一個以release/開頭的普通分支驹饺。
比如這次的發(fā)布分支名為release/fb
钳枕。
可能有多個項目都基于同一份代碼運(yùn)行,因此對于每一個項目來說都需要創(chuàng)建一個獨立的發(fā)布分支逻淌。假設(shè)現(xiàn)在還有一個項目正在并行運(yùn)行么伯,那就得為這個項目創(chuàng)建一個單獨的發(fā)布分支比如release/messenger
。
需要單獨的發(fā)布分支的原因是:多個并行項目是基于同一份代碼運(yùn)行的卡儒,但是項目之間不能有沖突田柔。
Bugfix(bug修復(fù)分支)
bugfix\somehotfix,BUG修復(fù)分支骨望,所有由測試提的BUG都在這類分支上修復(fù)硬爆,可以是每一個BUG對應(yīng)一個分支,
也可以一系列BUG對應(yīng)一個分支擎鸠,根據(jù)實際情況調(diào)整缀磕,bugfix分支的來源都是release分支
Feature(功能分支) branch
對于應(yīng)用中的每一個功能都應(yīng)該創(chuàng)建一個獨立的功能分支,這會確保這些功能能被單獨構(gòu)建劣光。
功能分支也和其他分支一樣袜蚕,只是以feature/開頭。
確認(rèn)要實現(xiàn)的功能绢涡,從develop分支創(chuàng)建功能開發(fā)分支牲剃,分支名可以直接使用要實現(xiàn)功能的簡短描述,比如feature/考試題目加密功能
開發(fā)人員需要確保將發(fā)布分支的最新代碼合并到功能分支雄可,并且解決所有的沖突凿傅。
一個發(fā)布周期的流程如圖所示: