Git && Github的基本使用教程

鄭亞軍發表於2017-01-25

Git幾乎是我們在學習期間都會用到的一個分散式版本控制軟體,這給我們提供了極大的便利,也十分符合現在的開源精神,所以,作為一個計算機的學習者,掌握Git的基本用法幾乎時百利而無一害。而這篇文章則主要記錄一些基本操作,但是這些基本操作在日常使用中幾乎時完全足夠了。

基於本地的Git管理

    • 建立本地的版本庫

        $ mkdir testGit     # 建立工作資料夾
        $ cd testGit        # 進入該資料夾
        $ pwd               # 檢視當前路徑
        /e/GitRepository/test/testGit
        
        $ git init          # 通過該命令把當前目錄變成Git可以管理的倉庫

      通過執行git init命令,就把所建立的testGit目錄變成了一個git版本庫,此時目錄下會多出一個.git目錄,該目錄用來管理版本庫,不要輕易修改

    • 新增檔案至暫存區

      $ touch example.txt    # 建立一個txt檔案
      $ git add  example     # 將該檔案加入到暫存區

      Tip:在git中,工作目錄暫存區HEAD是幾個很重要的概念,與之相對應的檔案狀態分別為未跟蹤已跟蹤,其中,已跟蹤的檔案狀態又分為:未修改,已修改,已暫存,在本文最後會詳細說明。

    • 提交檔案至HEAD

        $ git commit example.txt -m "備註資訊xxx"    # 將暫存區的檔案提交到HEAD,[-m]為提交備註
        $ git commit --amend -m "新備註xxx" # 修改前一次的備註
      
    • 檢視工作區狀態

      $ git status
    • 檢視日誌

      $ git log
      $ git log --graph --pretty=oneline --abbrev-commit # 以圖形化顯示日誌
      
    • 移除

      $ rm example.txt        # 只移除工作區檔案,需要重新add -- commit
      $ git rm example.txt    # 同時移除工作區和已暫存檔案
    • 撤銷

      $ git checkout --example.txt # 在未提交至暫存區時,撤銷前一次工作區的修改
      $ git reset HEAD example.txt # 撤銷前一次新增至暫存區的檔案,回到未跟蹤狀態 
    • 忽略檔案
      未暫存的檔案或者未提交的檔案,使用狀態查詢的時候系統會頻繁提示,如果有一些檔案是你想要忽略的檔案,比如.tmp檔案,可以採用如下方式新增至忽略檔案中。

      $ vim .gitignore #在該版本庫下建立gitignore檔案
        *.tmp #採用正規表示式,過濾掉你要忽略的內容,如前表示過濾掉所有.tmp檔案
    • 版本回退

      $ git reset --hard HEAD # HEAD表示當前,HEAD^表示前一個,HEAD^^表示前前一個,也可以用HEAD~2表示前前個,以此類推。
      $ git log
      commit 6a593658be7db38e919931d19d3a96946b4281ba
      Author: zhengyajun <zhengyajun_email@163.com>
      Date:   Sun Jan 22 10:57:33 2017 +0800
       
      $ git reset --hard 6a593 # 這是另一種方法,6a593是上述log檔案中id前幾位

      如果再你回退到哪個版本後,後悔了,可以採用如下方式追回:

      $ git reflog  # 檢視你最近對版本庫的操作,裡面有記錄版本號
      $ git reset --hard xxx # 同上一樣回退至指定版本
    • 分支的建立

      $ git checkout -b testBranch # 建立並切換至分支testBranch
      
      $ git branch testBranch      # 建立分支testBranch
      $ git checkout testBranch    # 切換至分支testBranch
      $ git branch                 # 檢視當前分支,當前分支帶有星號
    • 分支的合併

       $ git merge testBranch       # 預設採用快速合併的方式(只有指標移動,不記錄)
       $ git merge -no-ff -m "備註資訊xxx" # 不採用快速合併的方式   
    • 分支的刪除

       $ git branch -d testBranch

      TIP:在進行分支合併時,如果你分別對兩個需要被合併的分支都進行了修改,那麼在合併時就會提示衝突,而此時用git statu也可以看到衝突狀態,解決衝突的辦法是用任意編輯器開啟衝突檔案,檔案衝突部位會顯示<<<<<<<; ======= ;>>>>>>>.這幾種符號,分別代表兩個分支的不同內容,根據需要手動修改,去掉符號,之後手動add => commit,提交合並即可成功。這樣的衝突合併可以用$ git log –graph –pretty=oneline –abbrev-commit檢視到。

    • 掛起和恢復

      git提供一個功能,在工作未完成又不想提交時(以免為自己或者協作者埋雷),可以採用如下命令,將目前的工作環境 “掛起”,等忙完以後再回到該分支繼續工作。

      $ git stash             # 掛起工作環境
      $ git stash list        # 檢視被掛起的工作
      $ git stash apply       # 恢復但是不刪除stash,還可以檢視
      $ git stash pop         # 恢復並刪除
      $ git stash apply/pop stash@{0} #恢復list中的指定stash@{0}
    • 建立和管理標籤
      前面有提到的commit id是一串經過雜湊演算法算出的156位的十六進位制,儘管我們可以使用前幾位代替,但是,當你的版本庫裡面擁有眾多的檔案時,你還是希望有更簡單的表示方法,git提供了很方便的標籤操作,標籤預設打在你當前所在分支的最新commit上面:

      $ git tag v1.0 # 建立一個名字叫v1.0的標籤
      $ git tag      # 檢視

      如果要為之前的commit版本打標籤,則可以在後面加上對應版本的commit id:

      $ git tag v0.1 6a593 # 為commit id為6a593開頭的版本打上標籤v0.1
      $ git tag -a v0.1 -m "備註資訊" 6a593 # 新增明文備註,同前
      $ git tag -s v0.1 -m "備註資訊" 6a593 # 新增密文備註【PGP加密】

      刪除標籤:

      $ git tag -d tag_name # 刪除標籤
    • 配置別名
      雖然在git中我們可以使用tab鍵進行補全,但是,對於一些常用命令,我們還是會希望輸入簡略字母就可以,比如branch只輸入br:

        $ git config --global alias.br branch # global表示全域性有效,不加僅對當前倉庫有效

      每個倉庫的Git配置檔案放在.git/config檔案中,使用者的配置檔案在使用者主目錄下的.gitconfig檔案中,可以通過修改配置檔案來修改或者刪除。

      基於遠端的Git管理

    • 新增和移除遠端庫:

      $ git remote     # 檢視當前庫的遠端倉庫,本地庫預設無,從遠端克隆的庫預設為origin
      $ git remote -v # 檢視遠端倉庫的詳細資訊 
      $ git remote add [Remote_name] https://github.com/zhengyajun/test.git # []內為名字,任取。
      # git支援多種協議,推薦使用https,ssh需要額外配置,會在後文提到。
    • 從遠端克隆版本庫:

      $ git clone https://github.com/zhengyajun/test.git  # 同上,github提供ssh和https,初學推薦https
    • 從遠端抓取資料:

      $ git fetch [Remote_name] [Branch_name]     # []內為要抓取的遠端主機名,預設origin,只抓取不合並,此時以分支‘origin/master’呈現
      $ git checkout -b newBranch origin/master    # 利用抓取的資料構建一個新的分支
      $ git merge origin/master                     # 在本地分支上合併遠端分支,以遠端庫為origin為示例,以下同
      $ git rebase origin/master                    # 功能同merge,不同在於不記錄分支的改變
      $ git pull [Remote_name] [Branch_name]         # 抓取並自動合併檔案
    • 向遠端推送資料:

      $ git push -u [Remote_name] [Branch_name]     # 選擇推送的遠端主機和分支,第一次推送時加上引數[-u]會自動關聯本地和遠端的分支,方便後續使用
                                                  # 推送的前提是你對遠端庫擁有寫許可權
    • 遠端推送標籤:

      $ git push origin v1.0    # 推送某一個標籤
      $ git push origin -tags    # 推送全部標籤
    • 遠端刪除標籤

      $ git push origin:refs/tags/v0.9 # 刪除標籤v0.9

    文中提到的幾個基本概念和命令

    • Git中的幾個基本操作:

      `基於linux:`
      
      $ cd xxx        # 切換至xxx目錄,一般使用路徑指示,常用: .表示當前目錄;..表示上一級目錄;~家目錄;-前一工作目錄;/根目錄
      $ ls -al    # -al表示顯示當前目錄所有檔案,包括隱藏檔案
      $ mkdir xxx    # 建立xxx目錄
      $ rmdir xxx     # 刪除xxx目錄
      $ rm xxx        # 刪除xxx檔案
      $ vim    xxx    # 文字編輯器
      $ touch xxx # 建立一個xxx空檔案 
      $ grep “xx” fileName # 在fileName中尋找xx,並顯示該行
      $ cat xxx    # 文字編輯器和檢視器,主要用於檢視
      $ head -n 3 fileName # 檢視fileName的前三行 == cat fileName | head -n 3
      $ tail -n 3 fileName # 檢視fileName的後三行 == cat fileName | tail -n 3
      # 更多命令請自行百度
      
      `基於windows:`
      $ echo .>test.txt # 建立一個test.txt檔案
      $ echo xxx > test.txt # 在test.txt覆蓋寫入xxx
      $ echo xxx >> test.txt # 在test.txt追加寫入xxx
      $ clip<abc/e/xxx.txt    # 複製xxx.txt檔案
      $ dir # 同linux ls
      $ notepad xxx # 用預設的文字編輯工具開啟xxx,通常是記事本,不建議使用,建議使用vim
    • ssh配置:

      $ git config --global user.name "xxx"        # 設定使用者名稱
      $ git config --global user.email xxx@xx.com    # 設定郵箱,同你github網站上的郵箱:https://github.com
      $ ssh -keygen -t rsa -C "xxx@xx.com"         # 引數[-t]表示選擇加密方式,[-C]表示備註資訊
      `生成的檔案會在~/.ssh中,我們需要複製其中的id_rsa_pub,可以用記事本開啟或者直接複製`
      $ clip<~/.ssh/id_rsa_pub
      複製後,登陸Github網站,右上角設定中 => 新增ssh => 貼上id_rsa_pub,成功即可完成ssh配對。
    • 工作區,暫存區,HEAD以及未跟蹤,已跟蹤(未修改,已修改,已暫存)

      工作區就是我們在未進行git操作的環境,通過`add`操作,把工作目錄的檔案新增至暫存區(index/stage),而我們通過`commit`把暫存區的檔案提交至HEAD
      而檔案的型別是:我們把未新增至暫存區的檔案狀態稱為`未跟蹤`狀態,新增以後則是`已跟蹤`。已跟蹤的狀態分為:未修改,已修改,已暫存,這個不做過多敘述。
      關於這一部分的概念網上有很多圖解,如果有不明白,百度會一看就明,這是很重要的概念,一定要理解。
    • 指標

      Git的速度之所以很快,很大程度取決於它是記錄修改而不是記錄檔案,所謂的記錄修改,很多是用指標來完成的
      HEAD其實是一個指向master的最新commit的指標,當有新提交時,便指向最新commit,同理,在分支切換中也是同理,都是指標的變動,所以,當兩個分支都變動時,合併會衝突,因為不能簡單的通過指標的變動來完成,需要手動解決。
      

    相關文章