1.關(guān)于版本控制
????????git是目前世界上最先進(jìn)的分布式版本控制系統(tǒng)钳吟,那么什么是版本控制呢躺孝?
? ? ? ? 假設(shè)現(xiàn)在祖搓,要寫一篇很長很長的word文檔,有時候想要刪除或更改某一個段落筋量,又怕恢復(fù)找不回之前版本烹吵,那么此時只能通過再新創(chuàng)建一個word文檔以便本分,然后不停的改毛甲,不停的備份年叮,改動多了就成了
????????一周過去了具被,自己看著一些亂七八糟的文件玻募,還要想之前做了哪些修改,這些不可怕一姿,可怕的是同事要幫忙填某些數(shù)據(jù)七咧,就得通過郵箱等形式發(fā)給他們跃惫,同事又得思考,改動了哪些地方艾栋,多麻煩爆存。? ? 此時我們就想要有一款軟件,能幫我們記錄每次文件的改動蝗砾,還可以同事協(xié)調(diào)合作先较,如果我們需要,就在軟件里瞄一眼悼粮,就能看到所有改動闲勺。就像下面這樣,于是乎就有了版本控制扣猫,省事菜循。
????????版本控制是一種記錄一個或多個文件的變化,版本控制系統(tǒng)(縮寫VCS)申尤,可以理解為一個“數(shù)據(jù)庫”癌幕,
它可以用來保存一個完整項目的版本,當(dāng)需要查看一個之前的版本時昧穿,版本控制系統(tǒng)可以顯示出當(dāng)前版本和上一版本的所有改動細(xì)節(jié)勺远。
關(guān)于集中式版本控制和分布式版本控制系統(tǒng)
? ? ? ? 在最初的CVS和SVN中,都是集中式版本控制系統(tǒng)时鸵,集中式版本控制系統(tǒng)谚中,有一個中央服務(wù)器,所有的版本庫都是集中存放在中央服務(wù)器中的寥枝,每個人在自己的電腦上干活宪塔,再添加提交到中央服務(wù)器上,這個中央服務(wù)器就像是一個一個圖書館囊拜,每個人借書某筐,再還書,如果今天圖書館關(guān)門了冠跷,那么所有人都沒法再借書南誊,意味著都沒法再工作,而且集中式版本控制系統(tǒng)最大的毛病是必須聯(lián)網(wǎng)才能工作蜜托,如果在局域網(wǎng)內(nèi)還好抄囚,如果是在互聯(lián)網(wǎng),遇到網(wǎng)速超慢的話橄务,可能提交一個很小的文件就得等很久幔托,這不嚴(yán)重影響工作效率啊,人都得急死。那么就有了git這種最先進(jìn)的分布式版本管理系統(tǒng)重挑,相比于集中式管理系統(tǒng)嗓化,分布式管理系統(tǒng)的容錯率更高,因為每個人的電腦里都有完整的版本庫谬哀,這樣也不用擔(dān)心什么某個人電腦壞了其他人干不了活之類的刺覆,但實際在使用分布式管理系統(tǒng)的時候,其實很少在兩個人之間的電腦上互推史煎,通常也有一臺類似于中央服務(wù)器的電腦谦屑,但這臺服務(wù)器的作用僅僅是方便大家的“交換”和修改,沒有他大家也一樣可以干活篇梭。
2.? ? 安裝git
Windows上安裝git直接從官網(wǎng)上下載就行?安裝git?伦仍,然后默認(rèn)安裝選項即可,因為git是分布式版本控制系統(tǒng)很洋,所以每個機器安裝完成之后都需要自報家門充蓝,就得在命令行輸入
$ git config --global user.name"Your Name"
$ git config --global user.email"email@example.com"
安裝完成后,然后是創(chuàng)建版本庫喉磁,類似于倉庫谓苟,簡單理解為一個目錄,這個目錄的所有文件都被git所管理起來协怒,每個文件的修改涝焙,刪除,git都能跟蹤孕暇。
創(chuàng)建版本庫? mkdir? name
如果是Windows用戶仑撞,還需要在命令行輸入 git init 讓這個版本庫變成git可以管理的倉庫。
添加文件到git倉庫
git add? <file>? 可以反復(fù)多次使用妖滔,添加多個文件隧哮,最后commit一次提交? git add . 表示提交所有文件
git commit -m <message> 完成提交
git log ????查看版本歷史,顯示最近提交提交歷史記錄座舍。
3.????關(guān)于版本回退
在git中沮翔,每一個版本就像是一個RPG游戲存檔,每通過一個新的關(guān)卡都會有一個存檔曲秉,又或者在打boss的時候采蚀,也需要先存?zhèn)€檔,以便沒打過死亡要從頭再來承二,在git當(dāng)中榆鼠,HEAD表示當(dāng)前版本,也就是最后提交的版本亥鸠,而HEAD^表示上一個版本妆够,HEAD^^表示上上一個版本,HEAD~n表示上n個版本。
git reset --hard HEAD^
但是在git中责静, head是一個指針昆咽,它指向當(dāng)前版本菩佑,當(dāng)我們從當(dāng)前版本回到上一個版本時,此時head又指向上一個版本宽涌,那么我們想回到最新的版本揩徊,又改怎么辦呢腰鬼?放心,在git中塑荒,有一種藥叫后悔藥熄赡,想吃隨時可以吃,我們只需要找到最新版本的commit id 就行了 通過git reflog命令齿税,可以查看記錄每次命令彼硫,于是乎我們找到最新版本的id又可以通過git reset --hard id 回到最新版本。
4.? ? git的暫存區(qū)
git有一個很重要的概念凌箕,就是暫存區(qū)拧篮,那么什么是暫存區(qū)呢?
我們先開工作區(qū)(Working directory)牵舱,所謂的工作區(qū)串绩,就是電腦里能看到的目錄,而在工作區(qū)下面還有個隱藏目錄芜壁,.git礁凡,在這個目錄下,有個stage(index)的暫存區(qū)慧妄,還有g(shù)it為我們自動創(chuàng)建的第一個分支master顷牌,以及指向master的指針Head,在我們修改完文件想要往版本庫里添加時塞淹,執(zhí)行g(shù)it add 操作韧掩,此時就是把修改完成的文件放在git的暫存區(qū)index里,最后通過commit一次性把所有暫存區(qū)的內(nèi)容提交到當(dāng)前分支中窖铡。git每一次修改疗锐,如果不用add添加到暫存區(qū)中,那就不會加入到commit中费彼。
5.? ? 關(guān)于git的標(biāo)簽
? ? ? ? 在git中滑臊,發(fā)布一個版本的時候,通常會給一個版本打上一個標(biāo)簽(tag)箍铲,這樣就確定了所修改的版本雇卷,雖然git有commit,對應(yīng)每一個commit_id號,可以找到某個版本关划,但實際上是一串亂七八糟的數(shù)字和字符小染,如果是v1.1
?v1.2這樣就很有意義了,tag就是一個更容易讓人記住的名字贮折,跟摸個commit綁定在一起裤翩。
? ? ? ? 創(chuàng)建標(biāo)簽? 首先切換到需要打標(biāo)簽的分支上? 然后git tag? <name>就可以新創(chuàng)建一個標(biāo)簽。
? ? ? ? 查看標(biāo)簽? ? git? tag? ?查看所有標(biāo)簽
? ? ? ? 標(biāo)簽不是按時間順序排列的调榄,而是按字母順序排列的踊赠,可以用git? show? <tagname>查看標(biāo)簽信息
? ? ? ? git? ? tag? ? -a? <tagname>? ?-m? ?"xxxx"? ? 可以指定標(biāo)簽信息備注
? ? ? ? 如果標(biāo)簽打錯了,也可以刪除? 每庆。? ? git? ?tag? ? -d? ? v1.0? ? 刪除v1.0標(biāo)簽
? ? ? ? 因為標(biāo)簽都只儲存到本地筐带,不會推送到遠(yuǎn)程,所以缤灵,打錯的標(biāo)簽可以在本地安全刪除伦籍。
? ? ? ? 如果要把某個標(biāo)簽推送到遠(yuǎn)程,可以用 git push? origin? ?<tagname> 例如:git push origin? v1.0
? ? ? ? 或者腮出,一次推送全部未推送到遠(yuǎn)程的本地標(biāo)簽鸽斟。git? push? origin? --tags
? ? ? ? 如果標(biāo)簽已經(jīng)推送到遠(yuǎn)程倉庫,要刪除利诺,就得先從本地刪除富蓄,git? tag? -d? v1.0,然后再從遠(yuǎn)程刪除慢逾,
刪除命令也是push立倍,git push? origin? :refs/tags/v1.0。
6.? ? 關(guān)于分支
? ? ? ? 在git中侣滩,git把每一次提交的都串成一條時間線口注,這條時間線就是一個分支,也就是主分支master分支君珠,隨著不斷的提交寝志,這條時間線會越來越長。
? ? ? ? 嚴(yán)格來說策添,head不是指向提交材部,而是指向master指向的最新提交,每一次提交唯竹,master分支都會向前移動一步乐导,不斷提交,master分支也會越來越長浸颓。
當(dāng)我們新創(chuàng)建一個分支物臂,如dev分支旺拉,git會新建了一個dev指針,指向和master相同的提交棵磷,再把head指向dev蛾狗,就表示當(dāng)前分支在dev上,每次修改和提交就是針對dev分支了仪媒,這樣dev指針不斷的移動沉桌,head指向當(dāng)前提交的dev指針,而master指針不變规丽。工作區(qū)的內(nèi)容文件都沒有任何變化蒲牧。
假如我們在dev分支上完成工作了撇贺,就可以把dev 合并到master上赌莺,合并就是把master指向dev當(dāng)前的提交,合并完成后就可以刪除當(dāng)前的dev分支了松嘶,刪除dev分支就是把dev指針給刪除掉艘狭,刪除后,就只剩一條master主分支了翠订。
7.? ? git的常用命令
? ? ? ? git clone? ?clone 一個遠(yuǎn)程庫
? ? ? ? git? ?init? ? 創(chuàng)建一個新的本地庫
? ? ? ? git? ?remote add origin xxx? 將本地倉庫和遠(yuǎn)程倉庫關(guān)聯(lián)
? ? ? ? git? ?add .? /? git add <file>添加到暫存區(qū)
? ? ? ? git? commit -m <message>? 提交到當(dāng)前分支
? ? ? ? ?git? status? ? ?查看工作目錄和暫存區(qū)的狀態(tài)
? ? ? ? git diff? ? ? 查看文件的更改
? ? ? ? git? ? branch 查看當(dāng)前分支
? ? ? ? git? ? branch? ? <name>? ? 創(chuàng)建分支
? ? ? ? git? ? checkout? ? <name>? ? 切換分支
? ? ? ? git checkout? ? -b? ? <name>? ? 創(chuàng)建并切換到當(dāng)前分支
? ? ? ? git? ? merge? ? <name>? ? 合并某分支到當(dāng)前分支
? ? ? ? git? ? branch? ? -d? ? <name>? ? 刪除本地分支
? ? ? ? git? ? branch? ? -a? ? 查看遠(yuǎn)程分支列表? 巢音,? ? 綠色代表當(dāng)前分支列表,紅色是遠(yuǎn)程分支列表
? ? ? ? git? ? branch? ? -m? ? <oldname> <newname> 重命名本地分支名
? ? ? ? git? ? log? ? 查看提交日志
? ? ? ? git? ? reflog? ? 查看命令歷史
? ? ? ? git? ? reset? ? --hard? ? commit_id? ? ?通過git? log 查看到每個版本的commit_id? 尽超,然后切換回退版本
? ? ? ? git? ? remote? ? -v? ? 查看遠(yuǎn)程庫信息
? ? ? ? git? ? reset? ? 清屏
? ? ? ? git? ? tag? ? <name> 創(chuàng)建新標(biāo)簽
? ? ? ? git? ? tag? ? 查看所有標(biāo)簽狀態(tài)
? ??????git? ?tag? ? -d? ? v1.0? ? 刪除v1.0標(biāo)簽
? ??????git push? origin? ?<tagname>? ? 推送某個標(biāo)簽到遠(yuǎn)程
? ??????git? push? origin? --tags? ? 推送全部未推送的標(biāo)簽到遠(yuǎn)程
? ??????git? tag? -d? v1.0? ?git push? origin? :refs/tags/v1.0 刪除已推送到遠(yuǎn)程倉庫的v1.0標(biāo)簽
? ? ? ? git放棄本地更改 強制拉取遠(yuǎn)程更新
? ??????git fetch –all?
????????git reset –hard origin/master
????????將本地分支提交到遠(yuǎn)程分支
????????$ git checkout -b feature-branch?
?????????//創(chuàng)建并切換到分支feature-branch?
?????????$ git push origin feature-branch:feature-branch