最近在家太閑了昙衅,翻到以前學(xué)Git整理的筆記圆米,簡單的整理了一下本砰,分享給大家敦腔。
一、Git簡介和幾個概念
git是 Linus 使用使用C語言開發(fā)的迎瞧,最初管理端是 Linux 的源碼哮缺。
集中式與分布式
-
集中式
代表:SVN苟穆、CVS(沒有SVN穩(wěn)定)验辞、VSS(據(jù)說反人類稿黄,微軟自己都不用)
? 集中式版本控制系統(tǒng),其版本庫是放在中央服務(wù)器上的跌造。這樣杆怕,每次使用前都需要從中央服務(wù)器中獲取最新版本;結(jié)束工作后再把當(dāng)天做完的工作推送給中央服務(wù)器壳贪。
特點(缺點)
- 集中式版本控制系統(tǒng)最大的缺陷在于陵珍,必須聯(lián)網(wǎng)才可以進行工作。這就涉及到工作環(huán)境的網(wǎng)絡(luò)和帶寬撑碴,如果是局域網(wǎng)還好;如果是互聯(lián)網(wǎng)朝墩,其效率將會非常低下醉拓。
- 集中式的中央服務(wù)器如果出了問題伟姐,則所有人都沒法干活了。
-
分布式
代表:Git亿卤、 BitKeeper(收費)
? 分布式版本控制系統(tǒng)愤兵,沒有所謂的“中央服務(wù)器”,其版本是放在每一個工作者的電腦中的排吴,每個人的電腦都是一個完整的版本庫秆乳。
特點
- 不受網(wǎng)絡(luò)的限制,工作時不需要聯(lián)網(wǎng)钻哩。如果需要多人協(xié)作屹堰,則只需要將各自修改的內(nèi)容推送給對方即可。
- 沒有所謂的“中央服務(wù)器”是指沒有集中式那樣街氢,需要完全依賴此的服務(wù)器扯键。分布式版本控制系統(tǒng)會有一個僅僅是充當(dāng)“中介者”角色的服務(wù)器,方便多人協(xié)作時珊肃,傳遞大家修改的信息荣刑。(即使沒有這樣的“中介者”,大家一樣可以做自己的工作伦乔,只是不方便相互修改而已厉亏。)
工作區(qū)、暫存區(qū)烈和、版本庫
工作區(qū): 就是在電腦里能看到的目錄
暫存區(qū): 稱為stage(或者叫index)爱只,可以理解為工作區(qū)與版本分支中間的一個緩沖區(qū)。后面馬上提到
git add
就是把修改的內(nèi)容斥杜,先添加到暫存區(qū)虱颗。等我們把所有要提交到倉庫的內(nèi)容都添加到暫存區(qū)后,就可以用git commit
來提交到指定分支啦蔗喂。(當(dāng)然忘渔,你也可以每 add 一次,就 commit 一次)版本庫:指的就是工作區(qū)中的
.git
文件夾缰儿,這個不算工作區(qū)畦粮,而是Git的版本庫。
二乖阵、Git的基礎(chǔ)使用
1. 安裝后的基本配置
git在安裝完成后宣赔,需要進行一些基礎(chǔ)的配置。
# 注意:這里使用了--global參數(shù)瞪浸,這樣設(shè)置會讓所在機器上的所有的Git倉庫都是用這個配置(常規(guī)操作儒将,安心設(shè)置就好)
# 設(shè)置名字
$ git config --global user.name "Your Name"
# 設(shè)置郵箱
$ git config --global user.email "email@example.com"
2. 創(chuàng)建第一個版本庫(本地)
版本庫也就是常說的倉庫,可以簡單理解成一個目錄对蒲。這個目錄里面的所有文件都可以被Git管理起來钩蚊,每個文件的修改贡翘、刪除,Git都能跟蹤砰逻,以便任何時刻都可以追蹤歷史鸣驱,或者在將來某個時刻可以“還原”。
找一個合適的地方蝠咆,建一個空文件夾(也不一定是空的踊东,項目寫完了再建倉庫也行)(為了避免任何因為路徑的錯誤,請確保文件夾路徑中沒有英文8詹佟)闸翅。然后在這個文件夾 單擊右鍵 → Git Bush Here
,輸入:
$ git init
完事兒赡茸,以后倉庫就建好了缎脾!
<u>劃重點:</u> 如果你看到文件夾里有一個隱藏的、名叫.git
的文件夾占卧。注意遗菠!千萬不要刪他或者修改它,因為它是用來跟蹤管理版本庫的华蜒,認(rèn)為的修改可能會對倉庫造成一些不必要的破壞辙纬。(如果沒看到也沒事兒,它本身就是隱藏的叭喜,說明你沒有打開顯示隱藏的文件夾(也不太需要打開了...))
3. 提交
-
把文件添加到暫存區(qū)
# 提交一個文件 $ git add index.html # 提交兩個文件 $ git add index-2.html index-3.html # 這一步贺拣,沒有提示!
當(dāng)然捂蕴,也可以一次添加所有的文件
# 提交所有變化(刪除譬涡、修改、新增) $ git add -A # 提交被修改(modified)和被刪除(deleted)文件啥辨,不包括新文件(new) $ git add -u # 提交新文件(new)和被修改(modified)文件涡匀,不包括被刪除(deleted)文件 $ git add .
-
把剛才添加的文件提交到倉庫
$ git commit -m "massage content" # -m 指的是massage,和之后見到的master無關(guān) # massage content 對本次提交內(nèi)容的說明
要注意的是:Git之所以比其他的版本控制系統(tǒng)優(yōu)秀溉知,是因為Git跟蹤和管理的并不是文件陨瘩,而是你的每一行修改。因此级乍,在我們對項目修改后舌劳,都要進行
git add
將修改添加到暫存區(qū)。如果沒有git add
玫荣,直接進行git commit
是無法將代碼提交的本地倉庫的甚淡。
4. 關(guān)注工作區(qū)狀態(tài)
4.1 使用 git status
隨時可以得知工作區(qū)的狀態(tài)
$ git status
-
在工作區(qū)沒有文件被修改的時候
-
在工作區(qū)有文件被修改的時候
- 我們直接輸入命令
git status
,輸出的命令告知我們index.html
文件有被修改但是沒有準(zhǔn)備提交捅厂,同時建議我們使用git add
和git commit
添加提交贯卦。
- 我們直接輸入命令
- 這時我們可以用
git diff
查看哪里被修改了底挫。減號開頭的代表修改前的,加號開頭代表修改后的脸侥。這里我們課看到,我加了一個感嘆號(其實感嘆號前還有個空格...)
- 這時候就可以使用
git add
和git commit
進行提交了盈厘,提交完成后睁枕,再用git status
就會發(fā)現(xiàn):nothing to commit, working directory clean
。到此為止就完成了一次的修改及提交沸手!
4.2 我忘了剛才修改的文件 git commit
提交版本庫了沒
這時候外遇,同樣使用 git status
可以看出區(qū)別。
4.3 使用 git log
查看修改過的版本
# 展示所有的版本
$ git log
# 用一行展示每一個版本
$ git log --pretty=oneline
? 黃色的字符串(commit后面的)就是每個版本的版本號捐晶,可以理解為每個版本的id菲语,是一個十六進制的超長的數(shù)字。當(dāng)我們通過git操作版本的時候惑灵,需要用到這個版本號山上。不過看見這么長也不用怕英支,我們不需要全部都寫出來佩憾,一般寫7位能讓Git找到即可。
5. 回退版本
在我們回退版本之前干花,我們需要先明確一個概念—— HEAD
5.1 HEAD
Git中妄帘, HEAD
是一個指針,它指向表示當(dāng)前的版本池凄。所以在回退版本時抡驼,也就是對 HEAD
指向進行改變。
- 如果我們需要回退到上一個版本修赞,就是
HEAD^
婶恼;回退到上上一個版本,就是HEAD^^
柏副。 - 如果回退更多版本勾邦,就可以使用
HEAD~數(shù)字
的方式,例如HEAD~100
就是回退100個版本割择;HEAD~1
就是回退1個版本眷篇。
5.2 穿越到過去
三種方式都可以,最后一種記得修改commit_id的值(這個值是啥荔泳?看上面4.3=侗)
# 回退1個版本
$ git reset --hard HEAD^
# 回退10個版本
$ git reset --hard HEAD~10
# 回退指定版本號的版本
$ git reset --hard commit_id
<u>注:</u> 中間的 --hard
是回退的方式虐杯,一共有三種,我們后面在單獨討論他們的區(qū)別昧港,先放心這樣用就好擎椰。
完成以后,我們發(fā)現(xiàn)命令回復(fù)給我們一行提示创肥,看到這樣的提示达舒,就代表我們回退成功了。其中:
-
HEAD
就是我們前面說的指針(is now at
就不用我說了吧) -
2c76e6a
就是回退后的版本號的前7位(知道為啥前面說是7位了吧) -
index
就是這個版本的描述叹侄,我這里對這個版本的描述就是index
5.3 穿越到未來
當(dāng)我們回退版本(版本A)以后巩搏,又想回到我們回退之前的版本(版本B),該怎么辦趾代?
我們還是使用 git reset
命令來解決問題贯底,但是這時只能使用 commit_id
來進行“穿越”。但是撒强,這時候我們使用 git log
查找版本號時禽捆,發(fā)現(xiàn)只有版本A以前的版本。
這時候睦擂,我們就要用到另一個命令,來找到我們版本B的版本號杖玲。它可以告訴我們顿仇,我們對版本庫進行了那些操作。有這個命令摆马,即時我們關(guān)機重啟臼闻,也可以找到我們所有的操作記錄。
$ git reflog
很顯然囤采,在版本 2c76e6a
(版本A)之后的版本 4cefb07
(版本B)就是我們想穿越到未來的版本述呐。這時候我們只需要使用版本號來進行“穿越”即可。
$ git reset --hard 4cefb07
6. 撤銷修改
當(dāng)我們修改之前的代碼的時候蕉毯,難免會出現(xiàn)改著改著就改亂了的情況乓搬。這時候我們第一時間是想撤銷修改,但是一直 Ctrl Z
未免也太累了吧代虾。這時候进肯,就是使用Git的一些命令來解決問題。不過棉磨,我們要分幾種場景江掩。
(不知道場景狀態(tài)的,請看4.2)
6.1 文件只是在工作區(qū)修改,還沒有 git add
环形,想撤銷
直接使用以下命令策泣,把文件在工作區(qū)的修改全部撤銷。這時候也就撤銷到和當(dāng)前版本庫一毛一樣的狀態(tài)了抬吟。
$ git checkout -- 文件名
# 注意空格和 -- 不可以少萨咕!否則就是切換分支(git checkout)的命令了
# 這個命令的目的,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)火本。
6.2 文件已經(jīng) git add
到暫存區(qū)任洞,工作區(qū)發(fā)生了修改,想撤銷到暫存區(qū)的版本狀態(tài)
-
第一步:用下面的命令撤銷暫存區(qū)的修改发侵,用HEAD代表本地倉庫的最新版本
$ git reset HEAD 文件名
第二步,重復(fù)6.1的操作
最后我們還可以用
git status
來檢查一下妆偏,看看命令行的反饋是不是和下面一樣:
6.3 文件已經(jīng) git commit
到版本庫刃鳄,想撤銷修改
假設(shè)你不但改錯了東西,還從暫存區(qū)提交到了版本庫钱骂,怎么辦呢叔锐?
是不是感覺這個場景有點似曾相識,沒錯见秽,其實就是把我們的倉庫版本回退一下就可以了愉烙。
不過,這是有條件的解取,就是你還沒有把自己的本地版本庫推送到遠(yuǎn)程(遠(yuǎn)程倉庫后面再說)步责。如果你已經(jīng)推到遠(yuǎn)程倉庫了,就么得辦法了~~
7. 刪除文件
一般情況下禀苦,你通常直接在文件管理器中把沒用的文件刪了蔓肯,這里我刪除了 index.html
。 這個時候振乏,Git知道我刪除了文件蔗包,因此,工作區(qū)和版本庫就不一致了慧邮,git status
命令會立刻告訴你哪些文件被刪除了:
現(xiàn)在你有兩個場景:
-
一是確實要從版本庫中刪除該文件调限,那就用命令
git rm
刪掉,并且git commit
:$ git rm index.html # 這一步也可以用git add index.html進行 $ git commit -m "delete"
這樣就把文件從版本庫中刪除了误澳。
二是誤刪了耻矮,但是版本庫里本身有這個文件,那完全可以用
$ git checkout -- 文件名
來恢復(fù)忆谓。但是淘钟!如果這個文件本身沒有被添加到版本庫,那就趕緊去回收站里看看吧,Git是沒有辦法幫你了...
參考資料 廖雪峰 - Git