git GUI クライアントのススメ ～TortoiseGit はいいぞ～

# はじめに
　ソースコードなどのファイルが醸成される過程で辿ってきた遍歴を記録し、またチームメンバーが寄ってたかって編集したことによって生じた複数の未来をいい感じに交わらせるために、git のようなバージョン管理システムを使う機会は多くあると思います。こういったツールが持つ機能や操作にはどのようなものがあり、歴史を管理し時に書き換える際にはそれらをどのように組み合わせていくのかを理解し、手足のように使いこなすまでには数々の困難が待ち構えています。リポジトリ、ワークツリー、インデックス……ただでさえ複雑な機構を漸くそういうものかと飲み込んでなんとか使えるようになったと思ったらコンフリクトが発生し、まだ知らないコマンドを駆使して解消することを求められ……というように。
　git それ自体が複雑怪奇で難解な仕組みであること自体はそういうものなので諦めるとしても、実際に（特に初心者が）使うにあたってその難易度を徒に上げ、ないしは操作を面倒にしているものに CUI があると思います。コマンドの綴りを覚えオプションの綴りや省略形を覚えるまでは毎度毎度 Google 先生やサル先生のお世話にならないと操作もままならない、というのは慣れればこのほうが速いと言われてもなかなかに辛いものがあります。そもそもコマンドを打ち、add するファイル名を打ち、補完が効かなかった部分を手で補完し……といった操作体系が万人にとって快適とは限らないのではないのでしょうか。
 　これは、[なぜエンジニアが作る画面はダサいのか…?](https://qiita.com/mskmiki/items/544149987475719e417b) で紹介されているデザイナーの B さんが作った画面のほうがモダンで目指すべきとされるケースが多いものの、SE の A さんが作った画面のほうが使いやすいと感じる人もいることや、卒業論文を執筆するなら LaTeX か MS Word か、というのに似たような話であり、要するに好みや慣れの問題が大きいと思います。ならば、それなりの割合のソフトウェアエンジニアが好んでいるであろう、 CUI による操作以外の選択肢が合ってもいいんじゃないかと思う次第です。

## 対象

- CUI つらいって人（ [はじめに](#はじめに)の第二段落を呼んで共感してくれた人）
- 簡単にポチポチっと git 操作がしたい人

## 結論

- TortoiseGit はいいぞ
    - ローカルリポジトリを Linux なリモートサーバに置いてる場合でもなんとかなります。

## しない話

- git 自体の説明
- TortoiseGit の詳細なセットアップ方法
    - こういう選択肢もあるよ、という紹介をしたいのでインターネット上の先達にお任せします。

# TortoiseGit はいいぞ

[TortoriseGit](https://tortoisegit.org/) は Windows 向けの git GUI クライアントです。ざっくり使い方を紹介していきます。

## (add + )commit する
TortoiseGit Windows のシェル拡張なので、エクスプローラ上で右クリックすると表示されるコンテキストメニューから操作できます。ローカルリポジトリを開いているエクスプローラ上で右クリックすると、画像のように`Sync`（pull や push をする）や `Commit -> "ブランチ名"`のような項目が現れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412151/39f7574f-cf76-b9ba-165a-4f379f318023.png)

 `Commit -> "ブランチ名"` をクリックすると画像のようなウインドウが出現します。前もっていちいち add しておかなくても Not Versioned Files としてリストアップされるのでコミットに含めたければチェックを付けることで自動的に add もされます。 また、ブランチを切り忘れて編集していた場合でも、ここでブランチを作成してそこにコミットすることもできます。あとは `Commit` をクリックするだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412151/a3c3cc06-60e0-e60c-8bf8-2807e95b3005.png)

## 歴史を改変する

おっと、「Hogeを追加」する、という内容のコミットなのに誤って Fuga.txt も一緒にコミットしてしまいました。なかったことにしましょう。コミットしたときと同じように、エクスプローラ上で右クリック → `TortoiseGit` → `Show log` の順にクリックしていくと、コミットログを見るウインドウが現れます。ここでなかったことにしたいコミットの **一つ前の** コミット[^1]を右クリックして `Rebase "ブランチ名" onto this...` をクリックします。
[^1]: 確かコマンドで rebase するときも一つ前のを選択してから、 pick とか reword とかこれから何をするのかを記述すると思いますがそれと同じです。
![2021-12-20_17h40_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412151/027ad85e-a362-6141-35ae-cb8fc7871efd.png)

`Force Rebase` をクリックすると、先ほど選択したコミット以後のコミットが一覧に現れるので、編集や削除をしたいコミットを右クリックして、それぞれ `Edit`[^2] や `Skip`[^3] をクリックします。
[^2]: `reword` や `edit` に相当
[^3]: `drop` に相当
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412151/997c0a75-f2d2-94b2-d985-902fb8419147.png)

あとは、Fuga.txt を右クリックして `TortoiseGit` → `Delete (keep local)`をクリックして、再びコミット（しなくてもよい）のあと、先ほどの画面で `Amend`をクリックすると、最初から「`Hoge を追加` のコミットには Fuga.txt なんてなかった。いいね？」状態になります。
ファイルを編集して再度コミットしてやることもできます。またコミットメッセージの修正も同様の手順で行うことができます。

## コミットの合体

さて、天才プログラマがゴールに向かって最短経路で突き進んできたコミット履歴にするときに、先ほどの歴史改変のほかに複数のコミットをひとつにまとめたい場合があります。このときはエクスプローラ上で右クリック → `TortoiseGit` → `Show log` の順にクリックして、ログ画面のなかで、合体させたいコミットたちを選択し右クリックして `Combine to one commit` をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412151/ee14cba0-36d2-609d-c964-617f3cf48db8.png)

すると 合体したあとのコミットを作成する画面になるので、コミットメッセージを入力して`Commit`をクリックすると
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412151/ea16b716-ca5e-05fa-e7dd-a89ac65d9450.png)

このように一つのコミットにまとめることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2412151/1dad8a31-a5c9-8000-795d-6e2c2ac0c799.png)

## ローカルリポジトリを Windows じゃないマシンに置く場合
TortoiseGit は Windows のシェル拡張なので Windows でのファイル操作ができる場所でしか活躍できません。管理対象のソフトウェアが Linux でしか動かないなどの理由で、直接 Windows から操作できない場所にローカルリポジトリを置く場合は、[Samba](http://www.samba.gr.jp/)やWinSSHFS[^4]のようなツールを使ってリモートサーバのディレクトリをネットワーク共有フォルダやネットワークドライブとしてマウントすることによって、 TortoiseGit で操作することができます。
[^4]: 試していないのでこれでいけるかはわかりません