Git — 從安裝到操作

Ozzie發表於2019-12-17

本文大致描述了Git的操作過程(Windows實現的,少部分與Linux不同)......


安裝

  1. 在 windows 上安裝 Git:
    • 訪問官網,直接從官網上下載:Git
    • 安裝完成之後,滑鼠右鍵,如果出現了 Git Bash Here,則說明安裝成功
    • 輸入以下內容查閱版本號也可以驗證安裝是否成功
      git --version
  2. 因為 Git 是分散式版本控制系統,所以在安裝之後必須關聯到自己的使用者名稱和郵箱上
    $ git config --global user.name "xxx"
    $ git config --global user.email "xxx@xxx.com"
    • 注意:git config 命令的 --global 參數列示的是,你這臺電腦上,所有的Git倉庫都會使用這個配置,
      當然,你也可以對某個倉庫指定特定的使用者名稱和郵箱,即:
      $ git config user.name "xxx"
      $ git config user.email "xxx"
  3. 檢視與修改:
    • 檢視使用者名稱與郵箱
      $ git config user.name
      $ git config user.email
    • 修改使用者名稱與郵箱其實與建立時的操作一樣的,可以想象成你建立的新使用者名稱以及郵箱覆蓋掉了之前的

建立版本庫

  1. 版本庫倉庫,倉庫裡面的所有檔案都由Git管理,Git能跟蹤每個檔案的更、刪、改,以便隨時還原到某個時刻
  2. 建立版本庫方法:
    • 建立一個新資料夾,比如我在桌面新建一個 project(在Windows系統中請保持英文名稱,以免出現莫名其妙的錯誤)
    • 然後:右鍵 -> 選擇 Git Bush here
    • 輸入 git init,即可把這個資料夾變為Git可以管理的倉庫
    • 當然,現在還只是一個“看起來為空的倉庫”,其實,建立成功之後,會在該倉庫中生成一個隱藏的資料夾:.git資料夾
    • 現在我們來用cmd看一下這個.git資料夾裡面有什麼:
      • 在對應的資料夾路徑下面,輸入 dir/a:h,檢視隱藏檔案
      • 輸入 cd .git,進入對應的 .git 檔案目錄下面
      • 輸入 dir,看裡面的檔案
    • 需要注意的是,這個 .git 目錄是Git用來跟蹤管理版本庫的,emm,不要碰為好

把檔案新增到版本庫

假設現在我們在上述的版本庫 project 下新增一個名為 first.txt,內容為My first text 的檔案。

  1. 第一步:用 git add 新增檔案
    • 新建檔案 first.txt,內容為 My first text
    • project路徑下輸入命令:
      $ git add first.txt
    • 如果沒有任何提示,這個過程就默默地結束了,那麼恭喜你,成功了,Unix的哲學是“沒有訊息就是好訊息”
    • 注:git add 後面可以跟多個檔案,甚至是不同型別的檔案,如:
      $ git add a.txt b.doc
    • 而下面提到的 git commit -m "xxx" 一次性可提交多個檔案
  2. 第二步:用 git commit -m "xxx" 把檔案提交到倉庫
    $ git commit -m "xxx"
    • 注:未報錯即為提交成功,這裡引號內的內容是對這次提交的註釋,即對本次提交的說明
    • 只用git commit -m會報錯:error: switch 'm' requires a value,因此,強烈建議寫上有意義的內容,這對閱讀者更友好

穿梭過去,回到未來

  1. 我們已經學會了新增和提交,其實commit就像一個快照一樣,一旦你把檔案改亂了,或者誤刪了檔案,還可以從最近的一個commit恢復,然後繼續工作,而不是把幾個月的工作成果全部丟失
  2. 實際生活中,我們也不可能把每次的修改都記住,當然,這一點在Git上面完美解決了,我們可以用git log檢視我們的歷史記錄:
    $ git log
    • git log命令顯示從最近到最遠的提交日誌
    • 如果嫌輸出資訊太多,看得眼花繚亂的,可以試試加上--pretty=oneline引數:
      $ git log --pretty=oneline
    • 注:那一大串的字元,其實是commit id(版本號),每提交一個新版本,實際上Git就會把它們自動串成一條時間線
  3. 現在呢,我們啟動時光穿梭機,準備把first.txt回退到上一個版本,怎麼做呢?
    • 首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,用HEAD^就表示上一個版本,HEAD^^表示上上個版本,以此類推
    • 其實,git reset命令可以做到:
      $ git reset --hard HEAD^
      • 注:當然,還可以繼續回退哈
  4. 現在應該被還原了,我們用git log檢視現在版本庫的狀態,細心點會發現,怎麼沒有了最後的版本呢?那豈不是我只能回去不能回來?
    • 其實辦法是有的,如果你的命令視窗沒有關閉的話,你可以在回退之前找到那個最後的版本,比如我這裡是dca7d8f1f6d06405f7395712f17d1c83a410cf82
    • 然後,我只需要git reset到那個版本去即可:
      $ git reset --hard dca7
    • 注:hard後面跟的是版本號,這裡的版本號不需要寫全,Git會自動尋找(當然也不能只寫前面一兩個字母,以免多個版本號無法確定是哪一個)
  5. Git的版本回退速度非常快,因為Git在內部有個指向當前版本的HEAD指標,當你回退版本的時候,Git僅僅是把HEAD從指向你指定的版本號
  6. 現在,你回退到了某個版本,但是關閉了電腦,開啟電腦之後想恢復到新版本怎麼辦?找不到新版本的commit id怎麼辦?
    • Git提供了一個命令git reflog用來記錄你的每一次命令:
      $ git reflog
    • 現在找到了版本號,就可以穿梭到過去未來啦

檢視狀態與追蹤修改

  1. 之前我們已經成功地新增並提交了一個first.txt檔案,現在,我們對該檔案做一些修改,但是我們並不著急提交到Git上去
  2. 我們嘗試著在命令列裡面輸入
    $ git status
  3. 情況如下:
  4. git status告訴我們:first.txt被修改了,但是這個修改之後的檔案並未提交
  5. 那麼如何檢視修改的具體情況呢?答案是git diff
    $ git diff first.txt
  6. 那麼,現在我們重新刷一遍流程:
    • git add first.txt新增修改後的檔案(先新增才能提交,否則會報錯)
    • git commit -m "..."提交修改後的檔案
    • git status檢視狀態

工作區和暫存區

  1. 什麼是工作區?
    • 工作區就是你能看到的目錄
  2. 前面提到過,.git是Git的版本庫,Git版本庫中存放了很多東西,其中最重要的就是:
    • 暫存區:stage(有時也把暫存區叫做索引,所以暫存區也叫index)
    • Git自動建立的一個分支:master
    • 指向 master 的一個指標:HEAD
  3. 下面這幅圖表示了工作區、暫存區之間的關係:
    • 左側為工作區,右側為版本庫,在版本庫中標記為 index 的區域是暫存區,標記為 master 的是master分支所代表的目錄樹
    • 此時 HEAD 實際是指向 master 分支的一個"遊標"。所以圖示的命令中出現HEAD的地方可以用master來替換
    • 圖中的 objects 標識的區域為 Git的物件庫,實際位於 ".git/objects" 目錄下,裡面包含了建立的各種物件及內容
  4. stagegit add,git commit的聯絡:
    • 前面的git add用來新增檔案,實際上就是把檔案新增到暫存區,同時,工作區修改(或新增)的檔案內容被寫入到物件庫中的一個新的物件中,而該物件的ID被記錄在暫存區的檔案索引中
    • 之後的git commit用來提交檔案,實際上就是把暫存區中的內容提交到當前分支,暫存區的目錄樹寫到版本庫(物件庫)中,master 分支會做相應的更新
    • 由於Git自動建立了一個分支:master,所以現在git commit就是往master分支上提交更改
    • 可以簡單理解為,需要提交的檔案修改全部放到暫存區,然後,一次性提交暫存區的所有修改

管理修改

  1. 為什麼Git比其他版本控制系統設計得優秀?因為Git跟蹤並管理的是修改,而非檔案,跟著下面體會一下吧:
  2. 現在我們修改一下first.txt,隨便為其新增一行this is new
  3. 然後,我們用git add first.txt新增,再用git status檢視:
  4. 現在我們再次修改檔案,我們再新增一行this is new new
  5. 我們用cat first.txt來檢視一下這個檔案的內容:
  6. 現在我們用 git commit -m 提交一下:
    • 為什麼會顯示沒有修改呢?
  7. 我們回顧一下流程:第一次修改 -> git add -> 第二次修改 -> git commit
    • 因為Git管理的是修改而非檔案
    • 當你用git add命令後,在工作區的第一次修改被放入暫存區,準備提交,但是工作區的第二次修改並未放到暫存區
    • git commit只負責提交暫存區的修改,所以只提交了第一次的修改

撤銷修改

  1. 現在,我們新增一行:This line is about to be revoked
  2. 我們當然可以在退出前手動刪除,但是退出之後呢?
  3. 我們先用git status檢視一下:
    • 現在的情況是,我在工作區修改了檔案,但是我還沒有提交到git上面去,我想通過git來撤銷這個修改
  4. 好的,那麼,試試這個命令:
    $ git checkout -- first.txt
    • 再用cat first.txt檢視一下檔案內容,是不是驚奇地發現,我才新增的一行內容被撤銷了...
    • 注意:git checkout -- file中的--非常重要,如果沒有--,就變成了切換到另一個分支的命令
  5. 現在,我們嘗試著“過分一點”:我們不僅給檔案新增了一個內容,而且我們還git add操作了
    • 冷靜一下,git status讓我們明白:現在我們只是新增到了暫存區,但是還沒有提交
    • 那我們怎麼撤銷呢?
  6. Git同樣告訴我們,用命令git reset HEAD xxx可以把暫存區的修改撤銷掉(unstage),重新放回工作區:
    $ git reset HEAD first.txt
    • git reset命令既可以回退版本,也可以把暫存區的修改撤銷到工作區
    • git status檢視,可以明白,現在暫存區是乾淨的,工作區有修改
    • 我們再用git checkout -- first.txt丟掉工作區的修改吧,讓這個世界徹底清淨.

刪除檔案

  1. 通常刪除檔案時,直接在檔案管理器中把沒用的檔案刪了,或者用rm命令刪了:
    $ rm first.txt
  2. 我們現在刪除檔案,然後通過git status命令會立刻明白哪些檔案被刪除了:
  3. 現在你有兩個選擇;
    • 一是確實要從版本庫中刪除該檔案,那就用命令git rm刪掉,並且git commit
      $ git rm first.txt
      $ git commit -m "remove first.txt"
    • 二是你刪錯檔案了,但是因為版本庫裡面還有,所以可以很輕鬆地把誤刪的檔案恢復到最新版本:
      $ git checkout -- first.txt
      • git checkout其實是用版本庫裡的版本替換工作區的版本,無論工作區是修改還是刪除,都可以“一鍵還原”
  4. 命令git rm用於刪除一個檔案,如果一個檔案已經被提交到版本庫,那麼你永遠不用擔心誤刪,但是要小心,你只能恢復檔案到最新版本,你會丟失最近一次提交後你修改的內容

原生程式碼上傳到遠端倉庫(GitHub)

這裡我舉例把本地的example資料夾中的所有內容(這裡只有一個index.html)上傳到GitHub倉庫中去

  1. 建立版本庫
    $ git init
  2. 將程式碼上傳到本地的Git倉庫中
    • 首先,我們得清楚的是,我們要做的是將本地的倉庫與遠端的GitHub倉庫關聯起來
    • 那麼,我們必須先把程式碼先上傳到本地的Git倉庫中
    • 前面,我們只是新建了一個Git倉庫,這個倉庫顯然還是空的,那麼,我們現在上傳原生程式碼:
      $ git add index.html
      $ git commit -m "first"
    • 至此,本地工作完畢,接下來操作GitHub的Git倉庫
  3. 在GitHub中建立一個Git倉庫
    • 注:這裡的倉庫名隨意,除了取名外其他項均可不管
    • 成功建立如下:
  4. 其實在建立成功的那一頁,GitHub下面有相關的提示,OK,那麼我們現在根據提示來關聯到GitHub上:
    $ git remote add origin git@github.com:xxx/xxx.git
    • 注:這裡的git@github.com:xxx/xxx.git其實就是你的倉庫的地址
    • 新增後,遠端庫的名字就是origin,這是Git預設的名稱,也可以改成別的,但是origin已是約定俗成吧
  5. 關聯成功之後,就該傳程式碼啦!
    $ git push -u origin master
    • 注:其實git push命令實際上就是把當前的分支master推送到遠端
  6. 可在你的GitHub倉庫中檢視是否上傳成功:(樣例如下)
  7. 我們還差最後一步:將本地內容推送到GitHub上(總不能改一次程式碼就建一個倉庫吧)
    • 很簡單,假設我現在在目錄下做了改動(我對index.html做了改動)
    • 那麼,一條命令即可更新遠方的index.html
      $ git push origin master
  8. 細節
    • 細心的朋友可能會發現,似乎剛才的$ git push origin master只能重新整理index.html,而假如說我在資料夾新建了new.txt,這條命令並不會因此就幫我上傳到GitHub
    • 還記得之前說過的麼?GitHub是被本地Git倉庫關聯的,也就是說,只是新建了new.txt,都沒有傳到本地Git上去,怎麼可能傳到GitHub上去呢?
    • 好吧,不多費口舌了,直接扔答案吧:
      $ git add new.txt
      $ git commit -m "second"
      $ git push origin master

    • 最終,我們成功在GitHub更新了!也就擁有了真正的分散式版本庫!

從遠端庫克隆(略過)


本次部落格先更新到這裡,之後若有需要會再次探討Git世界

相關文章