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