SmartGit の使い方

# 経緯
Git の Windows クライアントとしてしばらく SourceTree を使っていましたが
ブランチが増えてくるごとに遅くなってきたので、別のクライアントを探していました。

そんな中で見つけた SmartGit が割と使いやすかったので、機能をざっと調べてみました。

- 対象バージョン
 - SmartGit 6.5.8 (Windows)


ちなみに SmartGit は最初の30日間は無料で使えますが
その後はライセンス購入が必要です。


# Menu
SmartGit の全メニューを記載します。


## Menu - Repository

### Add or Create
*Ctrl + O*
新規または既存gitリポジトリを追加。

### Clone
*Ctrl + Shift + O*
リモート（ssh://）またはローカルのgitリポジトリの複製を作成。

### Close
*Ctrl + F4*
開いているリポジトリを閉じる。

### Add Group
リポジトリグループを作成。
Eclipse のワークスペース的な感じ？

### Settings
*Alt + Return*
リポジトリの設定。

### Exit
*Alt + X*
終了

***

## Menu - Edit

### Filter Files
*Ctrl + F*
Files に表示するファイルのフィルタリングができます。
* によるワイルドカード指定が可能。**便利。**

### Select Commitable Files
*Ctrl + Shift + A*
選択中フォルダ内で、コミット可能なファイルをすべて選択します。
編集中のファイルが何も無ければ、何もしません。

### Select Directory
ファイルを選択しているとき、その親ディレクトリを選択します。

### Copy Name
### Copy Path
### Copy Relative Path
### Copy Message
### Copy ID

### Clear Output
*Ctrl + Backspace*
Outputビューの内容をクリアします。

### Customize
ショートカットキー、およびツールバーのアイコンをカスタマイズできます。

### Preferences
*Ctrl + ,*
アプリの設定を行います。

***

## Menu - View
Files ビューの設定を行います。

***

## Menu - Remote

### Pull
*Ctrl + P*
リポジトリから Pull または Fetch します。
Pull は fetch + merge ですが、普通にマージするか rebase するかを選べます。

### Synchronize
*Ctrl + Y*
ローカルファイルの Push および、リモートからの Pull を一連して行います。

### Push
*Ctrl + U*
現在のブランチをリモートに Push します。

### Push To
*Ctrl + Shift + U*
特定のブランチ／ポイントの Push や、Force Push はこちらで行います。

### Add
リモートリポジトリを追加します。

### Fetch More
リモートから Fetch を行います。

### Rename
### Delete
### Submodule

### Properties
リモートのURLを変えるときはここで行います。

***

## Menu - Local

### Stage
*Ctrl + T*
選択したフォルダ内で、未ステージ状態のファイルをステージに上げます。

### Unstage
*Ctrl + Shift + T*
Stage の逆。

### Index Editor
ファイル選択時、Index Editor なるものを表示します。
使い道はよくわかりません…

### Ignore
### Rename

### Toggle 'Assume Changed'
ファイルの 'assume-unchaned' フラグをトグルします。
このフラグは、そのファイルを無視したいときに使います。

もしローカルでファイルが変更されていたとしても、それは無視されます。
これは例えばリモートからPullしたときに、ローカルファイルの変更内容が上書きされることを意味します。

### Toggle 'Skip Worktree'
ファイルの 'skip-worktree' フラグをトグルします。
このフラグは、そのファイルを無視したいときに使います。

もしローカルでファイルが変更されていれば、それは無視されません。

### Resolve
*Ctrl + Shift + V*
Conflict が発生したとき、それを解消します。

### Commit
*Ctrl + K*
リポジトリに Commit を行います。
直前のコミットを取り消して、今回のコミットで上書きすることもできます。

### Undo Last Commit
*Ctrl + Shift + K*

### Edit Last Commit Message
*Shift + F2*

### Discard
*Ctrl + Z*
ローカルで変更した内容を破棄して、HEAD または Index の状態まで戻します。

- HEAD
  - リポジトリの内容まで全て戻す
- Index
  - ローカルでaddしたファイルはそのままで、リポジトリにあるファイルの変更分のみ戻す

### Remove
*Ctrl + -*
対象のファイルをトラック対象から外します。

### Delete
*Delete*
対象のファイルをローカルシステムから削除します。

### Reset
*Ctrl + R*
git reset を行います。
通常ローカルで変更した内容を戻すときには reset を使うのですが
Smartgit では前述したように Discard コマンドがあるので、
こちらの Reset はもっと特殊な用途で使うことになるはずです。

### Squash Commits
*Ctrl + J*
ローカルリポジトリ上での複数のコミットを、一つにまとめます。
使い方を説明します。

まず、Outgoing ビュー上で複数のコミットを選択します。
> Outgoing ビューは、まだリモートに Push していないコミットの一覧を表示します

ここで、メニューから Squash Commits を選択、もしくは *Ctrl + J* します。
すると、コミットメッセージを入力するダイアログが現れるので、メッセージを入力して
「Squash Commits」します。
すると、その複数のコミットが一つにまとめられます。

条件として、選択する複数のコミットは連続したコミットである必要があります。
つまり、A -> B -> C とあった場合、AとCを選択して Squash することはできません。

Squash Commits を使えば、ローカルでこまめにコミットしていても
リモートに Push する前にそのコミットを一つにまとめてしまえば
最終的に残るコミットが一つになるので、非常にすっきりしたコミット履歴を保つことができます。
**Squash Commits は是非使いましょう。**

### Save Stash
*Ctrl + S*
現在の状態を Stash として保存した後、HEADの状態まで revert します。

* Stash メッセージ
* untracked file を含めるか
* Stash 後、revert をしないでそのままにするか

Stash した内容は、Branches ビューの Stashes から確認できます。

### Apply Stash
*Ctrl + Shift + S*
保存された Stash の状態まで戻します。
その後、Stash を破棄するかそのまま残すかを選べます。

### Drop Stash
Stash を破棄します。

### Clean Up

***

## Menu - Branch

### Git-Flow

### Check Out
### Merge
### Cherry-Pick

### Revert
*Ctrl + Alt + M*
revert処理を行います。
revert とは「特定のコミットで行われた全ての変更を元に戻す新しいコミットを生成し、それを現在のブランチに適用する」コマンドです。

* A -> B -> C -> D

上記のようなコミットの履歴があった場合、Dで行った変更を取り消したい場合があります。
普通に考えれば、Dのコミットを取り消せばCの状態に戻るのですが
git ではこれには reset コマンドを使います。
revert はそうではなく、あくまで新しいコミットを作成します。

D の段階で revert コマンドを実行すると、対象となるコミットを選択するダイアログが開きます。
ここで間違えやすいのが、Cのコミットを選択してしまうことです。
ここで選択すべきなのは、「取り消したいコミット」です。
つまり、Dを選択します。
すると、以下のようになります。

* A -> B -> C -> D -> D'

D' の内容はDの内容を完全に打ち消すものなので、結果的にこのブランチの内容はCのときと同じになります。

### Rebase
各種 rebase 処理を行います。
この処理は便利ですが、rebase の動作をよく把握したうえで使うようにしましょう。

#### Rebase HEAD to
*Ctrl + D*
現在のブランチの最新コミット（とその関連コミット全て）を、選択したコミットに適用します。

#### Rebase to HEAD
*Ctrl + Shift + D*
選択したコミット（とその関連コミット全て）の内容を、現在のブランチの先端に適用します。

### Add Branch
*F7*
ブランチを作成します。

### Add Tag
*Shift + F7*
現在のブランチにタグを作成します。

### Rename
### Delete

### Set Tracked Branch
現在のブランチに、追跡ブランチを設定します。
通常はリモートブランチをローカルに checkout するときに自動的に追跡ブランチが作成されますが
ここでは手動で追跡ブランチを設定できます。

### Stop Tracking
追跡ブランチを解除します。

***

## Menu - Query

### Open
選択しているフォルダやファイルを開きます。

### Show Changes
*F4*
選択したファイルの、HEADからの変更内容を表示します。

### Conflict Solver
ファイルの衝突を解消するウィンドウを開きます。

### Log
*Ctrl + L*
選択したファイルのgitログを表示します。
ブランチを選択していた場合、ルートディレクトリのgitログを表示します。

### Blame
*Ctrl + Shift + L*
選択したファイルの blame を表示します。
これは、ファイルの各行がどのコミットで変更されたかを一覧で見るものです。
これによって、バグ混入の時期や犯人を探すのが主な目的です。

***

## Menu - Changes

### Reload
*Shift + F5*

### Undo

### HEAD vs. Index
HEAD と Index の内容を比較します。

### Index vs. Working Tree
Index と作業ツリーの内容を比較します。

### Previous Change
*Shift + F6*
前の変更を表示します。

### Next Change
*F6*
次の変更を表示します。

### Ignore Whitespace for Line Comparison
空白を無視して比較します。

### Ignore Case Change for Line Comparison
大小文字の違いを無視して比較します。

### Settings
比較モードの詳細を設定します。

***

## Menu - Tools

### Open File
### Open in Explorer
### Open in Terminal
### Reveal in Explorer
### Open Git-Shell
### Set Excutable Tag
### Unset Excutable Tag
### Apply Patch

***

## Menu - Review
### Create Pull Request
### Sync
### Configure

***

## Menu - Window

## Menu - Help


# Window - Repositories
gitリポジトリを管理するウィンドウ（ビュー）です。
複数のリポジトリを管理できますが、カレントリポジトリは常に一つだけ選択されます。

また、Eclipse の Working Sets のように、複数のリポジトリをグルーピングして管理できます。


# Window - Files
Repositories で選択したフォルダ内にあるファイルから
フィルタリングした結果をリストアップするビューです。

### nnn files hidden
フィルタリングされて非表示になっているファイル数

### File Filter
Ctrl + F でアクティブになります。
フィルタリングする文字列を指定します。
通常は * などでワイルドカードが指定可能ですが、正規表現での指定も可能です。
また、指定した文字列はパターンとして保存することができます。

### Files from Subdirectories（アイコン1）
*Ctrl-0*
Repositories で選択したフォルダのサブフォルダまで全て表示対象とします。
デフォルトON

### Show Unchanged Files（アイコン2）
*Ctrl-1*
変更が無いファイルも表示対象とします。
デフォルトOFF

### Show Unversioned Files（アイコン3）
*Ctrl-2*
まだバージョン管理されていないファイル（ex. 新規作成ファイル）も表示対象とします。
デフォルトON

### Show Staged Files（アイコン4）
*Ctrl-4*
ステージに上がっているファイルを表示対象とします。
デフォルトON

### Show Ignored/Skipped Files（アイコン5）
*Ctrl-3*
.gitignore によって無視されたファイルも表示対象とします。
デフォルトOFF

### Show Assume Unchanged Files（アイコン6）
*Ctrl-5*
'assume-unchaned' フラグが付いたファイルも表示対象とします。
このフラグは、git管理されているが一時的にそのファイルを無視したいときに使います。
デフォルトOFF

# Window - Outgoing
まだプッシュされていないコミットを一覧を表示します。

# Window - Branches
カレントリポジトリの全ブランチを表示します。
それを含め、以下のものが表示されます。

- ローカルブランチ一覧
- リモートブランチ一覧
- タグ一覧
- Stash一覧

ウィンドウ内では、ブランチ名のインクリメンタルサーチが可能です。
大量のブランチを扱うとき、この機能がとても重宝します。


# Window - Blame
ファイルの blame コマンド実行時に表示されるウィンドウです。
なかなか高機能です。

## ツールバー

### View Commit
blame対象とするコミットを指定します。

### Highlight
どの行をハイライト表示するかを選択します。

- Changes Since
 - 特定のコミットを指定し、そのコミットとの差分をハイライト表示
- Age
 - 行が変更された時期によって、色分け表示
- Auther
 - 行を変更した Author によって、色分け表示

### Commit
Highlight = Changes Since にしたときのみ有効
差分表示対象とするコミットを指定します。

## Windows - Blame - ショートカット

### Find
*Ctrl + F*
ファイルから文字列を検索します。
インクリメンタル検索できないのがイタい。

### Go To First Commit
*Alt + Home*
このファイルの初回コミットに移動します。

### Go To Previous Commit
*Alt + Up*
一つ前（過去）のコミットに移動します。

### Go To Next Commit
*Alt + Down*
一つ先（未来）のコミットに移動します。

### Go To Last Commit
*Alt + End*
このファイルの直近のコミットに移動します。

### Go To Line
*Ctrl + G*
指定行に移動します。

### Line History
*Ctrl + Shift + 1*
選択した単行の全変更履歴を見るウィンドウを下部に開きます。

### Close
*Ctrl + F4*
ウィンドウを閉じます。



# Repository Settings
リポジトリの設定ウィンドウで設定できる内容について記載します。

## Remember as default
ここで設定した内容をデフォルトとして設定し
他のプロジェクトでも適用します。

## Pull

### For new branches configure to

新しくブランチを作るときの設定をします。

- Merge fetched remote changes
 - リモートで変更された内容を、merge して取り込む
- Rebase local branch onto fetched changes
 - リモートで変更された内容を、rebase して取り込む

### Prune obsolute remote tracked branches
リモートから削除されたブランチをローカルで削除するかどうか。
デフォルトON

### Always fetch new commits, tags and branches from submodule
サブモジュールからのコミットなどもフェッチする。
デフォルトOFF

### Update registered submodules
登録されたサブモジュールを更新する。

## Commit
コミットするときの名前とemailの設定。

## Text encoding
このリポジトリの文字エンコーディングを指定。
**Windows で作業する場合、UTF-8 に変えておくこと。**

# Preferences
ここについては後ほど…

## Commands
## User Interface
## Hosting Providers
## Tools
## Proxy
## Smartgit Updates
## Crash Reporting