tech.guitarrapc.cóm

Technical updates

GitKraken を改めて考えてみる

以前 Fork について書いたのですが、GitKraken についても書いておこうと思います。

tech.guitarrapc.com

tl;dr;

Unity リポジトリではgit操作が重く悩ましいのですが、それを除くと GitKraken は最高の Git GUIクライアントだと思います。速度の Fork か、使いやすさの GitKraken か、両取りのGitKrakenターミナル統合か、と用途に応じて使い分けるのも手でしょう。

  • GitKraken を商用で利用するなら有料版が必須。OSS開発だけなら無料版が利用できる
  • 視点移動が少ないUI設計が使いやすい
  • ターミナルタブはコマンド派でも操作しやすくGitKrakenのツリーも使えて便利
  • Unityリポジトリなどサイズの大きいリポジトリでgit操作が重くなりやすい
  • GitKranen の push 時にかかる git-hook が失敗するようになることがある

GitKraken の設計目標

GitKraken は、GitKraken で一連の git 操作 (clone, fork、pr) が完結することが目指されており、実際実現できています。目指すゴールとコンセプトがはっきりしているのは良いことです。ではこの設計目標は実際どのように達成されているのか見てみましょう。

価格

GitKrakenには無料版、有料版として Pro $4.95 per user/month、Teams $8.95per user/month あとは Enterprise があります。無料版はOSS利用のみ、GitHub.com のみ接続可能、プライベートリポジトリが開けない、プロファイル切り替えができない などの制約があります。Pro は複数のVCSに対して接続1でき、コマーシャル利用が可能になります。Teams は 10人を超えるユーザー管理、複数チーム管理ができます。

企業利用としても、ユーザーに対するライセンス割り当てをフローティング管理できるので、有料版は企業にも優しいなぁと感じます。

GitKraken Client Pricing

プロファイル

有料版で利用できる、複数のプロファイル設定は非常に優秀です。それぞれのプロファイルにメアド、VCS認証情報やデフォルトCloneフォルダが持てるので、個人で GitHub.com を使うとき、会社で GitHub.com を使うとき、会社で GHE を使うとき、会社で AzureDevOps を使うとき、とすべてプロファイルを分けたりできます。

プロファイル切り替え = .gitconfig の [user] セクションの name, email の書き換えになります。dotfiles で .gitconfig を管理している場合、プロファイルを切り替えで意図しない書き換えがpush されないか気を付ける必要があります。プロファイルが [credential] を見てくれればいいのですがそうはならないのが残念です。 [include] で指定した別.gitconfig の [credentials] に定義した.... を期待してはいけない。

GitHub.com とのOAuth認証

GitKrakenをGitHub.com で使うには Orgに対して OAuth App の許可を行う必要があります。これは結構厄介で、サクッと使おうと思っても GitKraken だと利用できないというケースがよくあります。一方で、GHE (Selfhost) や Azure DevOps は PAT 認証なのですんなり使えます。

プロファイルの[credential] の件も併せて、できれば CLIの認証と同じ仕組みで GitKraken が利用できるといいのですが。

GitHubの Authorized OAuth Apps に GitKraken を含める必要がある

SSH鍵

GitHub.com はSSHで認証するのですが、そのSSH鍵の生成、GitHubへの登録など一通りの操作はGitkrakenで完結します。これは結構重要で、こだわりがないならいちいちSSH鍵生成のために別ツールを利用する必要はありません。とはいえ、GHE や GitLab、Azure DevOps は PAT認証なので関係なかったりします。

GitKraken でのSSHキー生成

UI

GitKraken のUI最大の特徴はツリー画面だと思います。ツリーは真ん中に位置し、左にブランチ、右にコミットが表示されます。

GitKraken のUI

ツリーが見やすいと感じるのが、ブランチやタグがどのコミットを指しているかパッとわかること、複数ブランチから自分のブランチだけをツリー表示する Solo でのフィルタリングです。

Solo 機能で stagingブランチだけを表示した状態

左のブランチカラムは、ほかにもPR、Issue、Tag、Submodules、GitHub Actions が表示されいます。普段の開発だとLocalのブランチ操作がメインになると思いますが、すでに上がっているPRをここからひらくこともできます。Tag 操作もここで行えるなど、git の大半の操作が集約されています。

PULL REQUESTS から PR を開ける

右のコミットカラムは、選んでいるコミットの表示やファイル変更を示し、その変更一覧とコミット操作も右カラムの画面切り替えで表示されます。ファイルの差分表示は、ツリー表示に代わって左+真ん中カラムが切り替わって表示されます。

ファイルの変更は右カラムに表示される

ファイル変更のステージング操作とコミット操作は右ペインが切り替わって表示

ファイル差分は左+真ん中カラムが切り替わって表示

この UI表示で何よりも素晴らしいのが、目線の移動がいかに少なくなるか設計されていることです。特にそれを感じるのが、ファイル差分を左+真ん中カラムを切り替えて表示することです。差分表示は幅も高さも広いほど作業効率が高い一方で、ファイル差分チェック中はブランチ状態やツリー状態は不要です。左+真ん中カラムのスペースを切り替えつつ、コミットにかかわるファイル選択は右カラムのままなので、視線移動が少ないのに必要な視野が確保されています。すごいです。

私が知ってる Git GUI クライアントでこういった視線移動に対する設計がきっちり行われていると感じるものは他になく素晴らしいと思います。

コンフリクト解消

GitKraken は Merge時にコンフリクトが起こってもコンフリクト解消が容易です。コンフリクト時はファイルDiffの表示が「コンフリクト状態と解消選択表示」に切り替わります。行ごとにどちらのブランチから変更を引っ張ってくるか選択ができるのでミスせず操作ができます。VS Code や Vim での解消二度としたくない。

https://www.gitkraken.com/learn/git/tutorials/how-to-resolve-merge-conflict-in-git より引用

ターミナル統合

GitKraken は CUIのみで操作するときでも便利で、push/pull のみ CLI で行ってブランチ操作やツリーはGitKrakenを使うことができます。ターミナル統合のもう1つのメリットは、認証が Git CLI に準じることで「OAuth認証されていないリポジトリだけどGitKraken を使いたい」ができます。そして隠れたもう一つのメリットが git push/pull がターミナル操作なので GitKraken で push/pull するより高速なため大きなリポジトリでも操作が快適です。操作が早くてツリーが便利、を実現するのがターミナル統合の真の価値!

ちなみにGitKraken は Fork や SourceTree のようなカスタムコマンド連携はないのですが、ターミナル統合ならカスタムコマンドも利用可能なので、いつもの感覚で利用できるでしょう。

ターミナル統合でGitKrakenツリーを使う

ターミナル統合で git cli の補完がされる

LFS

Unity を使っていると出てくるのが git lfs です。2 GitKraken は、リポジトリルートの.gitattributesに lfs設定を記載していれば、pull操作で git lfs pull が自動的に実行されるのでLFSを意識しなくなり実体化忘れもなくなります。Fork などは git lfs 統合がなく、都度 git lfs pull が必要なので GitKraken の便利さはすごいです。逆にこの LFS統合によって、1回一回の pull操作が待たされるという感じもあるので、LFS 統合がいいか悪いかは微妙なラインもあるかもしれません。Preference では有効無効を設定できないので仕方ないかなぁ。

git-lfs なリポジトリと検知するとLFSという表示がされる

シングルスレッド

GitKraken にはいくつか課題がありますが、大きなストレスの1つが 「一つ操作をしているとUIがロックされて連続操作ができない」ことです。例えば、A リポジトリタブで pull 中に、別のBリポジトリタブに切り替えることもできません。また、バックグラウンドで git fetch が走っていて、UI上は何の表示もないのに無言で操作できないことがまれによくあります。ストレスに拍車をかけるのがリポジトリが大きい場合の挙動の遅さです。.git が大きなリポジトリ (体感で10GB超~) で git操作 3 に時間がかかるようになります。

シングルスレッドは GitKraken 最大の弱点であり、これが理由で Fork に魅力を感じるのはよくわかります。

ファイルロック

GitKraken のもう1つの課題がファイルロックでしょう。GitKraken で開いているリポジトリの .git は GitKraken につかまれているため、Windows でリポジトリのフォルダが消せなくなります。そんな時は GitKraken を終了させてからフォルダを消してみるといいでしょう。

git-hook

GitKraken の最後の課題が、push 時に勝手に仕込まれている git-hook 操作です。公式ドキュメントにデフォルト hook の記載がないのですが、push 時に git-hook が失敗してpush自体が行えないことがあります。git-hook が一度できないと リポジトリをgit clone しなおしてもずっと解消しなくて詰むことがまれにあるので終わったとなることがあります。

まとめ

GitKraken は、細かい課題や速度に大きな課題があると感じます。しかし UI設計やプロファイルなど使いやすい機能が多く、Git GUI クライアントとしては最も好みです。

私も Unity で LFS なリポジトリだけは Fork を使ったりしています。くやしい。


  1. 有料版の対応VCSは、GitHub、GitHub Enterprise、GitLab、GitLab Self-Managed、Bitbucket、Bitbucket Server、Azure DevOps、Jira Cloud、Jira Server、Trello。
  2. Platic SCM どうですか、Perfoceどうですか。
  3. diff/stage/commit は影響なし、push/pull/checkout が影響を受けやすい。