tl;dr
- 昔は Windows で Git を使うのは辛かったが、現在は悪くない
- Scoop で簡単に構築できる
- 操作は CLI, 閲覧は GUI クライアントで使い分けている
- GUI クライアントは、 VS Code がオススメ
Git
言わずと知れた、バージョン管理システム。
Windows と Git
そもそも Git は、 Unix/Linux 文化圏で生まれてきたもので、Windows 対応はされてはいるがイマイチな時期が長く続いた。
イマイチだった点
- Git を導入するために、Git 以外の登場人物が多く辛い ( 特に新人 Windowser には
- msys
- Git Bash
- ssh
- 情報が色々あって辛い
- 3~4 年前までは、まだ Cygwin 派の記事もあった
- Windows への導入の記事なのに、何となく Linux の知識ある前提だったり
- 鍵生成が辛い
- putty 形式 ? OpenSSH 形式 ?
- GUI クライアント使ってると、良くここで混乱した
- putty 形式 ? OpenSSH 形式 ?
- 文字化け辛い
最近の Windows × Git
- Git 導入
- 取り敢えず Git for Windows で OK
- SSH、鍵生成
- Win32-OpenSSH で OK
- Git Bash
- 上記2つができれば、PowerShell や Command Prompt でも十分 OK
- Windows での導入記事も増えている
- 文字化けは、まだまだ遭遇する…
全部ではないが、そこそこ改善してきている。
参考
今、導入するなら
Git
別記事 でも書いたが、Scoop 等を利用すれば簡単に導入できる。
PS> scoop install git
PS> git --version
git version 2.15.0.windows.1
後は、git config --global
で基本情報を設定して終わり。
PS> git config --global user.name "名前"
PS> git config --global user.email "メールアドレス"
PS> git config --global core.autoCRLF false # 勝手に改行コード変えない
PS> git config --global core.excludesfile ~/.gitignore_global # 共通無視設定
PS> git config --global core.pager "LESSCHARSET=utf-8 less" # 文字化け対応
# winmerge を使う場合
PS> git config --global diff.diff winmerge
PS> git config --global difftool.winmerge.cmd "'C:/Program Files/WinMerge/WinMergeU.exe' -e `$LOCAL `$REMOTE"
# 以下、チームのルールに合わせて
PS> git config --global merge.ff false # mergeは --no-ff
PS> git config --global pull.rebase preserve # pull は --rebase
OpenSSH
Git 使う上で欠かせない SSH クライアント。SSH key 生成ツールも同封。
PS> scoop install openssh
PS> ssh -Version
OpenSSH_7.5p1, LibreSSL 2.5.3
PS> ssh-keygen
Generating public/private rsa key pair.
...
Git 拡張
Scoop には、Git を拡張するツールや便利ツールも一応そろっている
PS> scoop install git-lfs git-town gibo
各詳細は、以下を参照
GUI クライアントを使うべきか問題
自分の Git クライアント遍歴は、SourceTree → GitKraken → CLI。
GUI クライアントの良さも理解しつつ、しかしプログラマであればやはり CLI には慣れた方が良いと思う。
CLI を薦める理由
- Qiita, StackOverflow 等ネット上の技術情報の多くが CLI 前提となっている
- 『GUI ではどうやるか』と翻訳する必要がない
- Git はそもそも出来ることが多く、やりたい操作が GUI で見つけられない / そもそもできない
- CLI に移行して**『こんなこと出来るんだ、Gitって』**と感動
-
reflog
とかrebase --abort
とか
-
- CLI に移行して**『こんなこと出来るんだ、Gitって』**と感動
- 分散バージョン管理システム自体の複雑さに起因する本質的な複雑さは、GUI にしたから分かりやすくなると言うもんでもない
- とは言え、コマンド体系はもう少しなんとか…
しかし、諦めきれない GUI への思い
とは言え 情報を見る という点に関しては、明らかに GUI クライアントの方が優れている。
- Branch Tree View
- ブランチの全体的な流れを掴む
- Diff
- フォルダ・ファイルの Diff
- コミット間・ブランチ間
- コミット検索
なので、今の所 操作は CLI・閲覧は GUI とユルく分けて運用している ( CQS 原則っぽく )
CLI と併用する GUI クライアント
※ それ以外にも、tig や git-foresta 等のテキストベース GUI も検討したが、表示がずれたり Perl が上手く動かなかったりと、Windows ネイティブ対応の壁にぶつかり保留中。
で、今一番気に入っていて使っているのが、上記リンク先にはない VS Code
Visual Studio Code
高機能なテキストエディタ。
Visual Studio Code
- そこそこ軽量
- コマンドパレットがあるので、コマンドを何となく覚えていると呼び出せる
- CLI からは、
code .
で起動- CLI 連携でとても楽
- Terminal が統合されているので、Git コマンドもそのまま実行できる
- 日本語対応
VS Code は、初めから VCS を操作・状態表現する機能を持ってる。
バージョン管理 | Visual Studio Code Docs
- Add & Commit, Remote 操作, Branch 操作などの基本操作が可能
- ファイルツリーに
git status
の状態変化を示すマークが表示- エディタ領域にも、行単位の変更状態の目印がつく
- Diff 表示もあり
- diff-highlight 的な局所的ハイライト
- Split View
- コードのシンタックスハイライト
以下の記事で丁寧に解説してくれているので、参考に
Visual Studio Code の git 連携機能と git コマンドについて (2017/11/19)
ここまでは基本機能。
ここから、拡張を入れることで 情報を見る という機能を強化していく。
GitLens
様々な Git 情報を提供してくれる拡張。
GitLens
以下、良くお世話になっている機能をピックアップ
-
変更者は誰か確認
-
コミット検索
-
ファイル履歴一覧
-
ファイルの変更確認
-
git diff XXXX YYYY -- FFFF
相当 - コマンドパレットで、
Compare File with Branch...
Compare File with Revision...
- 後述する、Git History の方が直感的
-
-
特定ブランチのコミット履歴
Git History
Git の GUI クライアントと言えば、やっぱり Branch Tree View が無いと
Git History
- 全体的なブランチの流れを掴む
- コミットの変更をサクッと見るのにはちょうどいい
- 離れたコミット間の差分は、Gitlens よりも直感的
Git Tree Compare
あるブランチを Base に指定すると、現ブランチとの分岐点からの差分比較をしてくれる拡張。
Git Tree Compare
- 変更ファイルを一覧表示してくれる。しかも自動更新
-
git diff --name-only XXXX...current
相当- 内部的には、
git diff-index --no-renames --name-status $(git merge-base XXXX current)
をしている ( 違いは分からない … )
- 内部的には、
- ファイルクリックで Diff 表示
-
- e.g. develop ブランチを Base に指定し、 future ブランチでの変更差分を見たい
- Github の Pull Request 時の差分と同じ
まとめ
そこそこ満足してる。
けど、やっぱりもっと GUI GUI していて直感的なやつが欲しい。
Fork が凄く良さそうなので、今後の Windows 対応に期待。
おまけ
git config 切り替え
例えば、Github と 社内 Gitlab で SSH key を分ける場合、~/.ssh/config
を使うと思うが、ユーザ名やメールアドレスも変えたい場合、困るケースがある。
そんな時は、includeIf を使うと便利。
● C:/ghq
以下に Github プロジェクトを集中させている場合
[user]
name = github_user
email = github_user@example.com
..
[includeIf "gitdir:C:/ghq/"]
path = ~/.gitconfig_github
こんな感じに、個別に設定ファイルを作成し、includeIf
でフォルダパスが条件にヒットした場合のみ読み込むということができる。
詳しくは、以下の記事がとても良くまとまっているので参考に
gitアカウントを作業フォルダによって自動で変更できるようにする