> For the complete documentation index, see [llms.txt](https://docs.xiwind-corp.com/tech/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.xiwind-corp.com/tech/git/e-wai-gong-neng.md).

# 額外功能

## Note

***

Note(註釋)允許您附加額外訊息或註釋附加到 Git 物件(Commit, Tag, 或 Tree)，用於提供解釋和參考。

1. **新增 Note。**

{% code title="SHELL" overflow="wrap" %}

```powershell
git notes add <Git SHA-1 ID>
git notes add -m '<Note 註解>' <Git SHA-1 ID>
```

{% endcode %}

`git notes add`: 使用預設編輯器編輯 Note&#x20;

`git notes add -m`: 直接編輯 Note

<div><figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FY2PPNcN5oZ02f9FTkVMK%2FPasted%20image%2020230516234915.png?alt=media&amp;token=85a2d0dd-fe19-4d32-9594-98ec403e8dba" alt=""><figcaption><p>選擇 Commit</p></figcaption></figure> <figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FOffpLGcW1F6qixPZKnP6%2FPasted%20image%2020230517000557.png?alt=media&amp;token=b551e310-1f56-4571-b0a8-b6f416f9bf37" alt=""><figcaption><p>新增 Note</p></figcaption></figure></div>

2. **查看 Note。**

{% code title="SHELL" overflow="wrap" %}

```powershell
git notes show <Git SHA-1 ID>
```

{% endcode %}

{% code title="SHELL" overflow="wrap" %}

```SHELL
git log --show-notes
```

{% endcode %}

<div><figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FnYb7cwp5iMdEG4o7wPik%2FPasted%20image%2020230517001317.png?alt=media&amp;token=bbb8da40-5c49-474b-94a5-bfacb113cd99" alt=""><figcaption><p>notes show</p></figcaption></figure> <figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2F4r0AhuwpoXwuTm1hk146%2FPasted%20image%2020230517001339.png?alt=media&amp;token=aeda7171-79cd-495d-b63e-c9cac426e370" alt=""><figcaption><p>--show-notes</p></figcaption></figure></div>

## Tag

***

Tag (標籤)用於標記 Git Commit 歷史中重要的里程碑。例如：對外發布、版本變更或重要 Commit。

1. **新增 Note。**

{% code title="SHELL" overflow="wrap" %}

```powershell
git tag <Tag 名稱> 
git tag <Tag 名稱> <Git SHA-1 ID>
```

{% endcode %}

<div><figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2F66tCDQaEoAPG5wvMFKxF%2FPasted%20image%2020230516234915.png?alt=media&amp;token=e1a957b3-4c3a-478d-ad35-4e9545dd3cb3" alt=""><figcaption><p>選擇 Commit</p></figcaption></figure> <figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FwDz7X60xOBWiRphdLY5x%2FPasted%20image%2020230517012804.png?alt=media&amp;token=5e88a208-a309-4aa2-afe1-69c8992eab66" alt=""><figcaption><p>新增 Tag</p></figcaption></figure></div>

2. **查看 Tag。**

{% code title="SHELL" overflow="wrap" %}

```SHELL
git log --oneline
```

{% endcode %}

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FRApsoWkZiJ6MFvsiawIG%2FPasted%20image%2020230516234915.png?alt=media&amp;token=578e3e1b-8872-44e3-bf47-4e4bd4c5c9b6" alt="" width="375"><figcaption></figcaption></figure>

3. **新增含註解的 Tag。** (例如: 標籤製作者、電子郵件、日期、註解...)

{% code title="SHELL" overflow="wrap" %}

```SHELL
git tag -a <Tag 名稱> -m "<Tag 註解>"
git tag -a <Tag 名稱> <Git SHA-1 ID> -m "<Tag 註解>"
```

{% endcode %}

<div><figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FEOc1DnkpPvEa8qFEjcf6%2FPasted%20image%2020230517014147.png?alt=media&amp;token=f990f76b-9e9c-4290-b026-37e11b5967b1" alt=""><figcaption><p>新增 Tag</p></figcaption></figure> <figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2Fy3azOHH6mO5R3HP9Uzp3%2FPasted%20image%2020230517014213.png?alt=media&amp;token=374fd388-ec86-49af-ab42-d93d6f2cf15c" alt=""><figcaption><p>查看 Tag</p></figcaption></figure></div>

4. **修改 Tag 指向。** (當設置錯誤的 Commit 時)

{% code title="SHELL" overflow="wrap" %}

```SHELL
git tag -f <Tag 名稱> <Git SHA-1 ID>
```

{% endcode %}

<div><figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2Fea9NcKI00M2i85liobiL%2FPasted%20image%2020230517015002.png?alt=media&amp;token=f5c04d9e-596a-4031-a183-f99f7ade6653" alt=""><figcaption><p>修改 Tag</p></figcaption></figure> <figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FcLRJOEFjthiJ80FRMCYe%2FPasted%20image%2020230517015019.png?alt=media&amp;token=798cf505-f980-48a8-9b1d-be7da10f805d" alt=""><figcaption><p>查看 Tag</p></figcaption></figure></div>

5. **查看指定 Tag Commit。**

{% code title="SHELL" overflow="wrap" %}

```SHELL
git show <Tag 名稱>
```

{% endcode %}

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FrRiCKwBzMmPnu4KYiseU%2FPasted%20image%2020230517015839.png?alt=media&amp;token=6f8f7a66-00c2-4fdb-b0a0-a0f37f4c3e61" alt="" width="375"><figcaption></figcaption></figure>

7. **刪除Tag。**

{% code title="SHELL" overflow="wrap" %}

```SHELL
git tag -d <Tag 名稱>
```

{% endcode %}

8. **您使用將更改 Push 到 Remote repository 時，不會自動推送 Tag。您需要明確指定選項`--tags`。**

{% code title="SHELL" overflow="wrap" %}

```SHELL
git push --tags
```

{% endcode %}

## Alias

***

Alias(別名) 功能允許您為常用的 Git 命令建立自定義的縮寫，從而幫助您節時間。

無需鍵入整個命令，您只需使用別名即可獲得相同的結果。可讓您的 Git 體驗更高效並根據您的特定需求量身定制。

1. **建立別名。** (同一命令可以建立多筆 Alias)

{% code title="SHELL" overflow="wrap" %}

```SHELL
git config --global alias.<別名> <git 指令>
git config --global alias.st status
git config --global alias.bc checkout -b
git config --global alias.cb checkout -b
git config --global alias.cam 'commit -a -m'
git config --global alias.nx 'log --name-only --oneline'
```

{% endcode %}

{% hint style="info" %}
**同一命令可以建立多筆 Alias。多個參數必須使用: " " or ' '。**
{% endhint %}

2. **開啟設定打查看或編輯。**(使用預設編輯器打開)

{% code title="SHELL" overflow="wrap" %}

```SHELL
git config --edit --global
```

{% endcode %}

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FQI95qxqnXxoxv2b9lyM9%2FPasted%20image%2020230517023159.png?alt=media&amp;token=60b4afb1-f610-496c-a23d-31af95fc4358" alt="" width="375"><figcaption></figcaption></figure>

## 進階 Log

***

1. **建立更好看的 log 別名。** `紅色 Git SHA-1 ID,黃色 Tag 名稱, 綠色 Commit Time, Commit 作者`

{% code title="SHELL" overflow="wrap" %}

```powershell
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset-%C(yellow)%d%Creset %s %Cgreen(%cr) %C(yellow)<%an>%Creset' --abbrev-commit"
```

{% endcode %}

{% code title="SHELL" overflow="wrap" %}

```SHELL
git lg
```

{% endcode %}

<div><figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FbmdnIwxKuloXQNeDIhna%2FPasted%20image%2020230517024558.png?alt=media&amp;token=21fc77bc-81e0-474a-9df7-28a7b21d4318" alt=""><figcaption><p>原始 log</p></figcaption></figure> <figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FVgjnpnlxyzM7NqgiPitg%2FPasted%20image%2020230517024442.png?alt=media&amp;token=072736f6-8ea4-4128-9073-210e1dca0454" alt=""><figcaption><p>修改後的 log</p></figcaption></figure></div>

2. 使用條件查找 Log 。(包含特定字串、Commit 作者...)

{% code title="SHELL" overflow="wrap" %}

```powershell
git lg -S<字串>
git lg --committer="<Commit 作者>"
git lg --since='<時間> <時間單位>'
```

{% endcode %}

`<時間單位>`: minute, hour, day, week, month, year

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FNBmcWuo3dUGW5wulCEIx%2FPasted%20image%2020230518025812.png?alt=media&amp;token=43977eef-14d8-414d-9700-db563d6c4216" alt="" width="375"><figcaption></figcaption></figure>

## Diff

***

1. **比對尚未進入 Staging area 的檔案的差異。或是指定比對。**

{% code title="SHELL" overflow="wrap" %}

```powershell
git diff 
git diff <檔案名稱>
git diff <Git SHA-1 ID>
git diff <Git SHA-1 ID> <Git SHA-1 ID>
git diff <Branch 名稱> <Branch 名稱>
```

{% endcode %}

`--cached`: 比對已進入 Staging area 的檔案。&#x20;

`---stat`: 僅顯示差異摘要。&#x20;

`>*.txt`: 將比對結果輸出為文字檔。

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FQdPYvOFP1eoLy1jPy1cA%2FPasted%20image%2020230517042004.png?alt=media&amp;token=e8d7c397-eda1-4a3b-a705-7534aa0a3a8f" alt="" width="375"><figcaption></figcaption></figure>

{% hint style="info" %} <mark style="color:red;">-紅色標記</mark>: 刪除。 <mark style="color:green;">+ 綠色標記</mark>: 新增。 <mark style="color:yellow;">黃色標記</mark>: 修改。
{% endhint %}

### Blame

找出文件每一行的作者。它提供文件的逐行註釋，Commit 、作者姓名和每行的最後修改日期。

{% code title="SHELL" overflow="wrap" %}

```powershell
git blame <檔案>
```

{% endcode %}

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2F2BjMw1NUqkHNqzB4Djcj%2FPasted%20image%2020230518212553.png?alt=media&amp;token=5371f654-874e-4334-aba9-5322ef4b16ab" alt="" width="375"><figcaption></figcaption></figure>

### Bisect

bisect(二進制搜索) 可幫助您找到錯誤的(壞的) Commit，並回復未修改前的(好的) Commit。 它透過 Commit 歷史執行二進制搜索，縮小可能的 Commit 範圍來定位錯誤的 Commit。

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FfY3UcXFsYJsHhKPrKxdj%2FGit-Bisect-Demo.gif?alt=media&amp;token=5be0ddf1-b315-4c8f-b35b-29c4fd0da909" alt="" width="360"><figcaption></figcaption></figure>

<figure><img src="https://3293907157-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FtlnsDqWTGrgKWvoywdfm%2Fuploads%2FXvUeQz9OdoaeLg71cn8G%2Fgit-bisect-fig1.png?alt=media&amp;token=7bba9c79-ef8a-4e79-b18e-7a289cd3ae70" alt="" width="329"><figcaption></figcaption></figure>

在每個步驟中，會消除剩餘一半的 Commit，讓您可以高效地定位有問題的Commit。它自動縮小錯誤的 Commit 的範圍。

1. **啟動 bisect。**

{% code title="SHELL" overflow="wrap" %}

```powershell
git bisect start
git bisect good <已知的壞的 Git SHA-1 ID> <已知的好的 Git SHA-1 ID>
```

{% endcode %}

2. **此時，您需要檢查或運行程式碼並確定錯誤是否存在。** (Git 會自動 Checkout Commit 供您測試)<br>
3. **將當前 Commit 標記為好的或壞的。**

{% code title="SHELL" overflow="wrap" %}

```powershell
git bisect good
git bisect bad
```

{% endcode %}

4. **找到問題壞的 Commit時，退出 bisect。**

{% code title="SHELL" overflow="wrap" %}

```powershell
git bisect reset
```

{% endcode %}

## 參考資料

***

[利用git diff 來為版本控制專案找出差異](https://www.tpisoftware.com/tpu/articleDetails/1450)

[Who Broke My Test? A Git Bisect Tutorial | Sumo Logic](https://www.sumologic.com/blog/who-broke-my-test-a-git-bisect-tutorial/)

[使用 Git Bisect 快速找到第一個有問題的 Commit | Puck's Blog](https://blog.puckwang.com/posts/2021/use-git-bisect-debug/)

[Puck's Blog](https://blog.puckwang.com/)
