git 教程

1. 安裝環(huán)境

  1. 安裝git

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

    安裝完成后,在開始菜單里找到“Git”->“Git Bash”,蹦出一個類似命令行窗口的東西,就說明Git安裝成功!

  2. Git配置 git config

    mac os

    /etc/gitconfig 文件:系統(tǒng)中對所有用戶都普遍適用的配置。若使用 git config 時用 –system 選項(xiàng),讀寫的就是這個文件。

    ~/.gitconfig 文件:用戶目錄下的配置文件只適用于該用戶。若使用 git config 時用 –global 選項(xiàng),讀寫的就是這個文件。 (目錄:/Users/lzhan/.gitconfig)

    當(dāng)前項(xiàng)目的 Git 目錄中的配置文件(也就是工作目錄中的 .git/config 文件):這里的配置僅僅針對當(dāng)前項(xiàng)目有效。每一個級別的配置都會覆蓋上層的相同配置,所以 .git/config 里的配置會覆蓋 /etc/gitconfig 中的同名變量。

    windows

    在 Windows 系統(tǒng)上,Git 會找尋用戶主目錄下的 .gitconfig 文件。主目錄即 HOME 變量指定的目錄,一般都是 C:\Documents and Settings\USER(比如C:\Users\Administrator.gitconfig)。

    此外,Git 還會嘗試找尋 /etc/gitconfig 文件,只不過看當(dāng)初 Git 裝在什么目錄,就以此作為根目錄來定位。

    命令行配置用戶信息

        $ git config --global user.name "wyndam"
        $ git config --global user.email "only.night@qq.com"
    
  3. 查看用戶配置

        git config --list
    

2. 創(chuàng)建本地倉庫

  1. 創(chuàng)建本地倉庫

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

    • Windows系統(tǒng),為了避免遇到各種莫名其妙的問題,請確保目錄名(包括父目錄)不包含中文。
    1. 創(chuàng)建空目錄

       mkdir mygit
       cd mygit
       pwd
       <!--pwd:顯示當(dāng)前目錄-->
       <!--我的:/c/Users/31832/mygit-->
      
    2. 通過git init命令把這個目錄變成Git可以管理的倉庫:

       git init
       <!--顯示:Initialized empty Git repository in C:/Users/31832/mygit/.git/-->
      
      • 目錄下多了一個.git的目錄,這個目錄是Git來跟蹤管理版本庫的,沒事千萬不要手動修改。
      • 如果沒有.git目錄,因?yàn)槟夸浤J(rèn)是隱藏的,用ls -ah命令就可以看見。
      • 本文件的改動,比如TXT文件,網(wǎng)頁,所有的程序代碼等等,版本控制系統(tǒng)可以告訴你每次的具體改動。圖片、視頻這些二進(jìn)制文件,雖然由版本控制系統(tǒng)管理,但沒法跟蹤文件的變化,只知道圖片從100KB改成了120KB,但到底改了啥,版本控制系統(tǒng)不知道
      • Microsoft的Word格式是二進(jìn)制格式,因此,版本控制系統(tǒng)是沒法跟蹤Word文件的改動的
      • 不要使用Windows自帶的記事本編輯任何文本文件,會遇到很多不可思議的問題,比如,網(wǎng)頁第一行可能會顯示一個“?”,明明正確的程序一編譯就報語法錯誤,等等,建議你下載Notepad++代替記事本,不但功能強(qiáng)大,而且免費(fèi)!記得把Notepad++的默認(rèn)編碼設(shè)置為UTF-8
  1. 編寫文件

      vi readme.txt
      <!--編輯一個名字為readme的txt文件-->
      <!--接下來那你會進(jìn)入一個編寫頁面-->
    
  2. 把文件添加到緩沖區(qū)

      git add readme.txt
      git add *.txt //添加所有記事本文件到緩沖區(qū)
    

    會出現(xiàn)錯誤:warning: LF will be replaced by CRLF in readme.txt.
    The file will have its original line endings in your working directory

    錯誤原因:windows中的換行符為 CRLF, 而在linux下的換行符為LF,所以在執(zhí)行add時出現(xiàn)提示

    解決方法:rm -rf .git // 刪除.git
    git config --global core.autocrlf false //禁用自動轉(zhuǎn)換
    git add readme.txt // 重新把文件添加到倉庫,

    1. git add .

        git add . :他會監(jiān)控工作區(qū)的狀態(tài)樹,使用它會把工作時的所有變化提交到暫存區(qū),包括文件內(nèi)容修改(modified)以及新文件(new),但不包括被刪除的文件。
    2. git add -u

        git add -u :他僅監(jiān)控已經(jīng)被add的文件(即tracked file),他會將被修改的文件提交到暫存區(qū)。add -u 不會提交新文件(untracked file)。(git add --update的縮寫)
    2. git add -A在功能上看似很相近,但還是存在一點(diǎn)差別

        git add -A :是上面兩個功能的合集(git add --all的縮寫)
    4. 把文件提交到倉庫
    
        git commit -m '說明文字'
        git commit -m "write readme file"
        //1. -m 后面的文字是用來說明本次操作的,會記錄在歷史記錄里
        //2. 正確顯示的內(nèi)容:
                    [master (root-commit) ac7116d] write readme file
                    1 file changed, 1 insertion(+)
                    create mode 100644 readme.txt
        //3.  1 file changed:1個文件被改動
        //4.   1 insertion(+) 插入了一行內(nèi)容(readme.txt有一行內(nèi)容)
    * commit可以一次提交很多文件,所以可以多次add不同的文件,然后再一起提交
    
    >第一步是用git add把文件添加進(jìn)去,實(shí)際上就是把文件修改添加到暫存區(qū);

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

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

3. 修改操作和回溯版本

  1. 查看修改

    1. git status //倉庫當(dāng)前的狀態(tài) 比如什么被修改了

       vi readme.txt //進(jìn)入文檔后,修改一下文檔,我添加了Git
       git status
       結(jié)果: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")
       //上面的命令輸出告訴我們,readme.txt被修改過了,但還沒有準(zhǔn)備提交的修改。
      
    2. git diff //查看修改了什么

       git diff
      
       結(jié)果:diff --git a/readme.txt b/readme.txt
           index fdc793e..6a331c8 100644
           --- a/readme.txt
           +++ b/readme.txt
           @@ -1 +1,2 @@
            python
           +Git
      
    3. 提交修改

       git add readme.txt
       git commit -m "change readme.txt"
       結(jié)果:[master b3252f8] change readme.txt
             1 file changed, 1 insertion(+)
             // 告訴我們一個我們一個文件被改變了
       git status
       結(jié)果:On branch master
            nothing to commit, working tree clean
            //Git 告訴我們當(dāng)前沒有需要提交的
      
  2. 回溯

    1. git log 歷史記錄

        vi readme.txt //在編輯一次,添加hello
        git add readme.txt
        git commit -m "add hello to readme.txt"
        git log  //可以看到三次修改
        git log --pretty=oneline // 變換輸出信息的格式
      
    2. 退回到之前的版本

      1. HEAD 最新的提交
        HEAD^ 上一個版本
        HEAD^^上上一個版本
        HEAD~100 往上100個版本

      2. git reset

         git reset --hard HEAD^
         結(jié)果:HEAD is now at b3252f8 change readme.txt
         vi readme.txt //看看txt的內(nèi)容,是否回到上一個版本
         git log  //可以看到 log中已經(jīng)沒有了add hello to readme.txt 的操作
        
      3. 回到未來(add hello to readme.txt這個版本相對于現(xiàn)在來說是未來)

         git reset --hard df854
        

        如果命令行窗口還沒有被關(guān)掉,你就可以順著往上找,找到:df85406fa324d1f9ce8433fbd5916418bd0a424e (HEAD -> master) add hello to readme.txt

        版本號無需寫全,復(fù)制前幾個就可以

        你可以看一下readme.txt的內(nèi)容,看是否成功“穿越”
        4. 在關(guān)掉命令的情況下穿越

        1. git reflog //用來記錄你的每一次命令

           利用git reflog 可以看到每個版本名和操作備注
          
           git reset --hard df854
          

4. git工作區(qū)、暫存區(qū)、版本庫之間的關(guān)系

  1. 區(qū)分三者的關(guān)系

    在初始化git版本庫之后會生成一個隱藏的文件 .git ,可以將該文件理解為git的版本庫 repository,而我們自己建立的項(xiàng)目文件夾即工作區(qū) working directory ,在.git 文件夾里面還有很多文件,其中有一個index 文件 就是暫存區(qū)也可以叫做 stage ,git還為我們自動生成了一個分支master以及指向該分支的指針head

  * git diff 比較的是工作區(qū)和暫存區(qū)的差別
  * git diff --cached 比較的是暫存區(qū)和版本庫的差別
  * git diff HEAD 可以查看工作區(qū)和版本庫的差別          
  1. 撤銷操作 checkout

        git checkout -- readme.txt
    

    命令git checkout -- readme.txt意思就是,把readme.txt文件在工作區(qū)的修改全部撤銷,這里有兩種情況:

    一種是readme.txt自修改后還沒有被放到暫存區(qū),現(xiàn)在,撤銷修改就回到和版本庫一模一樣的狀態(tài);就是把版本庫的數(shù)據(jù)簽出覆蓋本地的文件。

    一種是readme.txt已經(jīng)添加到暫存區(qū)后,又作了修改,現(xiàn)在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。但是如果再次COMMIT那么之前緩存區(qū)的數(shù)據(jù)還是在的,這時候不僅要用緩存區(qū)的數(shù)據(jù)覆蓋工作區(qū)的數(shù)據(jù),同時還要把緩存區(qū)的數(shù)據(jù)清空,如下

        git reset HEAD readme.txt
        //或者
        git reset --hard HEAD
    

    git reset命令既可以回退版本,也可以把暫存區(qū)的修改回退到工作區(qū)。當(dāng)我們用HEAD時,表示最新的版本。
    總之,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)。

  2. 刪除文件

    
    git rm test.txt
    git commit -m "remove test.txt"
    

    用 git rm 來刪除文件,同時還會將這個刪除操作記錄下來;
    用 rm 來刪除文件,僅僅是刪除了物理文件,沒有將其從 git 的記錄中剔除。

    直觀的來講,git rm 刪除過的文件,執(zhí)行 git commit -m "abc" 提交時,會自動將刪除該文件的操作提交上去。

    而用 rm 命令直接刪除的文件,單純執(zhí)行 git commit -m "abc" 提交時,則不會將刪除該文件的操作提交上去,需要在執(zhí)行commit的時候,多加一個-a參數(shù),
    即rm刪除后,需要使用git commit -am "abc"提交才會將刪除文件的操作提交上去。

  3. 忽略特殊文件

    在Git工作區(qū)的根目錄下創(chuàng)建一個特殊的.gitignore文件,然后把要忽略的文件名填進(jìn)去,Git就會自動忽略這些文件。

        # Windows:
        Thumbs.db
        ehthumbs.db
        Desktop.ini
        
        # Python:
        *.py[cod]
        *.so
        *.egg
        *.egg-info
        dist
        build
        
        # My configurations:
        db.ini
        deploy_key_rsa
        *.xml
        *.iml
        
        logs/*
        !.gitkeep
        node_modules/
        bower_components/
        tmp
        .DS_Store
        .idea
    
        .idea/
    
    
    

5. 添加遠(yuǎn)程庫

  1. 在github上新建遠(yuǎn)程庫

  2. 在本地的倉庫下運(yùn)行命令:

    ssh

     git remote add origin git@github.com:自己GitHub賬戶名/你要提交的庫名.git 
    

    https

     git remote add origin https://github.com/lzhanforgit/test.git
    

    添加之后遠(yuǎn)程庫的名是origin

  3. 把本地庫的所有內(nèi)容推送到遠(yuǎn)程庫上

     git push -u origin master
    

    由于遠(yuǎn)程庫是空的,我們第一次推送master分支時,加上了-u參數(shù),Git不但會把本地的master分支內(nèi)容推送的遠(yuǎn)程新的master分支,還會把本地的master分支和遠(yuǎn)程的master分支關(guān)聯(lián)起來,在以后的推送或者拉取時就可以簡化命令。

  4. 從現(xiàn)在起,只要本地作了提交,就可以通過命令: git push origin master

  5. 遠(yuǎn)程倉庫管理

    1. 查看遠(yuǎn)程倉庫

       git remote
       git remote show origin
      

      你也可以指定選項(xiàng) -v,會顯示需要讀寫遠(yuǎn)程倉庫使用的 Git 保存的簡寫與其對應(yīng)的 URL。

      $ git remote -v
      origin https://github.com/schacon/ticgit (fetch)
      origin https://github.com/schacon/ticgit (push)

    2. 遠(yuǎn)程倉庫重名

       git remote rename pb paul
      
    3. 刪除遠(yuǎn)程倉庫

       git remote rm paul
      
    4. git fetch

        git fetch origin //抓取遠(yuǎn)程master分支
      
    5. git merge

      合并遠(yuǎn)程分支到本地分支

    6. git fetch+git merge=git pull origin

    參考鏈接

  6. 可能會出現(xiàn)SSH警告 yes就可以了

    // 當(dāng)前在那個目錄下,就提交哪個
    // git remote remove origin 刪除鏈接

從遠(yuǎn)程庫克隆

  1. git clone git@github.com:自己GitHub賬戶名/庫名.git
  2. git clone https://github.com/自己GitHub賬戶名/庫名.git

創(chuàng)建與合并分支

  1. git checkout -b dev //-b參數(shù)表示創(chuàng)建并切換 分支名叫dev
    = git branch dev
    git checkout dev

  2. git branch //查看當(dāng)前分支

  3. git checkout master //切換回master分支

  4. git merge dev // 合并分支

  5. git branch -d dev //合并之后刪除分支

  6. git merge --no-ff -m "merge with no-ff" dev //強(qiáng)制禁用Fast forward模式,從分支歷史上就可以看出分支信息

  7. git stash //把當(dāng)前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作


git fetch和git pull

  • git fetch和git pull
git fetch和git pull都可以將遠(yuǎn)端倉庫更新至本地那么他們之間有何區(qū)別?想要弄清楚這個問題有有幾個概念不得不提。

* FETCH_HEAD: 是一個版本鏈接,記錄在本地的一個文件中,指向著目前已經(jīng)從遠(yuǎn)程倉庫取下來的分支的末端版本。 
* commit-id:在每次本地工作完成后,都會做一個git commit 操作來保存當(dāng)前工作到本地的repo, 此時會產(chǎn)生一個commit-id,這是一個能唯一標(biāo)識一個版本的序列號。 在使用git push后,這個序列號還會同步到遠(yuǎn)程倉庫。

1. 有了以上的概念再來說說git fetch 

    git fetch:這將更新git remote 中所有的遠(yuǎn)程倉庫所包含分支的最新commit-id, 將其記錄到.git/FETCH_HEAD文件中 

    git fetch更新遠(yuǎn)程倉庫的方式如下:

        git fetch origin master:tmp 
        //在本地新建一個temp分支,并將遠(yuǎn)程origin倉庫的master分支代碼下載到本地temp分支
        git diff tmp 
        //來比較本地代碼與剛剛從遠(yuǎn)程下載下來的代碼的區(qū)別
        git merge tmp
        //合并temp分支到本地的master分支
        git branch -d temp
        //如果不想保留temp分支 可以用這步刪除

    1. 如果直接使用git fetch,則步驟如下:

        創(chuàng)建并更新本 地遠(yuǎn)程分支。即創(chuàng)建并更新origin/xxx 分支,拉取代碼到origin/xxx分支上。
        在FETCH_HEAD中設(shè)定當(dāng)前分支-origin/當(dāng)前分支對應(yīng),如直接到時候git merge就可以將origin/abc合并到abc分支上。
    2. git fetch origin 
    
        只是手動指定了要fetch的remote。在不指定分支時通常默認(rèn)為master 
    3. git fetch origin dev 
    
        指定遠(yuǎn)程remote和FETCH_HEAD,并且只拉取該分支的提交。

1. git pull 

    首先,基于本地的FETCH_HEAD記錄,比對本地的FETCH_HEAD記錄與遠(yuǎn)程倉庫的版本號,然后git fetch 獲得當(dāng)前指向的遠(yuǎn)程分支的后續(xù)版本的數(shù)據(jù),然后再利用git merge將其與本地的當(dāng)前分支合并。所以可以認(rèn)為git pull是git fetch和git merge兩個步驟的結(jié)合。 
git pull的用法如下:

        git pull <遠(yuǎn)程主機(jī)名> <遠(yuǎn)程分支名>:<本地分支名>
        //取回遠(yuǎn)程主機(jī)某個分支的更新,再與本地的指定分支合并。
總結(jié):

    因此,與git pull相比git fetch相當(dāng)于是從遠(yuǎn)程獲取最新版本到本地,但不會自動merge。如果需要有選擇的合并git fetch是更好的選擇。效果相同時git pull將更為快捷。

6. 在Webstorm中配置Github

  1. 首先你得有一個Github的賬號.

  2. 點(diǎn)擊Webstorm設(shè)置

  3. 進(jìn)入設(shè)置面板后,直接在左上角搜索github(這個也算是Webstorm方便功能之一,很快速定位設(shè)置項(xiàng)),
    然后填入你github的賬戶名和密碼,然后按一下Test看看是否連接成功.如果成功會跳出connection success!對話框。

  4. 成功連接后,你就已經(jīng)登錄到Github賬戶了,但這還不夠,你還得讓W(xué)ebstorm能夠支持到Git操作,那么我們首先先去https://code.google.com/p/msysgit/downloads/list下載Git,
    安裝后,在Webstorm中查找Git,然后配置好到Git的安裝目錄

    驗(yàn)證是否成功,輸入命令行。輸出git版本表示git安裝成功。

      git --version
    

    在本地git中添加你得git賬戶和郵箱,用于每次提交時記日志(log)

      git config --global user.name "你的注冊用戶名"
      git config --global user.emall "你的注冊郵箱"
    
  5. 配置好后還不夠,因?yàn)檫\(yùn)行Git需要本機(jī)的SSH,SSH的作用是讓本地版本庫與遠(yuǎn)程版本庫通信,也就是你在本地修改好的代碼,需要同步到服務(wù)器上的時候,就需要這個SSH密鑰來通訊,那么我們先找到Git的安裝目錄中的“Git Bash.vbs”.

    在MAC系統(tǒng)下,.ssh目錄是隱藏文件。
    默認(rèn)目錄在'用戶/當(dāng)前系統(tǒng)用戶名/.ssh'

    打開terminal.app

      $ open ~/.ssh  
    
  6. 檢驗(yàn)是否存在.ssh目錄

    cd ~/.ssh

    如果出現(xiàn)"No such file or directory",表明沒有該目錄。

    *生成秘鑰

    ssh-keygen -t rsa -C "macbookpro"
    //命令要求輸入密碼,不用輸,三個回車即可。

    //執(zhí)行成功后,會在主目錄.ssh路徑下生成兩個文件:
    //id_rsa私鑰文件;id_rsa.pub公鑰文件;

    成功后,找到你的用戶目錄下的C:\Users\你的計(jì)算機(jī)用戶名.ssh\id_rsa.pub,
    用記事本打開,并復(fù)制里面的SSH碼

  7. 配置github.com的SSH

    打開https://github.com/settings/profile,點(diǎn)擊 SSH&GPG keys.
    點(diǎn)擊 New SSH keys.標(biāo)題隨便寫。把id_rsa.pub里面的代碼粘貼進(jìn)去。

  8. 在Webstorm中使用Github

  9. 鏈接github數(shù)據(jù)倉庫

    webstorm 菜單點(diǎn)擊 "VCS/checkout from version controll/git"

    輸入url,本地目錄后,點(diǎn)擊clone

  10. 當(dāng)你在文件夾中添加文件時,文件會在左側(cè)的項(xiàng)目管理面板中顯示為紅色,說明這個文件是在原有的Github項(xiàng)目中沒有的

  11. 將這個文件先add到本地github庫中

  12. commit

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

相關(guān)閱讀更多精彩內(nèi)容

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