iT邦幫忙

1

自我筆記 - Git 日常使用

Git 基礎篇

人生不能重來,但Git可以

什麼是git ?

  • 分散式版本控制
  • 使用 SHA1 雜湊演算法
  • 只在乎檔案內容,不在乎目錄

基礎概念

當執行 git init 初始化指令後,會在該資料夾下面新增一個 .git 的資料夾,該資料夾就是 Git Repository 的本體所在。其中包含 blob objects, branch, remote, config 設定檔等。.git 儲存了 Git 所有資訊。在 Local 端對 Git 的所有操作,也都是反映在這個資料夾中。

.git 內包含幾個部分

  • HEAD - 目前所在的 branch。
  • config - 該 Git 資料夾的區域設定檔。
  • index - 資料暫存區
  • objects (如下圖所示) - Git 所有資料的 blob objects 儲存處,主要包含三種類型
    • commit objects - 每筆 commit 的資訊,包含 author, parent commit
      object, commit message 以及所指向的 tree object 資訊。
    • tree objects - 記錄資料夾的檔案結構,包含檔案的路徑,名稱,模式以及對應的 blob objects。
    • blob objects - 記錄實際檔案物件的二進位內容。

當我們每次進行 branch 切換時,

  1. Git 會去 objects 資料夾中找出該 branch 對應的 commit object
  2. 從 commit object 中取得對應的 tree object 後
  3. 再由 tree object 所記錄的檔案結構將資料夾回復到該 branch 所對應的狀態
    https://ithelp.ithome.com.tw/upload/images/20210721/20132538wXm35SdmJv.png

基本 Action

在git中最常用的指令

  • git clone <url> : 將遠端數據庫克隆一份至本地
  • git add : 將檔案加入至暫存區域
  • git commit : 將存於暫存區域的檔案提交到本地儲存庫
  • git push origin <branchName> : 推至遠端數據庫
  • git pull origin <branchName> : 將遠端數據庫與本地分支同步
  • git checkout <branchName> : 在本地分支切換(連動工作目錄,如基礎概念所示)

commit 重點在於讓協同夥伴了解做了那些改變

Why ? 為了甚麼而做,可能是使用者提了什麼需求、發現了那些BUG...
What ? 做了什麼
How ? 如何做
https://ithelp.ithome.com.tw/upload/images/20210721/20132538Ys6B699jIk.png


狀況題記錄

如何修改 commit 紀錄

  • 修改 commit 訊息
    註記: 新的commit會更改SHA-1值
    • 修改 最新一筆 紀錄:
      git commit --amend -m "新訊息"
      
    • 修改其他歷史紀錄:
      git rebase -i <須回朔的範圍SHA-1值>
      
      跳出 Vim 編輯器:
        pick ec327e4 emcs 功能開啟
        pick d3f0b4a emcs 功能初版
        pick 5b72b9e sqc 功能新增
        pick b5ba78a sqc first commit
      
      說明:
      這裡的pick代表保留這次的commit,不做修改,將以上改為 ↓
      reword代表改變這次的commit,可用 r 簡寫
        reword ec327e4 emcs 功能開啟
        reword d3f0b4a emcs 功能初版
        pick 5b72b9e sqc 功能新增
        pick b5ba78a sqc first commit
      
      上面選擇修正兩項commit訊息,按下儲存離開後,會再跳出vim介面即可修改內容,如下
        ee6e6d6 sqc 功能新增
        8c2b80f emcs 功能初版(commit修正)
        31726f3 emcs 功能開啟(commit修正)
        1507b8b Initial commit
      

穿梭各版本

  • git reflog 查看所有紀錄

  • git log --oneline -n 可以查看目前所在分支前 n 次的commit紀錄

  • 使用 reset

    • mixed是預設的參數,Commit 拆出來的檔案會被丟回工作目錄。
    • soft 模式,Commit 拆出來的檔案會直接放在暫存區。
    • hard 模式,Commit 拆出來的檔案,不管是工作目錄以及暫存區的檔案都會丟掉。
      • git reset --hard HEAD 回復到最新提交版本
      • git reset --hard HEAD~ 等於 ~1 回復到上一個提交版本
      • git reset --hard HEAD~n n 等於往上第幾個提交版本 回復之前指定的提交版
        (也可以使用SHA-1值)
  • 使用 revert

    • git revert HEAD
      會新增一個 Commit 來反轉(或説取消)另一個 Commit 的內容,
      原本的 Commit 依舊還是會保留在歷史紀錄中。
      雖然會因此而增加 Commit 數,但通常比較適用於已經推出去的 Commit
      或是不允許使用 Reset 或 Rebase 之修改歷史紀錄的指令的場合。
  • "遠程版本回推"

    • 注意: 該方法因為會修改遠程,所以在使用時必須與同伴溝通好,盡量避免此方法
    1. 先按照上述將本地branchA退回到希望的版本
    2. 在使用 git push -f origin branchA

整理分支

在開發過程中,為了確保主線不被開發過程中的代碼影響,所以我們會開立許多分支(功能),這樣做的好處是可以獨立開發互不影響,但相對的就會有許多支線,相當混亂的狀況,**所以當我們開發完成後,可以先做分支整理**在推至主線上,這樣在查看紀錄時也比較方便。

  • 刪除本地分支: git branch -d <branchName>
  • 刪除遠程分支: git push -d origin <branchName>
  • 合併分支:
    • git rebase
    • git merge

突然要修改別的分支,但手上的分支尚未到一個段落

參考

  • 先進行add、commit(完成後就可以先進行其他分支的工作)
  • 切回未處理完成的分支
  • git reset HEAD^ (reset預設是mixed,所以檔案會被丟回工作區)

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
wrxue
iT邦好手 1 級 ‧ 2021-07-22 17:28:01

請問 Commit 中的 What 與 How 很像,要如何區分,有時候會不知道應該寫在 What 還是 How

我要留言

立即登入留言