干貨:Git入門(mén)詳解

就不給你看俺美麗的容顏

之前講過(guò)如何搭建gitserver,來(lái)實(shí)現(xiàn)自己的私有g(shù)it服務(wù)器乒融,后來(lái)有人問(wèn)git到底是個(gè)什么東東,應(yīng)該怎么用摄悯?下面就來(lái)詳解一下git這個(gè)神奇的工具赞季,幫助大家解惑一下,順便總結(jié)一下一些常用的git命令奢驯,希望能幫到大家申钩。喵~

  • 什么是git?

Git是一款免費(fèi)、開(kāi)源的分布式版本控制系統(tǒng)瘪阁,用于敏捷高效地處理任何或小或大的項(xiàng)目撒遣。好吧,什么是分布式版本控制系統(tǒng)?如果你用Microsoft Word寫(xiě)過(guò)長(zhǎng)篇大論,那你一定有這樣的經(jīng)歷:想刪除一個(gè)段落管跺,又怕將來(lái)想恢復(fù)找不回來(lái)怎么辦义黎?有辦法,先把當(dāng)前文件“另存為……”一個(gè)新的Word文件豁跑,再接著改廉涕,改到一定程度,再“另存為……”一個(gè)新文件艇拍,這樣一直改下去狐蜕,最后你的Word文檔變成了這樣:

是不是很亂.png

過(guò)了一周,你想找回被刪除的文字卸夕,但是已經(jīng)記不清刪除前保存在哪個(gè)文件里了层释,只好一個(gè)一個(gè)文件去找,真麻煩快集」备幔看著一堆亂七八糟的文件廉白,想保留最新的一個(gè),然后把其他的刪掉治力,又怕哪天會(huì)用上蒙秒,還不敢刪勃黍,真郁悶宵统。 更要命的是,有些部分需要你的財(cái)務(wù)同事幫助填寫(xiě)覆获,于是你把文件Copy到U盤(pán)里給她(也可能通過(guò)Email發(fā)送一份給她)马澈,然后,你繼續(xù)修改Word文件弄息。一天后痊班,同事再把Word文件傳給你,此時(shí)摹量,你必須想想涤伐,發(fā)給她之后到你收到她的文件期間,你作了哪些改動(dòng)缨称,得把你的改動(dòng)和她的部分合并凝果,真困難。于是你想睦尽,如果有一個(gè)軟件器净,不但能自動(dòng)幫我記錄每次文件的改動(dòng),還可以讓同事協(xié)作編輯当凡,這樣就不用自己管理一堆類似的文件了山害,也不需要把文件傳來(lái)傳去。如果想查看某次改動(dòng)沿量,只需要在軟件里瞄一眼就可以浪慌,豈不是很方便? 這個(gè)軟件用起來(lái)就應(yīng)該像這個(gè)樣子朴则,能記錄每次文件的改動(dòng):
版本管理清晰

運(yùn)用git权纤,你可以輕松記錄自己在什么時(shí)候修改了什么,并且可以很輕易的將文件像時(shí)光穿梭一樣回退或者向前到某個(gè)版本佛掖,這便是版本管理工具的作用妖碉。
(以上大部分轉(zhuǎn)自廖雪峰老師的git簡(jiǎn)介)

  • 什么是github?

很多人剛開(kāi)始搞不清git和github,其實(shí)這兩個(gè)東西是完全不同的芥被,git是一個(gè)版本管理工具欧宜,而github則是全球最大的同性交友平臺(tái)(滑稽臉(~ ̄▽ ̄)~),其實(shí)github是一個(gè)用git作為版本控制的代碼托管平臺(tái)拴魄,每個(gè)人在上面都可以存放自己的代碼庫(kù)或者小說(shuō)文章之類的冗茸。

  • git工作原理圖

git工作原理圖.png

主要涉及到四個(gè)關(guān)鍵點(diǎn):

工作區(qū):本地電腦存放項(xiàng)目文件的地方席镀,比如learnGitProject文件夾;

暫存區(qū)(Index/Stage):在使用git管理項(xiàng)目文件的時(shí)候夏漱,其本地的項(xiàng)目文件會(huì)多出一個(gè).git的文件夾豪诲,將這個(gè).git文件夾稱之為版本庫(kù)。其中.git文件夾中包含了兩個(gè)部分挂绰,一個(gè)是暫存區(qū)(Index或者Stage),顧名思義就是暫時(shí)存放文件的地方屎篱,通常使用add命令將工作區(qū)的文件添加到暫存區(qū)里;

本地倉(cāng)庫(kù):.git文件夾里還包括git自動(dòng)創(chuàng)建的master分支葵蒂,并且將HEAD指針指向master分支交播。使用commit命令可以將暫存區(qū)中的文件添加到本地倉(cāng)庫(kù)中;

遠(yuǎn)程倉(cāng)庫(kù):不是在本地倉(cāng)庫(kù)中践付,項(xiàng)目代碼在遠(yuǎn)程git服務(wù)器上秦士,比如項(xiàng)目放在github上,就是一個(gè)遠(yuǎn)程倉(cāng)庫(kù)永高,通常使用clone命令將遠(yuǎn)程倉(cāng)庫(kù)拷貝到本地倉(cāng)庫(kù)中隧土,開(kāi)發(fā)后推送到遠(yuǎn)程倉(cāng)庫(kù)中即可;

這些是git里面基本的概念命爬,暫時(shí)不明白也沒(méi)關(guān)系曹傀,下面我們實(shí)際操作一下,應(yīng)該就會(huì)加深理解遇骑。

  • 安裝git

在Mac OS X上安裝Git

首先安裝homebrew 然后通過(guò)homebrew安裝git卖毁。HomeBrew是mac系統(tǒng)上的軟件包管理工具,能在mac中方便的安裝軟件或者卸載軟件落萎,首先說(shuō)安裝homebrew亥啦。打開(kāi)官網(wǎng)有一個(gè)指令,可以直接復(fù)制粘貼到終端:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

使用homebrew安裝git

brew install git

然后執(zhí)行

git --version

可以查看git是否安裝成功练链。

在Windows上安裝Git

在Windows上使用Git翔脱,可以從Git官網(wǎng)直接下載安裝程序,(網(wǎng)速慢的同學(xué)請(qǐng)移步國(guó)內(nèi)鏡像)媒鼓,然后按默認(rèn)選項(xiàng)安裝即可届吁。

安裝完成后,在開(kāi)始菜單里找到“Git”->“Git Bash”绿鸣,蹦出一個(gè)類似命令行窗口的東西疚沐,就說(shuō)明Git安裝成功!



安裝完成后潮模,還需要最后一步設(shè)置亮蛔,在命令行輸入:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

因?yàn)镚it是分布式版本控制系統(tǒng),所以擎厢,每個(gè)機(jī)器都必須自報(bào)家門(mén):你的名字和Email地址究流。類似于用戶名之類的辣吃,最好填寫(xiě)容易分辨出這臺(tái)PC的。
注意git config命令的--global參數(shù)芬探,用了這個(gè)參數(shù)神得,表示你這臺(tái)機(jī)器上所有的Git倉(cāng)庫(kù)都會(huì)使用這個(gè)配置,當(dāng)然也可以對(duì)某個(gè)倉(cāng)庫(kù)指定不同的用戶名和Email地址偷仿。

  • 創(chuàng)建你的第一個(gè)版本庫(kù)

第一步

首先哩簿,選擇一個(gè)合適的地方,創(chuàng)建一個(gè)空目錄:

$ mkdir learngit
$ cd learngit
$ pwd
/Users/michael/learngit

pwd命令用于顯示當(dāng)前目錄炎疆。在我的Mac上卡骂,這個(gè)倉(cāng)庫(kù)位于/Users/michael/learngit。
如果你使用Windows系統(tǒng)形入,為了避免遇到各種莫名其妙的問(wèn)題,請(qǐng)確保目錄名(包括父目錄)不包含中文缝左。

第二步

通過(guò)git init命令把這個(gè)目錄變成Git可以管理的倉(cāng)庫(kù):

$ git init
Initialized empty Git repository in /Users/michael/learngit/.git/

瞬間Git就把倉(cāng)庫(kù)建好了亿遂,而且告訴你是一個(gè)空的倉(cāng)庫(kù)(empty Git repository),細(xì)心的讀者可以發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git的目錄渺杉,這個(gè)目錄是Git來(lái)跟蹤管理版本庫(kù)的蛇数,沒(méi)事千萬(wàn)不要手動(dòng)修改這個(gè)目錄里面的文件,不然改亂了是越,就把Git倉(cāng)庫(kù)給破壞了耳舅。
如果你沒(méi)有看到.git目錄,那是因?yàn)檫@個(gè)目錄默認(rèn)是隱藏的倚评。
這個(gè)創(chuàng)建的文件夾就是你的workspace浦徊,即之前提到的工作區(qū)。

第三步

把文件添加到版本庫(kù)
首先這里再明確一下天梧,所有的版本控制系統(tǒng)盔性,其實(shí)只能跟蹤文本文件的改動(dòng),比如TXT文件呢岗,網(wǎng)頁(yè)冕香,所有的程序代碼等等,Git也不例外后豫。版本控制系統(tǒng)可以告訴你每次的改動(dòng)悉尾,比如在第5行加了一個(gè)單詞“Linux”,在第8行刪了一個(gè)單詞“Windows”挫酿。而圖片构眯、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理饭豹,但沒(méi)法跟蹤文件的變化鸵赖,只能把二進(jìn)制文件每次改動(dòng)串起來(lái)务漩,也就是只知道圖片從100KB改成了120KB,但到底改了啥它褪,版本控制系統(tǒng)不知道饵骨,也沒(méi)法知道。

使用Windows的童鞋要特別注意
千萬(wàn)不要使用Windows自帶的記事本編輯任何文本文件茫打。原因是Microsoft開(kāi)發(fā)記事本的團(tuán)隊(duì)使用了一個(gè)非常弱智的行為來(lái)保存UTF-8編碼的文件居触,他們自作聰明地在每個(gè)文件開(kāi)頭添加了0xefbbbf(十六進(jìn)制)的字符,你會(huì)遇到很多不可思議的問(wèn)題老赤,比如轮洋,網(wǎng)頁(yè)第一行可能會(huì)顯示一個(gè)“?”,明明正確的程序一編譯就報(bào)語(yǔ)法錯(cuò)誤抬旺,等等弊予,都是由記事本的弱智行為帶來(lái)的。建議你下載sublime代替記事本,功能強(qiáng)大!

現(xiàn)在我們?cè)谖募A下編寫(xiě)一個(gè)readme.txt文件开财,內(nèi)容如下:

Git is a version control system.
Git is free software.

之后汉柒,cd到文件夾下,我們需要執(zhí)行幾個(gè)命令责鳍,這幾個(gè)命令要熟記:
第一步碾褂,用命令git add告訴Git,把文件添加到倉(cāng)庫(kù):

git add readme.txt

執(zhí)行上面的命令历葛,沒(méi)有任何顯示正塌,這就對(duì)了,Unix的哲學(xué)是“沒(méi)有消息就是好消息”恤溶,說(shuō)明添加成功乓诽。這時(shí)候我們相當(dāng)于把修改從工作區(qū)放到了暫存區(qū)(上面提到的)。
第二步宏娄,用命令git commit告訴Git问裕,把文件提交到倉(cāng)庫(kù):

$ git commit -m "wrote a readme file"
[master (root-commit) eaadf4e] wrote a readme file
 1 file changed, 2 insertions(+)
 create mode 100644 readme.txt

簡(jiǎn)單解釋一下git commit命令,-m后面輸入的是本次提交的說(shuō)明孵坚,可以輸入任意內(nèi)容粮宛,當(dāng)然最好是有意義的,這樣你就能從歷史記錄里方便地找到改動(dòng)記錄卖宠。
git commit命令執(zhí)行成功后會(huì)告訴你巍杈,1 file changed:1個(gè)文件被改動(dòng)(我們新添加的readme.txt文件);2 insertions:插入了兩行內(nèi)容(readme.txt有兩行內(nèi)容)扛伍。
這時(shí)候我們相當(dāng)于將暫存區(qū)的修改提交到了本地倉(cāng)庫(kù)筷畦。

為什么Git添加文件需要add,commit一共兩步呢?因?yàn)閏ommit可以一次提交很多文件鳖宾,所以你可以多次add不同的文件吼砂,比如:

$ git add file1.txt
$ git add file2.txt file3.txt
$ git commit -m "add 3 files."

最后可以一次性提交到本地的倉(cāng)庫(kù)。

  • 版本回退

上一部分我們已經(jīng)成功地添加并提交了一個(gè)readme.txt文件鼎文,現(xiàn)在渔肩,是時(shí)候繼續(xù)工作了,于是拇惋,我們繼續(xù)修改readme.txt文件周偎,改成如下內(nèi)容:

Git is a distributed version control system.
Git is free software.

現(xiàn)在,運(yùn)行git status命令看看結(jié)果:

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   readme.txt

no changes added to commit (use "git add" and/or "git commit -a")

git status命令可以讓我們時(shí)刻掌握倉(cāng)庫(kù)當(dāng)前的狀態(tài)撑帖,上面的命令輸出告訴我們蓉坎,readme.txt被修改過(guò)了,但還沒(méi)有準(zhǔn)備提交的修改胡嘿。
我們繼續(xù)像上一部分一樣蛉艾,將修改提交到倉(cāng)庫(kù)即可。提交后灶平,我們?cè)儆胓it status命令看看倉(cāng)庫(kù)的當(dāng)前狀態(tài):

$ git status
On branch master
nothing to commit, working tree clean

Git告訴我們當(dāng)前沒(méi)有需要提交的修改伺通,而且,工作目錄是干凈(working tree clean)的逢享。

現(xiàn)在,我們回顧一下readme.txt文件一共有幾個(gè)版本被提交到Git倉(cāng)庫(kù)里了:
版本1:wrote a readme file

Git is a version control system.
Git is free software.

版本2:add distributed

Git is a distributed version control system.
Git is free software.

當(dāng)然了吴藻,在實(shí)際工作中瞒爬,我們腦子里怎么可能記得一個(gè)幾千行的文件每次都改了什么內(nèi)容,不然要版本控制系統(tǒng)干什么沟堡。版本控制系統(tǒng)肯定有某個(gè)命令可以告訴我們歷史記錄侧但,在Git中,我們用git log命令查看:

$ git log
commit e475afc93c209a690c39c13a46716e8fa000c366
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 21:03:36 2018 +0800

    add distributed

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

好了航罗,現(xiàn)在我們啟動(dòng)時(shí)光穿梭機(jī)禀横,準(zhǔn)備把readme.txt回退到上一個(gè)版本,也就是wrote a readme file的那個(gè)版本粥血,怎么做呢柏锄?

首先,Git必須知道當(dāng)前版本是哪個(gè)版本复亏,在Git中趾娃,用HEAD表示當(dāng)前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一樣)缔御,上一個(gè)版本就是HEAD抬闷,上上一個(gè)版本就是HEAD,當(dāng)然往上100個(gè)版本寫(xiě)100個(gè)比較容易數(shù)不過(guò)來(lái)耕突,所以寫(xiě)成HEAD~100笤成。

使用git reset命令:

git reset --hard HEAD^

--hard參數(shù)有啥意義评架?這個(gè)后面再講,現(xiàn)在你先放心使用炕泳。執(zhí)行后可以打開(kāi)文件看下確實(shí)被還原了纵诞!

這個(gè)時(shí)候看下git log:

commit eaadf4e385e865d25c48e7ca9c8395c3f7dfaef0
Author: Michael Liao <askxuefeng@gmail.com>
Date:   Fri May 18 20:59:18 2018 +0800

    wrote a readme file

就變成只有這一個(gè)版本了。這個(gè)時(shí)候有人問(wèn)了怎么再回到最新的呢喊崖?這個(gè)就先留給讀者自己去探索了<( ̄︶ ̄)>(請(qǐng)放心挣磨,肯定是可以再回去的)。

git作為一個(gè)超級(jí)強(qiáng)大的版本管理工具荤懂,是可以肆意穿梭的茁裙,所以有很多命令讀者朋友們可以自己去探索,系統(tǒng)的學(xué)習(xí)git這里推薦兩個(gè)網(wǎng)站节仿,也是本入門(mén)文章的參考來(lái)源:

給點(diǎn)個(gè)贊再走唄(/ ̄? ̄/)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晤锥,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子廊宪,更是在濱河造成了極大的恐慌矾瘾,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箭启,死亡現(xiàn)場(chǎng)離奇詭異壕翩,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)傅寡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)放妈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人荐操,你說(shuō)我怎么就攤上這事芜抒。” “怎么了托启?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵宅倒,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我屯耸,道長(zhǎng)拐迁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任肩民,我火速辦了婚禮唠亚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘持痰。我一直安慰自己灶搜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著割卖,像睡著了一般前酿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上鹏溯,一...
    開(kāi)封第一講書(shū)人閱讀 51,521評(píng)論 1 304
  • 那天罢维,我揣著相機(jī)與錄音,去河邊找鬼丙挽。 笑死肺孵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的颜阐。 我是一名探鬼主播平窘,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼凳怨!你這毒婦竟也來(lái)了瑰艘?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤肤舞,失蹤者是張志新(化名)和其女友劉穎紫新,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體李剖,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芒率,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篙顺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敲董。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慰安,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情聪铺,我是刑警寧澤化焕,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站铃剔,受9級(jí)特大地震影響撒桨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜键兜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一凤类、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧普气,春花似錦谜疤、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)履肃。三九已至,卻和暖如春坐桩,著一層夾襖步出監(jiān)牢的瞬間尺棋,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绵跷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膘螟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓碾局,卻偏偏與公主長(zhǎng)得像荆残,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子擦俐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git脊阴,從https:/...
    落魂灬閱讀 12,663評(píng)論 4 54
  • 蓋房常見(jiàn)風(fēng)水注意 1、住宅起屋蚯瞧,莫先筑圍墻嘿期,圍墻為困字,圍之財(cái)不進(jìn)埋合,家不發(fā)备徐; 2、住宅起屋甚颂,莫先起小屋蜜猾,為之停喪...
    周易與奇門(mén)閱讀 766評(píng)論 0 1
  • 我的生活和幻想是完美!的我喜歡幻想我喜歡編鬼故事把他們嚇的半死振诬,我是一位四年級(jí)的小學(xué)生蹭睡,爸爸媽媽想讓我看點(diǎn)成...
    7葉草我愛(ài)你閱讀 91評(píng)論 1 2
  • 01 體制外的醉歌 近年來(lái)肩豁,我們會(huì)時(shí)不時(shí)就聽(tīng)說(shuō),體制內(nèi)的某某辭職了辫呻,或者體制內(nèi)離職潮來(lái)了清钥。 比如,有“世界那么大放闺,...
    卡其色的二度視野閱讀 670評(píng)論 3 3
  • 兩點(diǎn)六點(diǎn)十一點(diǎn) 月亮慢慢爬上來(lái) 孑然行至燈火闌珊處 欲去拈一朵你的氣息 摘一把你的溫度 卻只觸到晚霞的余溫 思念在...
    裸漫閱讀 1,288評(píng)論 17 39