Git使用基礎(chǔ)-1

我見青山多嫵媚,料青山,見我,應(yīng)如是。程序員應(yīng)如是

image

git簡介

很多人都知道,Linus在1991年創(chuàng)建了開源的Linux,從此,Linux系統(tǒng)不斷發(fā)展,已經(jīng)成為最大的服務(wù)器系統(tǒng)軟件了。

Linus雖然創(chuàng)建了Linux,但Linux的壯大是靠全世界熱心的志愿者參與的,這么多人在世界各地為Linux編寫代碼,那Linux的代碼是如何管理的呢?

事實是,在2002年以前,世界各地的志愿者把源代碼文件通過diff的方式發(fā)給Linus,然后由Linus本人通過手工方式合并代碼!

你也許會想,為什么Linus不把Linux代碼放到版本控制系統(tǒng)里呢?不是有CVS、SVN這些免費的版本控制系統(tǒng)嗎?因為Linus堅定地反對CVS和SVN,這些集中式的版本控制系統(tǒng)不但速度慢,而且必須聯(lián)網(wǎng)才能使用。有一些商用的版本控制系統(tǒng),雖然比CVS、SVN好用,但那是付費的,和Linux的開源精神不符。

不過,到了2002年,Linux系統(tǒng)已經(jīng)發(fā)展了十年了,代碼庫之大讓Linus很難繼續(xù)通過手工方式管理了,社區(qū)的弟兄們也對這種方式表達(dá)了強烈不滿,于是Linus選擇了一個商業(yè)的版本控制系統(tǒng)BitKeeper,BitKeeper的東家BitMover公司出于人道主義精神,授權(quán)Linux社區(qū)免費使用這個版本控制系統(tǒng)。

安定團(tuán)結(jié)的大好局面在2005年就被打破了,原因是Linux社區(qū)牛人聚集,不免沾染了一些梁山好漢的江湖習(xí)氣。開發(fā)Samba的Andrew試圖破解BitKeeper的協(xié)議(這么干的其實也不只他一個),被BitMover公司發(fā)現(xiàn)了(監(jiān)控工作做得不錯?。?,于是BitMover公司怒了,要收回Linux社區(qū)的免費使用權(quán)。

Linus可以向BitMover公司道個歉,保證以后嚴(yán)格管教弟兄們,嗯,這是不可能的。實際情況是這樣的:

Linus花了兩周時間自己用C寫了一個分布式版本控制系統(tǒng),這就是Git!一個月之內(nèi),Linux系統(tǒng)的源碼已經(jīng)由Git管理了!牛是怎么定義的呢?大家可以體會一下。

Git迅速成為最流行的分布式版本控制系統(tǒng),尤其是2008年,GitHub網(wǎng)站上線了,它為開源項目免費提供Git存儲,無數(shù)開源項目開始遷移至GitHub,包括jQuery,PHP,Ruby等等。

歷史就是這么偶然,如果不是當(dāng)年BitMover公司威脅Linux社區(qū),可能現(xiàn)在我們就沒有免費而超級好用的Git了。

git安裝

  • Windows

    去官網(wǎng)下載,選擇安裝路徑,默認(rèn)安裝即可 Git官網(wǎng)下載

  • Lunix

    • 通常輸入git可以查看如否安裝,如果沒有安裝,會提示你安裝的命令
    • 如果是Ubuntu或Debain可以通過sudo apt-get install git即可安裝
    • 如果是其他版本的Linux,可以采用去官網(wǎng)下載源碼,然后解壓,依次輸入:./config,make,sudo make install這幾個命令安裝就好了
  • Mac

    在Appstore中下載Xcode這個IDE,這是蘋果系統(tǒng)最好的IDE,開發(fā)人員一定會下載的那種,Xcode中集成了Git,不過沒有默認(rèn)安裝,需要運行Xcode,在Preferences中找到Downloads,選擇Command Line Tools,點擊install即可

基本應(yīng)用

創(chuàng)建版本庫

什么是版本庫呢?版本庫又名倉庫,英文名repository,你可以簡單理解成一個目錄,這個目錄里面的所有文件都可以被Git管理起來,每個文件的修改、刪除,Git都能跟蹤,以便任何時刻都可以追蹤歷史,或者在將來某個時刻可以“還原”。

  • 選擇一個合適的地方,創(chuàng)建一個空目錄

    mkdir GitHubRepository
    cd GitHubRepository
    pwd  #顯示當(dāng)前目錄
    
    image-20201104191830658

    注:為了避免莫名其妙的問題,建議目錄(包括父目錄)使用英文

  • 通過git init命令把此目錄變成Git管理的倉庫

    git init
    
    image-20201104191855689

    瞬間Git就把倉庫建好了,而且告訴你是一個空的倉庫(empty Git repository),細(xì)心的讀者可以發(fā)現(xiàn)當(dāng)前目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改這個目錄里面的文件,不然改亂了,就把Git倉庫給破壞了。

  • 把文件添加到版本庫

    首先這里再明確一下,所有的版本控制系統(tǒng),其實只能跟蹤文本文件的改動,比如TXT文件,網(wǎng)頁,所有的程序代碼等等,Git也不例外。版本控制系統(tǒng)可以告訴你每次的改動,比如在第5行加了一個單詞“Linux”,在第8行刪了一個單詞“Windows”。而圖片、視頻這些二進(jìn)制文件,雖然也能由版本控制系統(tǒng)管理,但沒法跟蹤文件的變化,只能把二進(jìn)制文件每次改動串起來,也就是只知道圖片從100KB改成了120KB,但到底改了啥,版本控制系統(tǒng)不知道,也沒法知道。

    不幸的是,Microsoft的Word格式是二進(jìn)制格式,因此,版本控制系統(tǒng)是沒法跟蹤Word文件的改動的,前面我們舉的例子只是為了演示,如果要真正使用版本控制系統(tǒng),就要以純文本方式編寫文件。

    因為文本是有編碼的,比如中文有常用的GBK編碼,日文有Shift_JIS編碼,如果沒有歷史遺留問題,強烈建議使用標(biāo)準(zhǔn)的UTF-8編碼,所有語言使用同一種編碼,既沒有沖突,又被所有平臺所支持。

    • 編寫一個about.txt文件,內(nèi)容如下
    我是程序員應(yīng)如是
    Git is a version control system
    
    • 使用git add命令,把文件添加到倉庫
    git add about.txt
    
    image-20201104191919909

    注:LF和CRLF是兩種換行方式,對于這次學(xué)習(xí)Git沒影響

    • 使用git commit命令,把文件提交到倉庫
    git commit -m "This is a message about me"
    # -m 后面的是本次提交的說明信息,最好寫的有意義,幫助別人了解此次改動的信息
    
    image-20201104191940296
    • 使用git status查看結(jié)果
    git status
    
    image-20201104191958853

    注:git add <file>可以添加多個文件,反復(fù)使用;git commit -m <message>可以一次提交多個文件

時光穿梭(版本)

  • 現(xiàn)在模仿日常工作,要對項目進(jìn)行修改,我們修改about.txt文件,添加如下信息

    Git is a free software.
    

    再使用git status查看結(jié)果

    image-20201104192017163

    通過git status命令,我們可以時刻掌握倉庫當(dāng)前的狀態(tài),上面的命令輸出告訴我們,文件被修改了,但是還沒有提交修改

    • 使用git diff命令查看具體修改的內(nèi)容
    git diff about.txt
    
    image-20201104192035542
    • 再分別使用git add;git commit;git status命令查看狀態(tài)
    git add about.txt
    git status
    #查看此時的狀態(tài)
    git commit -m "Add a message"
    git status
    #再查看此時的狀態(tài)
    
    image-20201104192057057
  • 版本回退

    • 使用git log命令查看文件的版本
    git log
    
    image-20201104192114962

    git log命令顯示從最近到最遠(yuǎn)的提交日志

    如果嫌輸出信息太多,可以加上--pretty=oneline參數(shù)

    git log --pretty=oneline
    
    image-20201104192132332

    需要友情提示的是,你看到的一大串類似4b4258ee...的是commit id(版本號),和SVN不一樣,Git的commit id不是1,2,3……遞增的數(shù)字,而是一個SHA1計算出來的一個非常大的數(shù)字,用十六進(jìn)制表示,而且你看到的commit id和我的肯定不一樣,以你自己的為準(zhǔn)。為什么commit id需要用這么一大串?dāng)?shù)字表示呢?因為Git是分布式的版本控制系統(tǒng),后面我們還要研究多人在同一個版本庫里工作,如果大家都用1,2,3……作為版本號,那肯定就沖突了。

    • 版本回退

    在Git中,用HEAD表示當(dāng)前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當(dāng)然往上100個版本寫100個^比較容易數(shù)不過來,所以寫成HEAD~100。

    #回到上一個版本
    git reset --hard HEAD^
    
    image-20201104192151062

    我們已經(jīng)乘坐時光機(jī)回去了

    • 想再回來

    如果想要再回來,就必須知道commit id,如果不記得了,git提供了后悔藥

    git refolg # 記錄你的每一次命令
    git reset --hard 4b4258e
    cat about.txt
    
    image-20201104192206215

    誒嘿,我胡漢三又回來了

    注:版本號沒必要寫全,前幾位就可以了,Git會自動去找。當(dāng)然也不能只寫前一兩位,因為Git可能會找到多個版本號,就無法確定是哪一個了。

  • 工作區(qū)和暫存區(qū)

    Git和其他版本控制系統(tǒng)如SVN的一個不同之處就是有暫存區(qū)的概念。

    • 工作區(qū)(Working Directory)

    就是你在電腦里能看到的目錄,比如我的LearnMysql文件夾就是一個工作區(qū)

    • 版本庫(Repository)

    工作區(qū)有一個隱藏目錄.git,這個不算工作區(qū),而是Git的版本庫。

    Git的版本庫里存了很多東西,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動創(chuàng)建的第一個分支master,以及指向master的一個指針叫HEAD。

    image-20201104192223012
    • 工作流程

    第一步是用git add把文件添加進(jìn)去,實際上就是把文件修改添加到暫存區(qū);

    第二步是用git commit提交更改,實際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支。

  • 管理修改

    Git管理的是修改,當(dāng)你用git add命令后,在工作區(qū)的第一次修改被放入暫存區(qū),準(zhǔn)備提交,但是,在工作區(qū)的第二次修改并沒有放入暫存區(qū),所以,git commit只負(fù)責(zé)把暫存區(qū)的修改提交了,也就是第一次的修改被提交了,第二次的修改不會被提交。

    • 可以用git diff HEAD命令查看工作區(qū)和版本庫里面最新版本的區(qū)別
    git diff HEAD --about.txt
    
    image-20201104192239252
  • 撤銷修改

    當(dāng)你在深夜加班修改項目時,不小心在項目里添加了如下

    TMD,stupid boss
    

    ,難受!這個月的獎金,嗯~

    • 內(nèi)容只在工作區(qū),沒有使用過git add
    git checkout -- about.txt
    

    git checkout -- file可以丟棄工作區(qū)的修改

    image-20201104192255744
    image-20201104192309329

    修改被刪除了

    注:git checkout -- file命令中的--很重要,沒有--,就變成了“切換到另一個分支”的命令,我們在后面的分支管理中會再次遇到git checkout命令。

    • 內(nèi)容在暫存區(qū),使用了git add命令,沒使用git commit命令
    git reset HEAD about.txt
    #把文件從暫存區(qū)重新放回工作區(qū)
    

    現(xiàn)在修改在工作區(qū),可以使用上面的命令將工作區(qū)的修改刪除

    image-20201104192339336

    嗯,獎金總算保住了

    • 如果腦子一熱,使用了git commit命令,可以通過版本回退,回到上一個版本
    image-20201104192358404
  • 刪除文件

    現(xiàn)在我們有一個沒用的文件test.txt,想要刪除,文件已經(jīng)在版本庫中

    首先我們先刪除工作區(qū)的文件,可以圖形化刪除也可以使用命令rm <file>

    image-20201104192415808

    現(xiàn)在我們有兩個選擇

    • 刪除版本庫中的文件
    git rm test.txt #從版本庫中刪除文件
    git commit -m "remove test.txt"
    
    #也可以使用git add test.txt 代替git rm test.txt 效果一樣
    
    image-20201104192430077
    • 刪除了,從版本庫中恢復(fù)文件
    #git checkout 版本庫里文件的版本替換工作區(qū)里文件的版本
    git checkout -- test.txt
    
    image-20201104192448870

小提示:

  • git 提交信息

    查看其他人提交的修改內(nèi)容或自己的歷史記錄的時候,提交信息是需要用到的重要資料。所以請用心填寫修改內(nèi)容的提交信息,以方便別人理解。
    以下是Git的標(biāo)準(zhǔn)注解:

    第1行:提交修改內(nèi)容的摘要
    第2行:空行
    第3行以后:修改的理由
    
  • git更新

    #查看版本
    git --version
    #git版本是2.17.1之前
    git update
    #git版本是2.17.1之后
    git update-git-for-windows
    

                                                 END
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容