S○urceTreeやG○tKrakenなんて目じゃない!?JetBrains製品(IntelliJ IDEA等)のGit機能の使い方

# はじめに
**一部タイトル詐欺が含まれます
(SourceTreeの行ごとにコミット機能がない(ブロック単位は可))**

JetBrainsの製品はSVNやGit向けのバージョン管理機能を持っています。
その中でもGitに着目し、使い方を紹介します。

スクリーンショットはWindows 10 & IntelliJ IDEA 2019.3.1 (Ultimate Edition)を利用しています
(紹介しているものはIntelliJ IDEA Communityをはじめ、他のJetBrains製品でも利用できます)

なにか詰まったことがあればトラブルシューティングの章を参照してください
それでも解決できない場合はコメントをください

> 本記事内ではダイアログとモーダルをまとめて「ダイアログ」と表記します

# Git機能を有効にする方法
## 既存プロジェクトで有効にする
### ローカルリポジトリを作成するだけの場合
1. IDEで既存のプロジェクトを開きます。

2. メインメニュー内の「VCS -> Enable Version Control Integration」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/b68d3ba5-0542-8762-1ef7-e797afe1a687.png)

3. Enable Version Control Integrationダイアログが開くので、

4. 「Select a version control system to...」が「**Git**」になっていることを確認し「OK」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/2681e5a8-1259-ea37-285c-a56a792e7c8d.png)

5. 画面左下に「Version Control」タブが挿入され、Gitが有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/7c61ca83-29d5-e046-3bf9-c49450d80a29.png)


### GitHubでリポジトリを作りつつGitを有効にする場合
1. IDEで既存のプロジェクトを開きます。

2. 「VCS -> Import into Version Control -> Share Project on GitHub」をクリック

3.  (GitHubへのログインがある場合もあり)

4.  「Share Project On GitHub」ダイアログにリポジトリ名やプライベートか否かなどの設定を行い、「Share」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/0e822118-8841-2a4e-9489-858896435add.png)

5. 画面左下に「Version Control」タブが挿入され、Gitが有効になります。

## git(GitHub, GitLab, GitBucket等)からクローンする
1. IDEを開いた際に表示される「Welcome to `<IDE名>`」ウィンドウから「Get from Version Control」をクリックをします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/8fbbb375-34bb-7833-a91a-457f939a0262.png)

2. 「Get from Version Control」ダイアログ内の左メニュー「Repository URL」を選択するとGitからクローンを行うことができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/b71ded2e-1002-feae-834a-22b892d3010b.png)

3. ダイアログ内の「Version control」が「**Git**」であることを確認し、「URL」にURLを入力、「Directory」に保存先を選択し「Clone」をクリックします。

> URLはGitサービス等から取得してください。
> GitHubでは各レポジトリページ内の右上にある「Clone or download」をクリックすることで表示されるメニュー内から取得できます。
> 例)
> <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/9695eaf4-9f80-ce0a-8930-ee6d49e15f82.png" alt="GitHub">

4. Clone終了後、プロジェクトの構成を尋ねられ(ることが多い)プロジェクトが開かれます

5. 画面左下に「Version Control」タブが表示されていればGitが有効になっています

# パネル解説
## Version Control
Version Controlパネルは画面左下の「Version Control」タブをクリックすることで表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/19ef30db-39d0-b4f3-463e-f8fddc6309d2.png)

開いた直後に表示される「Local Changes」タブでは追加/変更/削除されたファイルや、まだバージョン管理に入っていないファイルを確認できます。
また、ファイル名をクリックすることでファイルの内容確認/変更や変更点の確認ができます。

他にもChangelist作成やコミットなども行えますが後ほど解説します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/0ce70e0c-c0ac-819c-2c4b-7f1b2044f8e9.png)
「Log」タブではブランチの状態やコミットの状態が確認できます。
コミットを右クリックすることでReset, Revert, Cherry-pickなどの操作ができます。

## プロジェクトビュー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/d6bdf5ef-a3ce-01b6-0569-9a677f9b8c04.png)

プロジェクトビューはIDEウィンドウの左上にあるProjectタブから開くことができる。
Gitが有効になっていると、ファイルの状態によって色が変わります。

|色|状態|
|:--:|:--|
|赤|Gitで管理されていない|
|緑|Gitで管理されている新規作成のファイル|
|青|Gitで管理されている変更を加えたファイル|
|黒|Gitで管理されている変更のないファイル|
|黄|.gitignoreで指定されている無視するファイル|

## エディタ
エディタは画面中央に表示されるファイルを編集するパネルです

### 変更点
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/b200ec5f-e1fe-d91a-2bf3-9e5b3a777e18.png)

エディタ内ではファイルの変更を確認できます。
変更がある行は行番号の横に色やアイコンが表示されます。

|色 or アイコン|状態|
|:--:|:--|
|緑|新規追加された行|
|青|編集された行|
|▶|削除された行|

色やアイコンをクリックすることで過去の状態を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/07805269-3c2d-9f9e-aaa5-9f60bf91a1bd.png)
Rollbackアイコン(![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/302a7822-b586-dd01-0cae-2938561c6c48.png))をクリックすることで過去の状態に行を戻すこともできます。


### annotate
行番号と編集部分との間を右クリックし、「Annotate」をクリックすると、Annotateが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/c16bf754-2f40-4f67-d829-0bc39aaf8bd3.png)

Annotateは誰がいつ変更したのかを表示し、行をクリックすることでどのコミットで変更されたのかを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/60c7eb4b-6e25-798b-4e17-5428c20d50a4.png)


### history
エディタを右クリックし、「Git -> Show History」をクリックすることで、ファイルの変更を確認できるパネルが開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/b6bb8517-16bf-e07d-af09-21839f26fe88.png)


パネルではいつどんな内容が変更されたのか、どのコミットで変更されたのかを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/2f2aee72-693e-4005-b847-8b27438ffea7.png)

エディタで範囲選択を行い、「Git -> Show History for Selection」をクリックすることで、選択範囲のみの変更を確認できます。


# 基本機能
## コミット
コミットは「VCS -> Commit...」、または(設定次第で)様々な場所にある![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/8e0c12f2-822f-931c-9eb7-0cb4d1cefe92.png)アイコンをクリックすることで行えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/7e325091-eca7-3add-cf7e-db6171842874.png)

「Commit Changes」ダイアログでは

- コミットを行うファイルの選択
- コミットメッセージの編集
- Commit Authorの変更
- Amend Commitの有効化
- Sign-off Commitの有効化
- コミット前にコードの分析を行うか(エラーチェックを行うか)
- コミット後にデプロイを行うか

などの設定が行えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/61b699af-10c0-3fae-7cab-65ecd25db75a.png)
ダイアログ下部の「Commit」をクリックすることでコミットが行えます
「Commit」ボタン内のメニュー、「Commit and Push」はコミット後にプッシュダイアログを表示します。
また「Create Patch」ではコミット予定のファイルのpatchを作成できます

## リモート
リモートの設定は「VCS -> Git -> Remotes...」から行えます
「Git Remotes」ダイアログではリモートの追加, 削除, 編集が行えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/f5b2b29b-c96f-b5a4-e6df-728ae70e91df.png)

## プッシュ
プッシュは「VCS -> Git -> Push」から行えます
「Push commits to `<ProjectName>`」ダイアログではプッシュされるブランチ、コミットの確認や、タグの同期も行うかを設定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/74c2c26d-0127-3d7e-4025-8de83e0ad240.png)

ダイアログ下部の「Push」をクリックすることでプッシュが行われます
また、フォースプッシュは「Push」ボタンのメニュー内「Force Push」をクリックすることで実行できます

## reset
リセットは「VCS -> Git -> Reset HEAD...」から行えます。
しかしこの方法ではreset先のhashやtagが必要なため、あまり便利とは言えません

便利なresetの方法として、Version Controlパネル内Logタブより、戻りたいコミットを右クリックし
「Reset Current Branch to Here」をクリックする方法を紹介します
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/9339d762-9221-d139-f247-fbc1ed39a79a.png)

「Git Reset」ダイアログではreset後のファイルの扱いを変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/ba7e63c2-1bdc-8486-1f2e-a492a787f56a.png)
下部の「Reset」をクリックすることでresetが行えます


## revert
Version Controlパネル内Logタブより、戻りたいコミットを右クリックし
「Revert Commit」をクリックすることでrevertを行えます

「Conflicts」ダイアログは[コンフリクト](#コンフリクト)で解説しています


## ブランチ
ブランチの操作は画面右下から行えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/c4ccc354-011f-e59c-cc5e-866382d3a750.png)

「+ New Branch」をクリックするとブランチの新規作成
「`<branchName>`」を右クリックするとrename, delete, checkoutなどが行えます。


## マージ
マージを行う前にマージされる側のブランチにチェックアウトしてください。
(ex. developブランチをmasterブランチにマージする場合はmasterブランチにチェックアウト)
マージは「VCS -> Git -> Merge Changes...」から行えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/bf313074-d855-9b9d-c2ca-876dcd7a72a3.png)
「Merge Branches」ダイアログではマージ先のブランチの選択、squashやno fast forwardにするかなどの設定が行えます。
ダイアログ下部の「Merge」をクリックすることでマージが行えます。

### コンフリクト
コンフリクトが発生すると「Conflicts」ダイアログが開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/a2ece83b-b4a2-61b3-a63e-cb3e1701b182.png)
ダイアログにはコンフリクトしたファイルの一覧が表示されます
「Accept (Yours|Theirs)」ボタンをクリックするとすべてのファイルが選択したコミットのファイルになります
また、ファイルをダブルクリックすることで細かくどちらの差分を反映するのか指定できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/f3dcc5c1-8adb-1ee2-23d2-9fa116245f2b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/98ded33f-d238-0fb7-21bf-616b8607ee8a.png)または![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/077e755d-c0f9-4bcf-b82a-c0ab57f76afb.png)アイコンをクリックすると、マージに変更を加えることができます。
また![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/4b7ef1af-d87a-f09a-64d3-cd0fd93d7b99.png)をクリックすると変更を破棄できます

すべてのコンフリクトを修正し、下部の「Apply」をクリックすることでマージが完了します


## stash
### 作成
stashの作成は「VCS -> Git -> Stash Changes...」から行えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/30522489-22ce-bb59-abef-4df665c3f5fe.png)
「Stash」ダイアログではメッセージを設定することができます。
「Create Stash」をクリックすることでstashを作成できます

### 復元, 削除
stashの復元, 削除は「VCS -> Git -> UnStash Changes...」から行えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/ed76f901-4e91-5567-9e64-fe8dffcbf27f.png)
「UnStash Changes」ダイアログでは

- 「View」をクリックすると含まれている変更を確認
- 「Drop」をクリックするとstashを破棄
- 「Clear」をクリックするとすべてのstashを破棄

ができます。
復元したいstashを選択し、「Apply Stash」をクリックするとstashをファイルに反映できます


## Changelist
Changelistを使うと、変更をまとめてリストごとに管理することができます。
標準で`Default Changelist`と`Unversioned Files`というリストが存在しています。

Changelistの作成や削除はVersion Controlパネル内の![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/a0b137e5-6778-6640-2ab7-18e2f34eef39.png)からできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/8d456ebe-62c2-0f7c-0dc0-88582457c7f4.png)

ChangelistからChangelistへ変更をD&Dで移動することもできます
![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/6fff00a6-fb3d-2827-8c2c-e3be21cf4d97.gif)

また、エディタ内で変更点を選択することで、変更点ごとにチェンジリストに反映できます
![image.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/7fdc1198-ddf2-4e9f-9af6-d501fb3e1492.gif)

> この機能, 変更点が1ブロックだと分割して別々のChangelistに登録のような操作ができません
> 公式のYouTrack(GitHubでいうissueを管理するツール)では[上記の操作ができないというチケット](https://youtrack.jetbrains.com/issue/IDEA-186988)があるため、そのうち対応すると思われます
> ~~S〇urceTreeなんか目じゃないといいつつ。。。無念~~


## Tasks機能 (issue連携)
Tasks機能とは、IntellIJ内で作業リストを整理できる機能です。
チケット駆動の場合、作業リスト = issueやticketといえます
そしてそれらを管理するJiraやRedmine, Trello, GitHubなどのサービスと連携する機能があります。

連携の設定は「File -> Settings -> Tools -> Tasks -> Servers」から行います

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/80ee41f0-315e-96e0-f202-81904e0ca963.png)
「![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/b655d391-cd42-f381-7bbe-7c454a384c11.png)」をクリックし、Serverの追加を行ったあと、「OK」をクリックし離脱すると画面右上のツールバーにTasksプルダウンが挿入されます。

「Default task -> Open Task...」をクリックするとTaskの作成が行えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/0d22349a-8324-6d6e-8676-100411cc8569.png)
連携したサービスのticketやissueはここから選択します。
また「Create New Task `<上のTextFieldの中身>`」をクリックすると、IntelliJ上でのTaskを作成できます
(連携したサービスに新しいissueやticketができるわけではない)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/7f9befca-c08a-ddbf-67f5-95d578fc596f.png)
Taskの作成を行うと、「Open Task」ダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/05c2f6d3-230d-3781-2cd8-b30abc4ce3fb.png)
IntelliJ上ではContextという単位で開いているファイルの状態などを管理しています。
ContextをTaskごとに管理する場合には「Clear current context」のチェックを入れてください。
Task用にChangelistやbranchを作成することもでき、それらの設定もこのダイアログで行えます

この時にChangelistを作成しておくと、どの変更を管理しているのかわかりやすいので利用しましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/9bb82382-0229-bf15-1e92-a099f1a1997d.png)

ツールバー内のTasksメニューから他のTaskを選ぶとTaskを変更することができます。
またChangelistに変更がないときにTaskを変更すると、Taskを削除するか尋ねられます


## Pull Request確認(GitHub)
IntelliJでGitHubのアカウントを追加しておくとPull Requestを確認できます
「File -> Settings -> Version Control -> GitHub」からアカウントの追加が行えます
GitHubのアカウントが登録されていて、かつGit RemotesにGitHubのリポジトリが登録されていると、Version Controlパネルに「Pull Requests」タブが表示されます。

# トラブルシューティング
## Version Controlタブが見当たらない
左下のアイコンをクリックすることでタブを表示することができます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114420/9c05518b-6e14-ebd2-c310-b960be2a6c59.png)

# おわりに
「この(機能|操作)よく(使う|する)のに紹介されてない！」、「ここ間違ってない？」という方はコメントください。

最後になりますが、JetBrains製品の本質は`ショートカットの充実`だと思っているので、
よく使うものだけでもショートカットを覚えてあげてください