Git v2.9.0 釋出

台灣時間  6 / 14 號早上8點左右釋出的新版本,官方 Windows 的 binary release 在中午為止看起來都還停留在 v2.8.4,Mac 甚至還停留在 v2.8.1,而 FreeBSD 的 ports 目前也還沒看到更新,但如果是 Ubuntu 或是基於 Ubuntu 的 GNU/Linux 發行版,只要透過官方的 PPA 就可以直接升上去了。(可以參考 Ubuntu 上的 PPA 整理)

除了每次版本更新都必備的修 bug 以外,這次沒看到明顯跟效能提升有關的更新,背後實作的部份太瑣碎就先不琢磨,列舉依些對使用上有直接影響的更新:

  • Shell 的 auto-completion 更新
    (就是你打命令要按 tab 把剩下字補完的功能)
    • 目前看起來還是缺不少指令,不過有更新總比沒有好 …
  • git rebase -x 現在不需要加 -i 參數就可以直接使用了
    • (rebase 的時候針對每個 commit 跑測試的功能)
    • 省下了一些瑣碎的步驟/時間,畢竟不是每個人都需要 interactive 的互動操作
    • 之前的版本不加 -i 就會不讓你跑,然後出現錯誤訊息:
      • The --exec option must be used with the --interactive option
  • 可以自行指定 hooks 的位置
    (將一些事件和行為進行連結達到自動化的功能)
    • 先前都是放在 .git/hooks,可以指定之後應該某些專案就可以共用 hooks 了,或許可能就會有人性質相同專案會用到的 hooks 也可以打包成專案釋出?複雜一點的話就是偵測專案性質用比較 general 的方式跑簡單的檢查,syntax check / lint 之類的
      core.hooksPath
  • git commit 現在會吃 verbose 的設定,就不用在命令後面加參數了
    (顯示更詳細的資訊輸出)
    git config commit.verbose true
  • git clone 現在可以直接 shallow clone submodule 了
    (clone 的時候不要 clone 整個改版歷史,可以有效減少空間跟頻寬消耗跟提升速度)
    git clone --shallow-submodules
  • git diff / log 預設啟用自動偵測檔名變更
    (區別 “檔名變更” 和 “刪除一個舊檔案再寫一個新檔案” 的不同)
    • 可以透過設定來停用
      git config diff.renames false
  • 預設禁止沒有共同祖先的分支合併
    • 可以避免一些錯誤的操作
  • git log 的 commit message 縮排預設用 4 個 spaces 來展開 tab
    • 不知道是不是我沒讀懂或哪邊有問題,目前看起來還是8個空白的長度
    • 可以透過參數來取消這功能
      git log --no-expand-tabs

GitHub 上面寫的介紹也有提到像是從 git v2.8 開始支援平行化下載 submodule 的設定: --jobs=4,原先只有在 git fetch 的時候才能用

git fetch --recurse-submodules --jobs=4

那現在 clone 或是 submodule update 都能使用了

git clone --recurse-submodules --jobs=4
git submodule update --jobs=4

也可以乾脆就把這個設定寫進 config 裏面一勞永逸:

git config submodule.fetchJobs true

不過以上這些都不是我個人覺得這次更新裏面最有用的更新,這次對我來說最棒的更新、或說新功能,是 diff 顯示的方式,這應該是一個全新的功能,還在實驗階段,目前看起來可以帶入所有要顯示 diff 的命令,例如 show, log, diff 等等的,使用方式為直接在命令後面帶入參數:--compaction-heuristic
或是直接寫進設定檔:

git config diff.compactionHeuristic true

主要的差異在於,原先 git 只考量前後差異,diff 的區塊會從前後開始分歧的地方開始顯示,不利於程式碼差異閱讀

舉例來說,我把一段 shell script 做一點修改,原始的長這樣:

for a in {0..100};
do
    echo HelloWord
    echo $a
done

for a in {0..100};
do
    echo HelloWordX
    echo $a
done

修改後長這樣:

for a in {0..100};
do
    echo HelloWord
    echo $a
done

for a in {0..100};
do
    echo HelloWord
    echo $a
done

for a in {0..100};
do
    echo HelloWordX
    echo $a
done

差異在於我在上方加了一個迴圈,而裡面的 echo 是 HelloWord 不是 HelloWordX

原先的 diff 顯示方式會是這樣:

diff --git a/sample.sh b/sample.sh
index df4a68e..2b07c13 100755
--- a/sample.sh
+++ b/sample.sh
@@ -16,6 +16,12 @@ done

for a in {0..100};
do
+   echo HelloWord
+   echo $a
+done
+
+for a in {0..100};
+do
    echo HelloWordX
    echo $a
done

最簡單從差異開始的地方進行標記,但這有一定程度的閱讀困擾,畢竟那不是我們真正的修改方式,應該沒有人寫程式要加迴圈或函式是先將原先的截斷後在中間寫對吧?

啟用 compaction-heuristic 後的 diff 顯示結果:

diff --git a/sample.sh b/sample.sh
index df4a68e..2b07c13 100755
--- a/sample.sh
+++ b/sample.sh
@@ -14,6 +14,12 @@ do
echo $a
done

+for a in {0..100};
+do
+   echo HelloWord
+   echo $a
+done
+
for a in {0..100};
do
    echo HelloWordX

git 現在很聰明的試圖透過空行來區隔且保留大區塊的文字片斷,把整個認定為差異的區域向上移,這樣讀起來就合理多了,真的是很棒的功能!

其他詳細資訊可以參考官方的釋出文件以及 GitHub 寫的介紹

Release notes:
https://raw.githubusercontent.com/git/git/master/Documentation/RelNotes/2.9.0.txt

GitHub 寫的介紹:
https://github.com/blog/2188-git-2-9-has-been-released

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。