Git簡介
Git是什么?
分布式版本控制系統(tǒng)。
Git的誕生
1991年,Linus創(chuàng)建了開源的Linux,世界各地的志愿者為Linux編寫代碼,但是絕大多數(shù)的內(nèi)核維護工作,都花費在提交補丁和保存檔案的繁瑣事務上。這期間所有的源代碼,都由Linus手工合并。Linus堅定反對CVS和SVN,因為這些集中式的版本控制系統(tǒng),不僅速度慢,而且必須聯(lián)網(wǎng)才能使用。
不過,到了2002年,Linux系統(tǒng)已經(jīng)發(fā)展十年了,代碼庫之大讓Linus很難繼續(xù)通過手工方式管理了。BitMover公司出于人道主義精神,授權Linux社區(qū)免費使用商業(yè)版本的分布式版本控制系統(tǒng)BitKeeper來管理和維護代碼。安定團結的大好局面在2005年被打破,開發(fā)BitKeeper的商業(yè)公司同Linux內(nèi)核開源社區(qū)的合作關系結束,原因是Linux社區(qū)牛人聚集,開發(fā)Samba的Andrew試圖破解BitKeeper的協(xié)議,這么干的其實也不只他一個,但是被BitMover公司發(fā)現(xiàn)了,于是BitMover公司收回了Linux社區(qū)的免費使用權。這就迫使Linux開源社區(qū)(特別是Linux的締造者Linus Torvalds)不得不吸取教訓,開發(fā)一套屬于自己的版本控制系統(tǒng)。
Git的目標
- 速度
- 簡單的設計
- 對非線性開發(fā)模式的強力支持(允許上千個并行開發(fā)的分支)
- 完全分布式
- 有能力高效管理類似Linux內(nèi)核一樣的超大規(guī)模項目(速度和數(shù)據(jù)量)
Git和GitHub
2008年,GitHub網(wǎng)站上線,它為開源項目免費提供Git存儲,無數(shù)開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。
版本控制系統(tǒng)
主要分為兩種:
- 集中式:CVS和SVN
- 分布式:Git
集中式的版本控制系統(tǒng)(SVN)
版本庫是集中存放在中央服務器的,大家工作要先從中央服務器取得最新的版本,工作完成后把自己的修訂推送到中央服務器。這類系統(tǒng),都有一個單一的集中管理的服務器,保存所有文件的修訂版本,而協(xié)同工作的人們都通過客戶端連到這臺服務器,取得最新的文件或者提交更新。
Computer A和Computer B之間無法直接通信,只能通過中央服務器間接通信。

分布式的版本控制系統(tǒng)(Git)
根本沒有“中央服務器”,每個人的電腦都是一個完整的版本庫。這樣你工作的時候,根本不需要聯(lián)網(wǎng),因為版本庫就在你自己的電腦上。
那么多人如何協(xié)作?如果你在自己電腦上修改了A文件,你的同事在他的電腦上修改了B文件。你們倆之間只需要把各自的修改推送給對方就可以啦~
分布式比集中式的安全性高很多,因為每個人電腦里都有完整的版本庫,一個人的電腦壞掉了不要緊,從其他人那里復制一個就可以了。分布式版本控制系統(tǒng),也有一臺充當“中央服務器”的電腦,但是這個服務器的作用,僅僅是用來方便“交換”大家的修改。
Computer A和Computer B之間,也是可以相互通信的。

許多這類系統(tǒng)都可以指定和若干不同的遠端代碼倉庫進行交互。籍此,你就可以在同一個項目中,分別和不同工作小組的人相互協(xié)作。你可以根據(jù)需要設定不同的協(xié)作流程,比如層次模型式的工作流,而這在以前的集中式系統(tǒng)中是無法實現(xiàn)的。
Git配置
Git初始化
全局配置
使用Git的第一件事就是設置你的名字和email,這些就是你在提交commit時的簽名,每次提交記錄里都會包含這些信息。使用git config命令進行配置:
$ git config --global user.name "Scott Chacon"
$ git config --global user.email "schacon@gmail.com"
執(zhí)行了上面的操作,會在家目錄下建立一個.gitconfig的隱藏文件,可使用cat ~/.gitconfig命令查看:
$ cat ~/.gitconfig
[user]
email = schacon@gmail.com
name = Scott Chacon
當前項目配置
如果你想使項目里的某個值與前面的全局設置有區(qū)別(例如把私人郵箱地址改為工作郵箱),你可以在項目中使用git config 命令不帶 --global 選項來設置. 這會在你當前的項目目錄下創(chuàng)建.git/config,從而使用針對當前項目的配置。
GitHub新建倉庫

Clone一個倉庫
git clone https://github.com/LjyYano/test.git
這個命令是克隆出一個完整的版本庫,而不是簡單地拷貝文件,這和SVN不一樣~版本庫又名倉庫,英文名repository,你可以簡單的理解一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻還可以將文件”還原”??梢圆榭吹侥夸浿杏?code>.git的隱藏文件夾。
Git的工作流程
使用版本控制系統(tǒng),無非就是以下幾件事:
- 從服務器拉取文件
- 修改文件
- 提交文件
- 創(chuàng)建、合并分支
git的基本流程如下:
- 創(chuàng)建或修改文件
- 使用
git add命令添加新創(chuàng)建或修改的文件到本地的緩存區(qū) - 使用
git commit命令提交到本地代碼庫 - 使用
git push命令將本地代碼庫同步到遠端代碼庫
文件有兩種狀態(tài):
- tracked
- untracked
添加到本地的緩存區(qū)
新建一個文件git.txt,使用git status命令查看倉庫狀態(tài)。我們發(fā)現(xiàn)git.txt處于未跟蹤狀態(tài):
上面的截圖上已經(jīng)提示了,使用git add添加可以commit的文件。
提交到本地倉庫
需要使用-m添加本次修改的注釋,完成后就會記錄一個新的項目版本。
git commit -m 'first'
同步到遠程倉庫
因為我們是從遠程倉庫clone的代碼,所以使用
git remote
發(fā)現(xiàn)已經(jīng)有一個origin了,直接push即可
git push
刷新GitHub頁面,發(fā)現(xiàn)已經(jīng)有了本地的修改(添加了git.txt文件)~
分支與合并
分支的作用體現(xiàn)在多人協(xié)作中,分支不影響主線(master分支)的開發(fā)。比如一個團隊開發(fā)軟件,你負責獨立的一個功能需要一個月的時間來完成,你就可以創(chuàng)建一個分支,只把該功能的代碼提交到這個分支,而其他同事仍然可以繼續(xù)使用主線開發(fā),你每天的提交不會對他們造成任何影響。當你完成功能后,測試通過再把你的功能分支合并到主線。
下面以分支名exp為例:
查看分支
git branch
創(chuàng)建分支
git branch exp
切換分支
查看到當前還在master分支,如何切換到exp分支?
git checkout exp
提交分支
exp分支和master分支中的文件是隔離的,修改exp分支下的文件,并不會影響到master分支的文件。注:push前也需要add、commit等操作~
git push origin exp
合并分支
分別修改了master分支和exp分支的git.txt文件,如下圖:
合并exp分支 → master分支
git checkout master
git merge -m 'merge from exp' exp
撤銷合并
git reset --hard HEAD^
只能刪除那些已經(jīng)被當前分支的合并的分支, 如果你要強制刪除某個分支的話就用git branch –D
刪除分支
git branch –d exp
SSH傳輸
我們會發(fā)現(xiàn)有GitHub有兩種Clone方式:SSH 和 HTTPS。
SSH簡介
SSH 為 Secure Shell的縮寫,可以有效防止遠程管理過程中的信息泄露問題。
驗證
從客戶端來看,SSH提供兩種級別的安全驗證:
- 基于
口令的安全驗證 - 基于
密鑰的安全認證
第一種級別(基于口令的安全驗證)
只要你知道自己帳號和口令,就可以登錄到遠程主機。所有傳輸?shù)臄?shù)據(jù)都會被加密,但是不能保證你正在連接的服務器就是你想連接的服務器??赡軙袆e的服務器在冒充真正的服務器,也就是受到“中間人”這種方式的攻擊。
第二種級別(基于密匙的安全驗證)
需要依靠密匙,也就是你必須為自己創(chuàng)建一對密匙,并把公用密匙放在需要訪問的服務器上。如果你要連接到SSH服務器上,客戶端軟件就會向服務器發(fā)出請求,請求用你的密匙進行安全驗證。服務器收到請求之后,先在該服務器上你的主目錄下尋找你的公用密匙,然后把它和你發(fā)送過來的公用密匙進行比較。如果兩個密匙一致,服務器就用公用密匙加密“質(zhì)詢”(challenge)并把它發(fā)送給客戶端軟件??蛻舳塑浖盏健百|(zhì)詢”之后就可以用你的私人密匙解密再把它發(fā)送給服務器。
用這種方式,你必須知道自己密匙的口令。但是,與第一種級別相比,第二種級別不需要在網(wǎng)絡上傳送口令。
第二種級別不僅加密所有傳送的數(shù)據(jù),而且“中間人”這種攻擊方式也是不可能的(因為他沒有你的私人密匙)。但是整個登錄的過程可能需要10秒。
為什么使用SSH?
傳統(tǒng)的網(wǎng)絡服務程序,有以下漏洞:
- 明文傳送口令和數(shù)據(jù)
- 易受到“中間人”攻擊
明文傳送口令和數(shù)據(jù)
傳統(tǒng)的網(wǎng)絡服務程序如:ftp、pop和telnet在本質(zhì)上都是不安全的,因為它們在網(wǎng)絡上用明文傳送口令和數(shù)據(jù),別有用心的人非常容易就可以截獲這些口令和數(shù)據(jù)。
“中間人”攻擊
容易受到“中間人”攻擊,即:
你的數(shù)據(jù) ? ?中間人 ?? 服務器
使用SSH
創(chuàng)建 SSH Key
在用戶的主目錄下,查看是否有.ssh的隱藏目錄,查看里面是否有id_rsa和id_rsa.pub這兩個文件,如果有的話,直接跳過此如下命令,如果沒有的話,打開命令行,輸入如下命令:
ssh-keygen -t rsa –C “youremail@example.com”
id_rsa是私鑰,不能泄露出去,id_rsa.pub是公鑰,可以放心地告訴任何人。
GitHub 添加 SSH Key
將本地生成的id_rsa.pub公鑰內(nèi)容,添加到GitHub上,以后就可以使用SSH來連接GitHub了~
Git 命令總結
- git config:配置相關信息
- git clone:復制倉庫
- git init:初始化倉庫
- git add:添加更新內(nèi)容到索引中
- git diff:比較內(nèi)容
- git status:獲取當前項目狀況
- git commit:提交
- git branch:分支相關
- git checkout:切換分支
- git merge:合并分支
- git reset:恢復版本
- git log:查看日志