什么是Git忘苛?
Git 是 Linux 發(fā)明者 Linus 開發(fā)的一款新時代的版本控制系統(tǒng),那什么是版本控制系統(tǒng)呢缔莲?怎么理解哥纫?網(wǎng)上一大堆詳細的介紹,但是大多枯燥乏味痴奏,對于新手也很難理解蛀骇,這里我只舉幾個例子來幫助你們理解。
熟悉編程的知道读拆,我們在軟件開發(fā)中源代碼其實是最重要的擅憔,那么對源代碼的管理變得異常重要:
比如為了防止代碼的丟失,肯定本地機器與遠程服務器都要存放一份檐晕,而且還需要有一套機制讓本地可以跟遠程同步暑诸;
又比如我們經(jīng)常是好幾個人做同一個項目,都要對一份代碼做更改辟灰,這個時候需要大家互不影響个榕,又需要各自可以同步別人的代碼;
又比如我們開發(fā)的時候免不了有bug伞矩,有時候剛發(fā)布的功能就出現(xiàn)了嚴重的bug笛洛,這個時候需要緊急對代碼進行還原夏志;
又比如隨著我們版本迭代的功能越來越多乃坤,但是我們需要清楚的知道歷史每一個版本的代碼更改記錄,甚至知道每個人歷史提交代碼的情況沟蔑;
等等等類似以上的情況湿诊,這些都是版本控制系統(tǒng)能解決的問題。所以說瘦材,版本控制是一種記錄一個或若干文件內(nèi)容變化厅须,以便將來查閱特定版本修訂情況的系統(tǒng),對于軟件開發(fā)領域來說版本控制是最重要的一環(huán)食棕,而 Git 毫無疑問是當下最流行朗和、最好用的版本控制系統(tǒng)。
Git 安裝
上面說了簿晓,Git 是一個版本控制系統(tǒng)眶拉,你也可以理解成是一個工具,使用之前必須得先下載安裝憔儿,我用的是 Mac 忆植, Mac 上其實系統(tǒng)自帶 Git 的,不過這里統(tǒng)一提供一下各平臺的安裝方式,這部分就不過多介紹朝刊,相信大家這里搞的定耀里。
Mac:https://git-scm.com/download/mac
Windows:https://git-scm.com/download/win
Linux:apt-get install git
如何學習 Git ?
安裝好 Git 之后拾氓,怎么學習是個問題冯挎,其實關于 Git 有很多圖形化的軟件可以操作,但是我強烈建議大家從命令行開始學習理解咙鞍,我知道沒接觸過命令行的人可能會很抵觸织堂,但是我的親身實踐證明,只有一開始學習命令行奶陈,之后你對 Git 的每一步操作才能理解其意義易阳,而等你熟練之后你想用任何的圖形化的軟件去操作完全沒問題。
我一開始教我們團隊成員全是基于命令行的吃粒,事后證明他們現(xiàn)在已經(jīng)深深愛上命令行無法自拔潦俺,他們很理解 Git 每一步操作的具體含義,以致于在實際項目很少犯錯徐勃,所以我這里也是基于命令行去教你們學習理解事示。
Git 命令列表
怎么判斷你 Git 有沒有安裝成功?請在命令行里輸入 git
僻肖,如果出現(xiàn)以下提示證明你已經(jīng)安裝成功了肖爵。
chensuilong@chensuingdeiMac ~ git
usage: git [--version] [--help] [-C <path>] [-c name=value]
[--exec-path[=<path>]] [--html-path] [--man-path] [--info-path]
[-p | --paginate | --no-pager] [--no-replace-objects] [--bare]
[--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>]
<command> [<args>]
Git 所有的操作命令開頭都要以 git 開頭,上面列舉了最常用的一些 Git 命令臀脏,緊接著會有一句英文解釋這個命令的意義劝堪,都不是很難的單詞,不妨試著看一下揉稚,不過沒有實際操作你仍然不好理解秒啦,下面我們來以一個實際的操作來介紹下一些常用命令的含義。
Git 具體命令
第一步搀玖,我們先新建一個文件夾余境,在文件夾里新建一個文件(我是用 Linux 命令去新建的,Windows用戶可以自己手動新建)
**mkdir test ** (創(chuàng)建文件夾test)
cd test (切換到test目錄)
touch a.md (新建a.md文件)
這里提醒下:在進行任何 Git 操作之前灌诅,都要先切換到 Git 倉庫目錄芳来,也就是先要先切換到項目的文件夾目錄下。
這個時候我們先隨便操作一個命令猜拾,比如 git status 即舌,可以看到如下提示:
chensuilong@chensuingdeiMac ~/git/test git status
fatal: Not a git repository (or any of the parent directories): .git
意思就是當前目錄還不是一個 Git 倉庫。
git init
這個時候用到了第一個命令关带,代表初始化 git 倉庫侥涵,輸入 git init 之后會提示:
chensuilong@chensuingdeiMac ~/git/test git init
Initialized empty Git repository in /Users/chensuilong/git/test/.git/
可以看到初始化成了沼撕,至此 test 目錄已經(jīng)是一個 git 倉庫了。
git status
緊接著我們輸入 git status 命令芜飘,會有如下提示:
chensuilong@chensuingdeiMac ~/git/test master git status
On branch master
Initial commit
Untracked files:
(use "git add <file>..." to include in what will be committed)
a.md
nothing added to commit but untracked files present (use "git add" to track)
默認就直接在 master 分支务豺,關于分支的概念后面會提,這時最主要的是提示 a.md 文件 Untracked files 嗦明,就是說 a.md 這個文件還沒有被跟蹤笼沥,還沒有提交在 git 倉庫里呢,而且提示你可以使用 git add <file> 去操作你想要提交的文件娶牌。
git status 這個命令顧名思義就是查看狀態(tài)奔浅,這個命令可以算是使用最頻繁的一個命令了,建議大家沒事就輸入下這個命令诗良,來查看你當前 git 倉庫的一些狀態(tài)汹桦。
git add
上面提示 a.md 文件還沒有提交到 git 倉庫里,這個時候我們可以隨便編輯下 a.md 文件鉴裹,然后輸入 git add a.md 舞骆,然后再輸入 git status :
chensuilong@chensuingdeiMac ~/git/test master git add a.md
chensuilong@chensuingdeiMac ~/git/test master ? git status
On branch master
Initial commit
Changes to be committed:
(use "git rm --cached <file>..." to unstage)
new file: a.md
此時提示以下文件 Changes to be committed , 意思就是 a.md 文件等待被提交径荔,當然你可以使用 git rm --cached 這個命令去移除這個緩存督禽。
git commit
接著我們輸入 git commit -m 'first commit' ,這個命令什么意思呢总处? commit 是提交的意思狈惫,-m 代表是提交信息,執(zhí)行了以上命令代表我們已經(jīng)正式進行了第一次提交鹦马。
這個時候再輸入 **git status **胧谈,會提示 nothing to commit。
git log
這個時候我們輸入 git log 命令菠红,會看到如下:
commit 57925cb3da8854e71cf8894bb3a23784b8571f1f
Author: chensuilong <xxxx@qq.com>
Date: Sun Mar 5 21:57:42 2017 +0800
hhh
git log 命令可以查看所有產(chǎn)生的 commit 記錄第岖,所以可以看到已經(jīng)產(chǎn)生了一條 commit 記錄,而提交時候的附帶信息叫 'first commit' 试溯。
git add & git commit
看到這里估計很多人會有疑問,我想要提交直接進行 commit 不就行了么郊酒,為什么先要再 add 一次呢遇绞?首先 git add 是先把改動添加到一個「暫存區(qū)」,你可以理解成是一個緩存區(qū)域燎窘,臨時保存你的改動摹闽,而 git commit 才是最后真正的提交。這樣做的好處就是防止誤提交褐健,當然也有辦法把這兩步合并成一步付鹿,不過后面再介紹澜汤,建議新手先按部就班的一步步來。
git branch
branch 即分支的意思舵匾,分支的概念很重要俊抵,尤其是團隊協(xié)作的時候,假設兩個人都在做同一個項目坐梯,這個時候分支就是保證兩人能協(xié)同合作的最大利器了徽诲。舉個例子,A, B倆人都在做同一個項目吵血,但是不同的模塊谎替,這個時候A新建了一個分支叫a, B新建了一個分支叫b蹋辅,這樣A钱贯、B做的所有代碼改動都各自在各自的分支,互不影響侦另,等到倆人都把各自的模塊都做完了喷舀,最后再統(tǒng)一把分支合并起來。
執(zhí)行 git init 初始化git倉庫之后會默認生成一個主分支 master 淋肾,也是你所在的默認分支硫麻,也基本是實際開發(fā)正式環(huán)境下的分支,一般情況下 master 分支不會輕易直接在上面操作的樊卓,你們可以輸入 git branch 查看下當前分支情況:
chensuilong@chensuingdeiMac ~/git/test master git branch
* master
如果我們想在此基礎上新建一個分支呢拿愧,很簡單,執(zhí)行 git branch a 就新建了一個名字叫 a 的分支碌尔,這時候分支 a 跟分支 master 是一模一樣的內(nèi)容浇辜,我們再輸入 git branch 查看的當前分支情況:
chensuilong@chensuingdeiMac ~/git/test master git branch a
chensuilong@chensuingdeiMac ~/git/test master git branch
a
* master
但是可以看到 master 分支前有個** * **號,即雖然新建了一個 a 的分支唾戚,但是當前所在的分支還是在 master 上柳洋,如果我們想在 a 分支上進行開發(fā),首先要先切換到 a 分支上才行叹坦,所以下一步要切換分支
git checkout a
執(zhí)行這個命令熊镣,然后再輸入 git branch 查看下分支情況:
chensuilong@chensuingdeiMac ~/git/test master git checkout a
Switched to branch 'a'
chensuilong@chensuingdeiMac ~/git/test a git branch
* a
master
可以看到當前我們在的分支已經(jīng)是a了,這個時候 A 同學就可以盡情的在他新建的a分支去進行代碼改動了募书。
那有人就說了绪囱,我要先新建再切換,未免有點麻煩,有沒有一步到位的,聰明:
git checkout -b a
這個命令的意思就是新建一個a分支幢码,并且自動切換到a分支。
git merge
A同學在a分支代碼寫的不亦樂乎齿椅,終于他的功能完工了琉挖,并且測試也都ok了,準備要上線了涣脚,這個時候就需要把他的代碼合并到主分支master上來示辈,然后發(fā)布。git merge就是合并分支用到的命令涩澡,針對這個情況顽耳,需要先做兩步,第一步是切換到 master 分支妙同,如果你已經(jīng)在了就不用切換了射富,第二步執(zhí)行 git merge a ,意思就是把a分支的代碼合并過來粥帚,不出意外胰耗,這個時候a分支的代碼就順利合并到 master 分支來了。為什么說不出意外呢芒涡?因為這個時候可能會有沖突而合并失敗柴灯,留個包袱,這個到后面進階的時候再講费尽。
git branch -d
有新建分支赠群,那肯定有刪除分支,假如這個分支新建錯了旱幼,或者a分支的代碼已經(jīng)順利合并到 master 分支來了查描,那么a分支沒用了,需要刪除柏卤,這個時候執(zhí)行 **git branch -d a **就可以把a分支刪除了冬三。
git branch -D
有些時候可能會刪除失敗,比如如果a分支的代碼還沒有合并到master缘缚,你執(zhí)行 **git branch -d a **是刪除不了的勾笆,它會智能的提示你a分支還有未合并的代碼,但是如果你非要刪除桥滨,那就執(zhí)行 git branch -D a 就可以強制刪除a分支窝爪。
git tag
我們在客戶端開發(fā)的時候經(jīng)常有版本的概念,比如v1.0该园、v1.1之類的酸舍,不同的版本肯定對應不同的代碼,所以我一般要給我們的代碼加上標簽里初,這樣假設v1.1版本出了一個新bug,但是又不曉得v1.0是不是有這個bug忽舟,有了標簽就可以順利切換到v1.0的代碼双妨,重新打個包測試了淮阐。
所以如果想要新建一個標簽很簡單,比如 git tag v1.0 就代表我在當前代碼狀態(tài)下新建了一個v1.0的標簽刁品,輸入 git tag 可以查看歷史 tag 記錄泣特。
chensuilong@chensuingdeiMac ~/git/test a git tag v1.0
chensuilong@chensuingdeiMac ~/git/test a git tag
v1.0
chensuilong@chensuingdeiMac ~/git/test a git tag v1.1
chensuilong@chensuingdeiMac ~/git/test a git tag
v1.0
v1.1
可以看到我新建了兩個標簽 v1.0、v1.1挑随。
想要切換到某個tag怎么辦状您?也很簡單,執(zhí)行 git checkout v1.0 兜挨,這樣就順利的切換到 v1.0 tag的代碼狀態(tài)了膏孟。
OK,以上全是一些最基本的Git操作拌汇,而且全是在本地環(huán)境進行操作的柒桑,完全沒有涉及到遠程倉庫,下一章節(jié)將以遠程 GitHub 倉庫為例噪舀,講解下本地如何跟遠程倉庫一起同步協(xié)作魁淳,另外今天講的全是最基礎最簡單的Git操作,一步步來与倡,后續(xù)再繼續(xù)講解一下Git的高階以及一些Git的酷炫操作界逛。
參考資料
建議學習了本視頻后,認真閱讀纺座,前三章息拜,更加深刻地理解git。
課后快速記憶
初始化本地倉庫
git init
添加文件到暫存區(qū)
git add [文件路徑或者目錄]
將暫存區(qū)文件提交到倉庫
git commit -m "[這里填寫提交的說明]"
創(chuàng)建分支
git branch 分支名稱
切換分支
git checkout 分支名稱
創(chuàng)建分支并切換到該分支比驻,帶有 -b 參數(shù)的 git checkout 命令
git checkout -b 分支名稱
分支合并
先切換到主分支该溯,然后合并我編寫好的分支
git checkout master
git merge 我編寫好的分支
創(chuàng)建標簽
git tag 標簽名