(git3)tig(Gitツール)操作方法

# ■概略
オープンソースエンジニア歴30年超の筆者が2023年からIBMiを学びだした学習記録です
gitツールのtigを弊社で設定した操作方法をまとめました

## <u>■tigの基本</u>
### <u>◯gitコマンドでソースコードの取得</u>
IFS上のホームディレクトリにgit cloneでソースを取得する  
```
$ ssh as400dev ※VSCodeのterminalかsshクライアントから
$ cd ~
$ git clone {gitプロジェクトのURL}
```
## <u>◯tigの起動</u>
```
$ cd {gitプロジェクトのディレクトリ}
$ tig ＊起動直後はcommit履歴画面(main)  
```
## <u>◯tigの画面とキーバインド</u>
tig を起動後、 r でブランチ一覧を表示
(画像はmainになっているがmasterブランチのこと)
![develop_tig01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/16f3af60-3a9d-3641-aa24-b86d27391fa7.png)

主なキーバインド  
<table border="1" style="border-collapse:collapse;width:800px">
<tr bgcolor=silver><th>キー</th><th>説明</th></tr>
<tr align=center><td>h</td><td>キーバインド一覧などヘルプ画面</td></tr>
<tr align=center><td>q</td><td>現在開いてる画面を閉じる=前に戻る</td></tr>
<tr align=center><td>Q</td><td>tigを終了する(Ctrl-Cでも可)</td></tr>
<tr align=center><td>s</td><td>ステータス画面(git status相当)</td></tr>
<tr align=center><td>r</td><td>ブランチ一覧画面(git refs相当)</td></tr>
<tr align=center><td>m</td><td>コミット一覧画面(git commit相当)</td></tr>
<tr align=center><td>R</td><td>画面更新</td></tr>
<tr align=center><td>j</td><td>下移動(↓でも可)</td></tr>
<tr align=center><td>k</td><td>上移動(↑でも可)</td></tr>
<tr align=center><td>g</td><td>(helpなど長い画面で)画面最上段</td></tr>
<tr align=center><td>G</td><td>(helpなど長い画面で)画面最下段</td></tr>
<tr align=center><td>PGUP</td><td>1ページ上へスクロール</td></tr>
<tr align=center><td>PGDN</td><td>1ページ下へスクロール</td></tr>
</table>

上記は最低限で他に機能たくさんあり  
共通の設定が/usr/local/etc/tigrcにあり  
個人の設定をしたい場合は、~/.tigrcを作成し上書きすること  

## <u>■1)ブランチ一覧画面(r)(ブランチ操作)</u>
ブランチ一覧画面(refs)のキーバインド(筆者カスタマイズ)  
<table border="1" style="border-collapse:collapse;width:800px">
<tr bgcolor=silver><th>画面</th><th>キー</th><th>説明</th></tr>
<tr align=center><td>refs</td><td>U</td><td>指定ブランチの更新(git pull)</td></tr>
<tr align=center><td>refs</td><td>B</td><td>指定ブランチを親にして子ブランチ作成(git branch)</td></tr>
<tr align=center><td>refs</td><td>=</td><td>指定ブランチに切替(git checkout)
<tr align=center><td>refs</td><td>^</td><td>指定ブランチの親ブランチ名を取得する(git show-branch)</td></tr>
<tr align=center><td>refs</td><td>M</td><td>現在のブランチに指定ブランチを結合する(git merge)</td></tr>
</table>

## <u>◯ブランチ更新(U)(git pull)</u>
他の人の変更がmasterやdevelopにmergeされているものをgit pullで更新する  
更新(git pull)したいブランチを選んで、U(shift+u)を押す  
下記の確認が表示されるので y を押す   
```
Run `sh -c "git checkout develop && git pull origin --ff-only && git checkout -"`? [Yy/Nn]
```

下記が表示されるので Enter で元のブランチ一覧(refs)画面に戻る  
下記は現在developにいて、developをgit pullしようとして最新だった場合の表示
```
M  README.md
Already on 'develop'
Your branch is up to date with 'origin/develop'.
Already up to date.
M       README.md
Already on 'develop'
Your branch is up to date with 'origin/develop'.
Press Enter to continue
```

## <u>◯ブランチ作成(B)(git branch)</u>
親ブランチを選んで、B(shift+b)を押す  
下記のように作成するブランチ名を入力すると確認が表示されるので y を押す  
下記はdevelopにいて、feature/#1ブランチを作成しようとした場合の表示  
```
New branch name: {ブランチ名}
　↓
Run `git branch feature/#1 develop`? [Yy/Nn]
```

## <u>◯ブランチ切替(=)(git checkout)</u>
切替(git checkout)したいブランチを選んで =(shift+-)を押す  
下記が表示されるので y を押し、次の表示で Enter を押す  
ブランチ一覧(refs)で選択したブランチが一番上になっている  
この後はソース編集し、2)ステータス画面に進む  
```
Run `git checkout feature/#1`? [Yy/Nn]
　↓
M  README.md
Switched to branch 'feature/#1'
Press Enter to continue
```

## <u>◯親ブランチ確認(^)(git show-branch)</u>
親ブランチを確認したいブランチを選んで ^ を押す  
下記が表示されるので y を押す  
```
Run `sh -c "git checkout feature/#1 && git show-branch|grep -1 `git rev-parse --abbrev-ref HEAD`|head -1 "`
　↓
M  README.md
Already on 'feature/#1'
develop               ←ここに親ブランチ名が表示される
M       README.md
Already on 'feature/#1'
Press Enter to continue
```

## <u>◯ ブランチ結合(M)(git merge)</u>
「(git2)IBMi(AS400)でのコード管理の流れ」 ではmergeはgitlab上で行うようにした

tig上でもmergeは可能なので説明する
マージ先になるブランチに切替(git checkout)しておく  
マージしたいブランチを選択し M(shift+m) を押す  
下記が表示されるので y を押し、メッセージ入力し ZZ 等で編集を終了する  
次の表示で Enter を押す  
```
Run `git merge feature/#1`? [Yy/Nn]
　↓
vimのマージメッセージ入力を求められる
編集方法はgit commitを参照
　↓
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 910 bytes | 910.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for feature/#1, visit:
remote:   https://gitlab.local/test/readme/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature/#1
remote:
To gitlab.local:test/readme.git
   4947007..7032b3b  feature/#1 -> feature/#1
branch 'feature/#1' set up to track 'origin/feature/#1'.
Press Enter to continue
Switched to branch 'develop'
Your branch is up to date with 'origin/develop'.
Press Enter to continue
Merge made by the 'ort' strategy.
 README.md           |   1 +
 rst/develop_tig.rst | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 223 insertions(+)
 create mode 100644 rst/develop_tig.rst
Press Enter to continue
```
  
m を押すと整形ログ画面(main)が表示される  
上記merge直後の表示
下記 M Merge branch 'feature/#1' 行からマージ内容が表示されている 
![develop_tig06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/003c7167-86c5-5e4a-1323-26d09385b887.png)

## <u>■2)ステータス画面(s)(変更操作)</u>
feature/hotfixブランチに切替(git checkout)した後でファイルの修正を行う  
修正が完了したら、tigの画面に戻り s を押すと以下が表示される  
![develop_tig02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/41884ed1-0b50-1a3d-bde0-9e4ffd4da54a.png)

ステータス画面(status)のキーバインド  
<table border="1" style="border-collapse:collapse;width:800px">
<tr bgcolor=silver><th>画面</th><th>キー</th><th>説明</th></tr>
<tr align=center><td>status</td><td>u</td><td>指定ファイルをコミット待ちにする(git add)</td></tr>
<tr align=center><td>status</td><td>C</td><td>コミット待ちをコミットする(git commit)</td></tr>
<tr align=center><td>status</td><td>P</td><td>コミット済をリモートのgitレポジトリに反映する(git push)</td></tr>
</table>

## <u>◯変更追加(u)(git add)</u>
変更済ファイル(Changes not staged for commit) と  対象外ファイル(Untracked files) のファイルを u でgit addし、  
コミット待ファイル(Changes to be committed) に 移動した状態が以下  
![develop_tig04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/17189006-cfb9-4c26-6d15-fe9755deba7c.png)

## <u>◯変更まとめ(C)(git commit)</u>
C(shift+c) を押すと、コミット待ファイル(Changes to be committed) をコミット済にする  
以下のようにコミットメッセージの入力が求められる  
多くの人はnano(insertなどモードがない)で入力後以下で終了する
・書込みは Ctrl-o  
・終了は   Ctrl-x  
vimエディタの場合は編集はvimの作法に従うこと  
・insertモードには i で移行し、 esc でノーマルモードに戻る  
・カーソル移動は、左がhか←、右がlか→  
・終了は ZZか:wq   
![develop_tig05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3875673/5e7f062c-df42-471d-af86-b90955780cab.png)

コミットメッセージ入力後以下のコミットの反映表示になるので Enter を押す  
```
[feature/#1 4478de7] develop_tig.rstを追加
 2 files changed, 192 insertions(+)
 create mode 100644 rst/develop_tig.rst
Press Enter to continue
```

## <u>◯変更反映(P)(git push)</u>
P(shift+p) を押すと、コミットをリモートのgitレポジトリに反映する(git push)  
以下の確認が表示されるので y を押し、git push結果が表示されるので Enter を押す  
以下はfeature/#1ブランチにgit pushした結果
developブランチへのmergeは開発者がgitlabでマージリクエスを出してマージする
```
Run `git push -u origin feature/#1`? [Yy/Nn]
　↓
Enumerating objects: 7, done.
Counting objects: 100% (7/7), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 527 bytes | 527.00 KiB/s, done.
Total 4 (delta 3), reused 0 (delta 0), pack-reused 0
remote:
remote: To create a merge request for feature/#1, visit:
remote:   https://gitlab.local/test/readme/-/merge_requests/new?merge_request%5Bsource_branch%5D=feature/#1
remote:
To gitlab.local/readme.git
   25f4a29..4947007  feature/#1 -> feature/#1
branch 'feature/#1' set up to track 'origin/feature/#1'.
Press Enter to continue
```