Git 修改資料夾名稱的做法

同事想要調整 Git repository 的 folder 名稱,以往 SVN 的修改方式就是直接修改資料夾名稱,然後 commit,一切搞定:因為 SVN 是檔案 base 的版控,它可以持續追蹤到修改資料夾名稱,其他一切如故,但 Git 的運作方式不同,這樣的操作對於 Git 就會變成移除檔案再新增檔案的情境,檔案還是會在,但對於 Git 來說檔案已經不是同個檔案了,變成 rename 前的資料夾內容都變成 Missing,rename 後的資料夾內容都是 Not Versioned,當然可以手動刪除 Missing 的檔案及狀態,但這樣的操作既麻煩又沒有意義,我們來看看 Git 中的正確做法

基本情境設定

  1. 在 folder 中建立 test 資料夾
  2. 在 test 建立 1.txt
  3. 依序在 1.txt 中建立幾個版本
  4. 將 test 改名為 test123

直接修改資料夾名稱

  1. 直接在檔案總管中修改資料夾名稱
  2. Git 會將原本資料夾內容標記會 Missing 並將 rename 完的資料夾標記為 Not Versioned

    1renamefolder

透過 Git 修改

  1. 使用指令

    • 指令範例(詳細內容可以參考 git-mv)

      git mv test test123

    • 使用 git status 檢查狀況 –> 正確標記為 renamed

      3gitstatus

  2. 使用 TortoiseGit

    • 資料夾–> 按右鍵 –> TprtoiseGit –> Rename..

      4rightclivk

    • New name

      5newname

    • 正確標記為 Rename

      6rename

關於檔案的修改歷程

  • 不管哪一種修改方式,檔案的修改歷程都會被重設,舊的歷程不會再以個別 commit 顯示(無法使用 diff with previous version)

    • 原檔案歷程

      7commithistroy

    • 新檔案歷程

      2filehistory

  • 可以使用 git blame 看修改歷程

    • 檔案 –> 按右鍵 –> TortoiseGit –> Blame

      10blame

  • 可以使用指令可修改歷程

    • 指令 1

    • 語法

      ```
      git log --follow {file}
      ```
      
    • 範例

      ```
      git log --follow 1.txt
      ```
      

      9gitlog

    • 指令 2

    • 語法

      ```
      gitk --follow {file}
      ```
      
    • 範例

      ```
      gitk --follow 1.txt
      ```
      

      8gitk

參考資訊

  1. git-mv
  2. View the change history of a file using Git versioning
  3. Preserving History When Renaming Files in git