Git簡介和基礎(chǔ)使用 — Git & GitHub(1)

最近在家太閑了昙衅,翻到以前學(xué)Git整理的筆記圆米,簡單的整理了一下本砰,分享給大家敦腔。

一、Git簡介和幾個概念

git是 Linus 使用使用C語言開發(fā)的迎瞧,最初管理端是 Linux 的源碼哮缺。

集中式與分布式

  1. 集中式

    代表: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ù)器如果出了問題伟姐,則所有人都沒法干活了。
  1. 分布式

    代表: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ū)烈和、版本庫

  1. 工作區(qū)就是在電腦里能看到的目錄

  2. 暫存區(qū)稱為stage(或者叫index)爱只,可以理解為工作區(qū)與版本分支中間的一個緩沖區(qū)。后面馬上提到 git add 就是把修改的內(nèi)容斥杜,先添加到暫存區(qū)虱颗。等我們把所有要提交到倉庫的內(nèi)容都添加到暫存區(qū)后,就可以用 git commit 來提交到指定分支啦蔗喂。(當(dāng)然忘渔,你也可以每 add 一次,就 commit 一次)

  3. 版本庫:指的就是工作區(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 addgit commit 添加提交贯卦。
  • 這時我們可以用 git diff 查看哪里被修改了底挫。減號開頭的代表修改前的,加號開頭代表修改后的脸侥。這里我們課看到,我加了一個感嘆號(其實感嘆號前還有個空格...)
  • 這時候就可以使用 git addgit commit 進行提交了盈厘,提交完成后睁枕,再用 git status 就會發(fā)現(xiàn):nothing to commit, working directory clean。到此為止就完成了一次的修改及提交沸手!

4.2 我忘了剛才修改的文件 git commit 提交版本庫了沒

這時候外遇,同樣使用 git status 可以看出區(qū)別。

修改了但是沒有g(shù)it add

修改了契吉,而且已經(jīng)git add跳仿,但是沒有g(shù)it commit
修改后已經(jīng)git add和git commit,或者沒有任何修改

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以前的版本。

我這里提交次數(shù)只有兩次飘哨,所以回退后只有一個版本

這時候睦擂,我們就要用到另一個命令,來找到我們版本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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末米母,一起剝皮案震驚了整個濱河市勾扭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铁瞒,老刑警劉巖妙色,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異慧耍,居然都是意外死亡身辨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門芍碧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來煌珊,“玉大人,你說我怎么就攤上這事泌豆《ㄢ郑” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵踪危,是天一觀的道長蔬浙。 經(jīng)常有香客問我,道長贞远,這世上最難降的妖魔是什么畴博? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蓝仲,結(jié)果婚禮上俱病,老公的妹妹穿的比我還像新娘。我一直安慰自己袱结,他們只是感情好庶艾,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著擎勘,像睡著了一般咱揍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棚饵,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天煤裙,我揣著相機與錄音,去河邊找鬼噪漾。 笑死硼砰,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的欣硼。 我是一名探鬼主播题翰,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了豹障?” 一聲冷哼從身側(cè)響起冯事,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎血公,沒想到半個月后昵仅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡累魔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年摔笤,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垦写。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡吕世,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梯投,到底是詐尸還是另有隱情命辖,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布晚伙,位于F島的核電站,受9級特大地震影響俭茧,放射性物質(zhì)發(fā)生泄漏咆疗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一母债、第九天 我趴在偏房一處隱蔽的房頂上張望午磁。 院中可真熱鬧,春花似錦毡们、人聲如沸迅皇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽登颓。三九已至,卻和暖如春红氯,著一層夾襖步出監(jiān)牢的瞬間框咙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工痢甘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留喇嘱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓塞栅,卻偏偏與公主長得像者铜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345