# Git diff 產生檔案差異路徑與差異檔
> 取得檔案差異路徑沒頭緒?
> 版本A與版本B之間到底改了哪些檔案不知道?
> 指令下下去就對了! 🤟
>
###### tags: `git` `git-diff`
## 取得檔案差異路徑
首先以這張圖當範例
<img src="https://cornpic.com/images/2020/09/04/5ULwHlP.png">
假如今天希望取得 04/23 到 05/13 之間所有改動檔案的「路徑」,
該怎麼做呢?
此時我們可以透過以下指令來取得:
```shell=
git diff-tree -r --no-commit-id --name-only --text 97d7faf 5d147f1 > ./diff.txt
```
其中 `97d7faf` 就是 04/23 的 commit id,而 `5d147f1` 就是 05/13 的 commit id。
我們就是==將這兩個 commit id 之間所有的檔案做比對==,然後把差異檔的路徑給轉成 diff.txt。
實際 diff.txt 內容如下
```bash=
"sql/HelloWorld\350\262\274\346\250\231\350\250\255\345\256\232.sql"
src/main/java/com/chris/crm/abc/comm/action/CommAction.java
src/main/java/com/chris/crm/abc/comm/dao/AbcDAO.java
src/main/java/com/chris/crm/abc/comm/service/AbcService.java
src/main/java/com/chris/crm/abc/comm/service/AbcServiceImpl.java
```
看到這可能會發現,第二行以下路徑都很正常,但第一行到底是怎麼回事?
原來是檔名含有中文字,造成讀取編碼錯亂了~😱
身為工程師沒在怕,此時再輸入以下這行:
```shell=
git config --global core.quotepath false
```
再重新執行我們前面 git diff-tree 的指令,正常的中文檔名就產生囉!
* 結果如下
```bash=
sql/HelloWorld就是這麼樸實無華且枯燥.sql
src/main/java/com/chris/crm/abc/comm/action/CommAction.java
src/main/java/com/chris/crm/abc/comm/dao/AbcDAO.java
src/main/java/com/chris/crm/abc/comm/service/AbcService.java
src/main/java/com/chris/crm/abc/comm/service/AbcServiceImpl.java
```
## 取得版本差異檔案
同理,我們能透過以下的指令來產生兩個 commit id 之間的差異檔,再將其壓縮成 diff.zip
```shell=
git archive --format=zip --output=./diff.zip HEAD $(git diff-tree -r --no-commit-id --name-only --text 97d7faf 5d147f1 )
```
壓縮檔結果
<img src="https://cornpic.com/images/2020/09/04/GLQmV8Z.png">
內容是有按照階層放置檔案的,而不是一打開就看到所有檔案在最上層,好處就是可以在專案最上層直接把壓縮內容丟進去做替換!
以上就是這次的小小學習筆記~ 👍🏻 👍🏼 👍🏽