Edited at

Windows で Git - 2017冬

More than 1 year has passed since last update.


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 クライアント使ってると、良くここで混乱した





  • 文字化け辛い


最近の Windows × Git


  • Git 導入



  • SSH、鍵生成



  • Git Bash


    • 上記2つができれば、PowerShellCommand Prompt でも十分 OK



  • Windows での導入記事も増えている

  • 文字化けは、まだまだ遭遇する…

全部ではないが、そこそこ改善してきている。

参考

Windows環境でのgitまとめ(2016.8)


今、導入するなら


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 とか





  • 分散バージョン管理システム自体の複雑さに起因する本質的な複雑さは、GUI にしたから分かりやすくなると言うもんでもない


    • とは言え、コマンド体系はもう少しなんとか…




しかし、諦めきれない GUI への思い

とは言え 情報を見る という点に関しては、明らかに GUI クライアントの方が優れている。


  • Branch Tree View


    • ブランチの全体的な流れを掴む



  • Diff


    • フォルダ・ファイルの Diff

    • コミット間・ブランチ間



  • コミット検索

なので、今の所 操作は CLI・閲覧は GUI とユルく分けて運用している ( CQS 原則っぽく )


CLI と併用する GUI クライアント

GUI クライアント一覧

※ それ以外にも、tiggit-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 blame 相当

    • エディタパネルに、行単位で author, commit message, date が表示
      image.png




  • コミット検索



    • git log --grep XXXXX 相当

    • コマンドパレットで、Search Commits を入力



      • XXXX で、commit message 検索
        image.png


      • @XXXX で、auther 検索
        image.png


      • :XXXX で、file 名検索
        image.png


      • ~XXXX で、file コンテンツを正規表現で検索 ( git log -G )


      • =XXXX で、file コンテンツを正規表現で検索 ( git log -S --pickaxe-regex )


        • 出現回数の変化を見るため、リファクタリングによる移動や Formatter によるフォーマット変換ではヒットしない








  • ファイル履歴一覧



    • git log -p FFFF 相当

    • コマンドパレットで、Show File History
      image.png

    • Gitlens パネルを File History View に切り替えて見ることも可能
      image.png




  • ファイルの変更確認



    • git diff XXXX YYYY -- FFFF 相当

    • コマンドパレットで、


      • Compare File with Branch...

      • Compare File with Revision...



    • 後述する、Git History の方が直感的




  • 特定ブランチのコミット履歴



    • git cherry -v XXXX 相当

    • コマンドパレットで、Show Branch History
      image.png
      image.png

    • カレントブランチなら、Show Current Branch History




Git History

Git の GUI クライアントと言えば、やっぱり Branch Tree View が無いと

Git History

image.png


  • 全体的なブランチの流れを掴む

  • コミットの変更をサクッと見るのにはちょうどいい

  • 離れたコミット間の差分は、Gitlens よりも直感的


Git Tree Compare

あるブランチを Base に指定すると、現ブランチとの分岐点からの差分比較をしてくれる拡張。

Git Tree Compare

image.png

master をベースにした、カレントブランチとの差分


  • 変更ファイルを一覧表示してくれる。しかも自動更新



    • 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 対応に期待。

Github 編に続く


おまけ


git config 切り替え

例えば、Github と 社内 Gitlab で SSH key を分ける場合、~/.ssh/config を使うと思うが、ユーザ名やメールアドレスも変えたい場合、困るケースがある。

そんな時は、includeIf を使うと便利。

C:/ghq 以下に Github プロジェクトを集中させている場合


~/.gitconfig_github

[user]

name = github_user
email = github_user@example.com


~/.gitconfig

..

[includeIf "gitdir:C:/ghq/"]
path = ~/.gitconfig_github


こんな感じに、個別に設定ファイルを作成し、includeIf でフォルダパスが条件にヒットした場合のみ読み込むということができる。

詳しくは、以下の記事がとても良くまとまっているので参考に

gitアカウントを作業フォルダによって自動で変更できるようにする