Git 用于管理代碼提交,是開發(fā)必不可少的環(huán)節(jié)截珍,可以有效保證功能正向迭代锚扎,解決多人開發(fā)配合問題吞瞪。
看不懂?
沒關(guān)系驾孔,往下看 ↓↓↓
小白劇場(chǎng):
老大讓小王和小李共同完成一套軟件開發(fā)芍秆,小王做功能 1惯疙,小李做功能 2。
- 在一個(gè)項(xiàng)目中小李不能等小王做完了妖啥,把項(xiàng)目文件給小李再做吧霉颠。可是一起做的話荆虱,怎么把兩個(gè)人的代碼放到一起呢掉分?
- 小王開發(fā)過程中已經(jīng)先寫了些基本方法,小李開發(fā)的時(shí)候想用克伊,怎么辦呢,再寫一個(gè)华坦?
- 兩個(gè)人都改了同一個(gè)文件愿吹,誰改了哪里呢,為什么改呢惜姐,那部分是最新的呢犁跪?
- 小組新來個(gè)成員小張,一同參與開發(fā)歹袁,把整個(gè)工程復(fù)制給他坷衍?
- 老大想讓小張做功能 3,功能 3 開發(fā)完了条舔,老大說枫耳,這個(gè)功能不要了,小張:…… (我好難懊峡埂)
Git 就用來解決類似這些問題的迁杨!
Git 概念
什么是 Git?
- Git 是一個(gè)分布式版本控制系統(tǒng)
什么是版本控制系統(tǒng)凄硼?
版本控制系統(tǒng)是一種記錄一個(gè)或若干文件內(nèi)容變化铅协,以便將來查閱特定版本修訂情況的系統(tǒng)。版本控制系統(tǒng)不僅可以應(yīng)用于軟件源代碼的文本文件摊沉,而且可以對(duì)任何類型的文件進(jìn)行版本控制狐史。
簡(jiǎn)短來說,就是幫助我們管理文件的说墨,文件的創(chuàng)建骏全、更新和刪除都可以被記錄,代替?zhèn)浞萃竦叮賯浞?/p>
集中式 & 分布式
-
為了讓不同系統(tǒng)上的開發(fā)者能夠協(xié)同工作吟温,集中化的版本控制系統(tǒng)應(yīng)運(yùn)而生(CVCS)。這類系統(tǒng)都有一個(gè)單一的集中管理的服務(wù)器突颊,保存所有文件的修訂版本鲁豪。而協(xié)同工作的人們都通過客戶端連接到這臺(tái)服務(wù)器潘悼,獲取最新的文件或者提交更新。集中化的版本控制系統(tǒng)爬橡,最顯而易見的缺點(diǎn)是中央服務(wù)器的單點(diǎn)故障問題治唤。如果宕機(jī),那么就會(huì)出現(xiàn)誰都無法提交更新的情況糙申,那么也就無法協(xié)同工作宾添;如果磁盤發(fā)生故障,而備份又不夠即時(shí)柜裸,那么就有丟失數(shù)據(jù)的風(fēng)險(xiǎn)缕陕,最壞的情況是丟失整個(gè)項(xiàng)目的歷史更改記錄。典型的例子就是SVN疙挺。因此扛邑,分布式版本控制系統(tǒng)問世了。
image -
在分布式版本控制系統(tǒng)(DVCS)中铐然,客戶端不僅僅是只提取最新版本的文件快照蔬崩,而是把代碼倉(cāng)庫(kù)完整的鏡像下來。所以每一次提取的操作搀暑,都是對(duì)代碼倉(cāng)庫(kù)的完整備份沥阳,因此也就不必?fù)?dān)心協(xié)同工作用的服務(wù)器發(fā)生故障。經(jīng)典的列子就是Git自点。
image
Git的安裝
可以從 Git 官網(wǎng)直接下載安裝程序
關(guān)于安裝 Git桐罕,可以看這個(gè)鏈接 https://git-scm.com/book/zh/v2/%E8%B5%B7%E6%AD%A5-%E5%AE%89%E8%A3%85-Git
安裝完成后,打開git bash 輸入 git --verison
有版本信息即安裝成功
Git的基本使用
個(gè)人信息設(shè)置
這是因?yàn)?Git 是分布式版本控制系統(tǒng)樟氢,所以冈绊,每個(gè)機(jī)器都必須自報(bào)家門:你的名字和 Email 地址(用來分辨編輯者)
在開始菜單中找到 git-->git bash
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git config 命令中的 --global 參數(shù), 表示你這臺(tái)機(jī)器上所有的 Git 倉(cāng)庫(kù)都會(huì)使用這個(gè)配置
配置好之后可以使用 git config -l
查看配置
創(chuàng)建倉(cāng)庫(kù)(repository)
倉(cāng)庫(kù)(repository)埠啃,可以理解成把想要管理的內(nèi)容(或文件等)放在一個(gè)指定的目錄下死宣,那么這個(gè)目錄里的內(nèi)容就是要被管理的內(nèi)容。就好比一個(gè)實(shí)體的倉(cāng)庫(kù)碴开,需要記錄著貨物入庫(kù)毅该、出庫(kù)信息及記錄,這些記錄將會(huì)由 Git 工具來生成潦牛。
那么先創(chuàng)建一個(gè)倉(cāng)庫(kù)
在目標(biāo)目錄中眶掌,打開 git 執(zhí)行 git init
以創(chuàng)建空的 Git 倉(cāng)庫(kù)(repositories)
創(chuàng)建版本庫(kù)會(huì)自動(dòng)生成一個(gè)
.git
目錄,該目錄就是 Git 用來管理版本庫(kù)的巴碗,這個(gè)目錄默認(rèn)是隱藏的朴爬。
查看狀態(tài)
小白劇場(chǎng):使用 Git 管理,文件狀態(tài)變更會(huì)比較謹(jǐn)慎橡淆,還以實(shí)體倉(cāng)庫(kù)為例召噩,有一批新增貨物想入庫(kù)母赵,從打算入庫(kù)到最后入庫(kù)并生成記錄是要經(jīng)歷幾個(gè)過程的。
- 首先是所有可能入庫(kù)的部分具滴,比如凹嘲,T恤、襯衫构韵、牛仔褲
- 然后我決定先不要襯衫周蹭,先把T恤和牛仔褲入庫(kù),放在待入庫(kù)清單中
- 最后疲恢,把清單的內(nèi)容放進(jìn)倉(cāng)庫(kù)管理凶朗,并且說明一下,這次我添加了T恤 xx 件显拳,牛仔褲 xx 條等等
想知道修改的文件處于哪個(gè)狀態(tài)俱尼,就使用 status 查看
先新建一個(gè)名為 test 的文本,使用 git status
查看當(dāng)前文件狀態(tài)
Untracked files 表示當(dāng)前文件沒有添加到 Git 中(沒有被 Git 管理)萎攒,下一步使用
git add
添加下文件
添加與提交
上面用實(shí)體倉(cāng)庫(kù)的例子說明了服裝入庫(kù)的過程,這也是Git 管理的工作流
Git 管理的工作流
在 Git 內(nèi)部文件有三種狀態(tài):已修改矛绘,已暫存和已提交耍休。
- 已修改:表示修改了某個(gè)文件,但還沒有提交保存货矮;
- 已暫存:表示把已修改的文件放在下次提交時(shí)要保存的清單中了羊精;
- 已提交:表示該文件已經(jīng)被安全的保存在本地倉(cāng)庫(kù)中了。
Git 在管理項(xiàng)目時(shí)囚玫,文件流轉(zhuǎn)的三個(gè)工作區(qū)域是:
- 本地倉(cāng)庫(kù)(即工作目錄 working dir喧锦,也就是項(xiàng)目的源文件)
- 暫存區(qū)(index), 臨時(shí)保存改動(dòng)
- Git 的工作目錄(Head抓督,指向最近一次一提交的結(jié)果)
因此燃少,基本的 Git 工作流程如下:
- 在本地的工作目錄修改某些文件;
- 然后對(duì)修改后的文件進(jìn)行快照铃在,保存到暫存區(qū)域阵具;
- 最后提交更新,將保存在暫存區(qū)域中的文件快照永久轉(zhuǎn)存到 Git 的工作目錄中定铜。
添加
小白劇場(chǎng):小王在目錄里添加了個(gè) test 文件阳液,此時(shí)這個(gè)文件在處于已修改狀態(tài),改動(dòng)的文件就在工作區(qū)揣炕。如果要記錄這次改動(dòng)帘皿,需要把文件添加到暫存區(qū)(可以理解成待保存清單)
一般來說 windows 系統(tǒng)下,會(huì)用紅色表示工作區(qū)文件畸陡,綠色表示暫存區(qū)文件
上面的過程鹰溜,從 工作區(qū)-->暫存區(qū) 使用 add 命令
add 這個(gè)命令有主要有兩種用法
-
git add <file>
表示把某個(gè)文件添加到待提交清單中(即暫存區(qū))虽填,如:git add test.txt
-
git add .
用"." 表示當(dāng)前所有文件都添加到暫存區(qū)
添加之后,我們可以再查看下狀態(tài)
提交
小白劇場(chǎng):小王要保存 添加 test 這個(gè)文件的記錄奉狈, 已經(jīng)通過 add 把文件提交到暫存區(qū)了卤唉,現(xiàn)在想為這次保存生成一次記錄,以便后面可以查看等操作仁期。提交就是生成一次記錄桑驱。
上面的過程,從 暫存區(qū)--> git倉(cāng)庫(kù) 使用 commit 命令
使用git commit -m "代碼提交信息"
提交修改 -m后面輸入的是本次提交的說明跛蛋,可以輸入任意內(nèi)容熬的,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄
commit 后赊级,改動(dòng)已經(jīng)在本地倉(cāng)庫(kù)的Head中了(Head指的是當(dāng)前的分支指向押框,后面介紹分支的時(shí)候會(huì)說明)
我們開始修改 test 文件,并保存
可以通過git diff
查看差異
按照前面的步驟理逊,做二次提交
查看日志
使用git log
來查看提交的日志
遠(yuǎn)程倉(cāng)庫(kù)操作
以上都是在本地倉(cāng)庫(kù)的操作橡伞,如果是多人協(xié)作時(shí),就需要遠(yuǎn)程倉(cāng)庫(kù)來完成了晋被。
小白劇場(chǎng):小王先建立了 test 文件兑徘,小李也要在 test 文件改內(nèi)容,所以小王得把這個(gè)文件放在遠(yuǎn)程倉(cāng)庫(kù)里羡洛,等小李用的時(shí)候挂脑,從遠(yuǎn)程倉(cāng)庫(kù)里獲取就行了。
遠(yuǎn)程倉(cāng)庫(kù)和本地倉(cāng)庫(kù)的概念一樣欲侮,只不過內(nèi)容放在服務(wù)器上存儲(chǔ)
Q:本地倉(cāng)庫(kù)如何關(guān)聯(lián)到遠(yuǎn)程倉(cāng)庫(kù)中
git remote add origin xxx
xxx 為遠(yuǎn)端 Git 倉(cāng)庫(kù)的地址
此處我在 GitHub上建立了一個(gè)項(xiàng)目(用作遠(yuǎn)程倉(cāng)庫(kù))
Git 是版本控制系統(tǒng)崭闲,GitHub 是在線的基于 Git 的代碼托管服務(wù),可創(chuàng)建公開的(public)代碼倉(cāng)庫(kù)威蕉,很多優(yōu)秀的開源項(xiàng)目都在 GitHub 上
如果你也想用 GitHub 來做版本管理刁俭,注冊(cè)賬號(hào)建立個(gè)倉(cāng)庫(kù),后續(xù)的操作 GitHub都有良好的引導(dǎo)
回到主題
這行下面兩句就可以將本地關(guān)聯(lián)到遠(yuǎn)程了(地址使用的是新建的 GitHub 倉(cāng)庫(kù)地址)
git remote add origin https://github.com/tingtingtina/gitStudy.git
git push -u origin master
遠(yuǎn)程提交
小白劇場(chǎng):小王已經(jīng)建立好遠(yuǎn)程倉(cāng)庫(kù)了韧涨,并和本地內(nèi)容做了關(guān)聯(lián)薄翅,但是此時(shí)遠(yuǎn)端還沒有內(nèi)容,如果這部分已經(jīng)核實(shí)要共享給他人協(xié)作了氓奈,就需要把本地的內(nèi)容推送到遠(yuǎn)端倉(cāng)庫(kù)中
關(guān)聯(lián)之后可以翘魄,我們改一下 test 內(nèi)容,建立第三次提交
完成第三次commit后舀奶,看到有個(gè)push 的提示暑竟,當(dāng)前改動(dòng)已經(jīng)在本地倉(cāng)庫(kù)中了,如果要把提交提到遠(yuǎn)端倉(cāng)庫(kù)則需執(zhí)行git push
即可(第一次需要輸入GitHub賬號(hào)和密碼)
Q:我們?nèi)绾芜h(yuǎn)端倉(cāng)庫(kù)的內(nèi)容復(fù)制到本地呢族檬?
小王已經(jīng)把最新的 test 放在 遠(yuǎn)程倉(cāng)庫(kù)中了(也可以直接理解成服務(wù)器)糊闽,小李怎么用呢?首先小李需要也需要打通這個(gè)渠道诅蝶,在報(bào)了家門腹躁,配置好 git 之后桑包,需要先把這個(gè)項(xiàng)目“克隆”一下
在目標(biāo)文件夾下打開git bash git clone xxx
xxx 為遠(yuǎn)端倉(cāng)庫(kù)地址,當(dāng)進(jìn)度完成100% 項(xiàng)目就 clone 完成了纺非,會(huì)在目標(biāo)目錄中看到項(xiàng)目目錄
我們進(jìn)入到項(xiàng)目目錄中哑了,查看log,和遠(yuǎn)端的一致
遠(yuǎn)端拉取
小李 clone 項(xiàng)目之后烧颖,會(huì)有和小王 一樣的內(nèi)容弱左,此時(shí)小王又更新了文件,并且push了到遠(yuǎn)端了炕淮,小李怎么同步呢拆火?
前面介紹了如何提交,現(xiàn)在介紹下如何拉韧吭病(同步)內(nèi)容
我們先通過 GitHub提交一次(模擬多人協(xié)作時(shí)们镜,其他人提交了內(nèi)容)
修改下內(nèi)容
寫下日志 commit change
(PS: 發(fā)現(xiàn)有些瀏覽器對(duì) GitHub 支持不太一樣,如果在 GitHub 直接提交的話润歉,建議使用 Google 瀏覽器)
此時(shí)改項(xiàng)目有4次提交
使用
git pull
來拉取內(nèi)容完成后憎账,再看看文件,確實(shí)更新了
使用 git push 和 git pull 進(jìn)行推送和拉取更新都是在當(dāng)前分支上操作的卡辰,目標(biāo)也是遠(yuǎn)端對(duì)應(yīng)的分支,默認(rèn)Head 是 master 分支邪意,也就是
push 是把 本地master分支 推送到 遠(yuǎn)程master 分支
pull 是從 遠(yuǎn)程master分支 拉取到 本地master 分支
對(duì)于分支的操作九妈,我們下期再了解。
回顧總結(jié)
再來回顧下常見的 git 命令
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
git config -l
注:clone 和 init 都是倉(cāng)庫(kù)初始化的方式, 不同的是 init 是先建立本地倉(cāng)庫(kù)雾鬼,如果有需要可以公開萌朱,比如發(fā)到GitHub上托管,多人協(xié)作等策菜。而 clone 是已經(jīng)有遠(yuǎn)程倉(cāng)庫(kù)了晶疼,克隆復(fù)制一份到本地
git clone xxx
從遠(yuǎn)端git倉(cāng)庫(kù)克隆一份到本地
git init
創(chuàng)建本地倉(cāng)庫(kù)
git add <file>
添加文件到緩存區(qū)(可以理解成提交想要提交的文件)
git add .
將工作區(qū)所有改動(dòng)文件都提交到緩存區(qū)
git commit -m xxx
將緩存區(qū)的內(nèi)容提交到本地倉(cāng)庫(kù),xxx為提交日志
git push
本地倉(cāng)庫(kù)內(nèi)容提交到遠(yuǎn)端
git pull
從遠(yuǎn)端獲取更新到本地
git stash
查看當(dāng)前文件狀態(tài)(哪些在緩存區(qū)又憨,哪些在工作區(qū))
git log
查看日志信息
git remote add origin xxx // 本地倉(cāng)庫(kù)添加到遠(yuǎn)端
git push -u origin master
git diff
查看差別(了解即可)翠霍,可以使用git diff commitid
查看與某次提交的改動(dòng)(commitid, 提交的哈希值蠢莺,通過git log 可知)寒匙,如下面(一般輸入前幾位就夠了)
本篇內(nèi)容就到這里了,后面會(huì)繼續(xù)了解 Git 的使用
系列文章傳送門
Git 入門系列(一)- Git 概念/安裝/基本操作/遠(yuǎn)程推送更新
Git 入門系列(二)- 修改管理 / 撤銷操作 / 命令及區(qū)間關(guān)系
Git 入門系列(三)- 分支(上)創(chuàng)建與切換 / 合并 / 查看 / 刪除
Git 入門系列(四)- 分支(下)合并解決沖突 / 遠(yuǎn)程分支
Git 入門系列(五)- stash 貯藏
Git 入門系列(六)- 標(biāo)簽 tag
Git 入門系列(七)- 可視化 Git 管理工具
Git 入門系列(八) - FAQ
歡迎關(guān)注個(gè)人公眾號(hào)躏将,【程序媛春哥的手記】