RubyMineでgit操作（checkout、push、pull、commit、diff、merge、conflict）

いままではSourceTreeというGUIツールでgitを操作していましたが、RubyMineの内臓機能を使ってみたらだいぶ快適でしたので、まとめます。勉強中、試行錯誤中のため、誤りや、より効率的な方法があれば教えてください🙏

## 環境、前提

RubyMine 2021.3.1
macOS Catalina
リモートリポジトリ：GitHub

GitHubアカウントが登録済みであり、リポジトリも登録済みの前提で記載します。
もしかすると他のJetBrain製品でも参考になるかもしれません。（未確認です）

## RubyMineにGitHubアカウントを登録する

以下の画面からGitHubアカウントが登録できます。
Preferences > Versin Control > GitHub
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/ce30d813-9d97-b9f4-ab82-628243e2be32.png" width="500">
方法は3つあります。

<dl><dt>Log In via GitHub</dt>
<dd>OAuthでGitHubと連携する方法です。</dd>
<dt>Log In with Token</dt>
<dd>GitHubでパーソナルアクセストークンを生成し、RubyMineに登録する方法です。</dd>
<dt>Log In toGitHub Enterprise</dt>
<dd>企業向けの有料GitHub？これはわからないので説明していません。</dd></dl>


### 「Log In via GitHub」の手順

「+」マーク→「Log In via GitHub」
ブラウザが開き、JetBrainのページが表示され、GitHubを許可しますか？のように聞かれるので、承認すればOKです。
詳しく覚えていないのですが、画面の指示通りに操作すれば大丈夫です^^;
ただ、私のGitHubアカウントの場合、organization側の承認も必要だったようで、面倒だったので下の方法でやりました。

### 「Log In with Token」の手順

「+」マーク→「Log In with Token」
このようなダイアログが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/05a0133c-317a-f80b-38c3-706d257d1d77.png" width="400">
連携に必要な権限が付与されたトークンをすでに持っていれば入力すればよいのですが、今回はトークンを生成するところから記載します。

「Generate」をクリック
↓
ブラウザでGitHubの認証画面が表示されるのでパスワードを入力
↓
パーソナルアクセストークンの作成画面が表示されます。
必要な権限がすでにチェックされています。
![スクリーンショット 2022-01-19 22.54.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/e069c137-8cee-1664-c17f-71a52dc202fd.png)

そのまま「Generate token」クリック
↓
トークンが生成され、画面に一度だけ表示されます。
トークンをコピーし、RubyMineに入力して「Add Account」します。

下がGitHubアカウントを追加できた状態です。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/037efa92-e249-9e1d-ebc8-71188bfaf542.png" width="500">

## ステージングをONにする設定

RubyMineではデフォルトでステージングがありません。changelistsという変更ファイル群から選択してコミット、という操作を行います。個人的にはステージングがあった方が通常のgitと同じ感覚で操作できるので、設定を変更してステージングを出すようにします。

Preferences > Version Control > Commit > 「Use non-modal commit interface」 をON
Preferences > Version Control > Git > 「Enable staging area」をON

## Git関連のウィンドウ

### Gitウィンドウ

command + 9 で表示されます。
ブランチ一覧、変更履歴などが確認できます。
ドッキングさせていると狭くて使いにくいので、私はFloatで使っています。
![スクリーンショット 2022-01-22 19.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/68ae2b09-becc-182f-0804-17604e3c3120.png)

### Commitウィンドウ

command + 0 で表示されます。
変更差分、diffを見て、ステージングし、コミットするためのウィンドウです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/9181b982-a8a1-f2d7-144f-0a38264be2b4.png" width="400">


## Git操作

### ブランチのcheckout

Gitウィンドウのブランチ一覧
ブランチ名の上で右クリック→Checkout
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/e4ad86cf-e911-a9cb-3ddf-17e79ccfd512.png" width="400">

この方法でリモートブランチを落とすことも、ブランチを切り替えることもできます。

ちなみに、RubyMineの右下にあるブランチ名をクリックすると、ブランチ一覧がポップアップされ、ここからもブランチの切り替え操作ができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/ea8caa6b-e92c-f913-eaeb-61ead6a7696d.png" width="500">

ブランチ一覧で矢印（↙↗）アイコンが表示されることがあります。
まだ取り込んでいない変更がある場合は青色下向きアイコン、
まだpushしていないcommitがある場合は緑色上向きアイコンが表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/faa0f166-3b70-6e27-0e3c-aa26153ee60a.png" width="400">


### ブランチの削除

ローカルブランチを削除するには、ブランチ一覧から対象のブランチをクリックし、Delete
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/d621523b-15b2-6190-f662-a69155efba65.png" width="500">

同時にリモートブランチも削除する場合は、上記の操作の直後に表示されるこちらのお知らせの「Delete Tracked Branch」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/b25c34a4-71e5-5f88-62e2-fa6a1fb806b6.png" width="300">


### fetch、pull

Gitメニュー > Fetch
Gitメニュー > pull

### commit

ファイルを修正後、Commitツールウィンドウで差分の確認ができます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/331a508e-3206-e1e1-7591-efd26fa3910e.png" width="400">

差分を確認するには、ファイルを選択してダブルクリック、もしくは command + d でdiffを表示します。
![スクリーンショット 2022-01-27 14.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/49f8192f-d646-e2e2-4b6d-bbc536a10414.png)

問題なければ、ドラッグしてstagedに移動し、コミットメッセージを入力してcommitします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/1c9eda4f-1a52-d624-6957-930887b10571.png" width="400">

### commit前の変更を取り消し

間違った変更を行ごとに取り消したい場合は、diffウィンドウで「>>」をクリックするとリポジトリの状態に戻すことができます。
![スクリーンショット 2022-01-27 14.23.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/49f8192f-d646-e2e2-4b6d-bbc536a10414.png)

ファイルごと変更を取り消したい場合は、ファイルを右クリック→Rollback
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/d1e3e653-522f-2c25-390b-ee00dd5a0407.png" width="400">

### push

Gitメニュー > Push

### merge

マージ先のブランチをcheckoutしておき、
Gitメニュー > Merge
こちらのダイアログが開きます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/b616db86-2bfb-e574-5771-eb59c7f273c4.png" width="400">
マージ元のブランチを選択して実行すればOKです。
Modify optionsからマージ時のオプションを設定できます。
この図では`--no-commit`オプションをつけています。

### 競合の解決

マージ時に競合すると、このような競合解決画面が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/9737e66d-95cc-b71d-4b5f-9d1169b479e6.png" width="500">

どちらか片方の変更で上書きする場合は「Accept Yours」or「Accept Theirs」をクリックすれば良いです。
コードの編集が必要な場合はダブルクリックして編集画面を開きます。

このような３ペイン画面が表示されます。
![conflict_resolution_tool_legend.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/c25a9217-1cb9-df02-ac78-f8cd864a088f.png)

左：現在のブランチ（マージ先のブランチ）
中央：編集結果
右：リポジトリのブランチ（マージ元のブランチ）

左右のペインは読み取り専用ですが、中央のペインは編集可能であり、マージ元、マージ先を両方見ながら作業ができます。

色の意味
赤：競合が発生した箇所
緑：追加された箇所
グレー：削除された箇所

競合の解決方法は、変更を取り込む場合は「>>」をクリック、変更を破棄する場合は「☓」をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283492/48a21bfe-e6de-0309-6c8b-717e100d7f2d.png" width="200">

すべて解決できたらAppleyをクリックします。
いままでは競合したとき自動で挿入される`======`みたいなのを手動で消していたのですが、消し忘れやマージミスがまぁまぁ発生していました。とくに削除行がマージミスにより復活してしまうことが多く…。
このRubyMineの競合解決画面はそのあたりの問題を解決してくれそうです。とてもお気に入りです。

## 参考サイト

https://pleiades.io/help/ruby/using-git-integration.html