IntelliJでのgit操作

# IntelliJでgitを使う

[kb advent calendar](https://adventar.org/calendars/9546) 11日目の記事です。

IntelliJユーザーで数年ほど課金して使っています。
最近はgitの操作もコマンドですることが減り、IDE上で完結することが多いです。
IntelliJのgit操作について、便利な機能を紹介します。

## 通常操作

よく使うコマンドは、pull,commit,push,new branch,checkout,merge,stash/unstashくらいです。
このあたりはショートカットを覚えれば、コマンドラインでやるよりもわりと早く作業出来る気がします。

- pull(⌘+T)
- commit(⌘+K)
- push(⌘+⇧+K)
- new branch(⌘+⌥+N)
- checkout(⌘+⇧+P)
- merge(⌘+⇧+A -> merge)
- stash/unstash(⌘+⇧+A -> stash / ⌘+⇧+A -> unstash)

## コンフリクト解消

コンフリクトが発生した場合は、IDE上で解消することが出来ます。
上記のmergeコマンドを実行すると、コンフリクトが発生した場合はコンフリクト解消画面に移動します。
再度この画面を出したいときはLocal ChangesのResolveボタン、もしくはショートカット(⌘+⇧+A -> resolve conflicts)で出せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/3f427b52-eea5-f63d-ea92-8f51065581d0.png)
![img_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/ad0f2f5a-ee81-76f6-e5cc-c6d4b859f28d.png)



## Shelf

shelfは、stashと同じように変更を一時的に退避する機能です。

shelfはintellij独自の機能で、stashとは違い、変更を退避するだけでなく、変更を別のブランチにコミットすることも出来ます。

コードを書いている途中で、別のブランチに移動したい場合に便利です。

退避させたい変更がある状態で、Shelve Changesを選択(⌘+⇧+A -> Shelve Changes)すると、Shelf画面が表示され、名前を付けて退避することが出来ます。

または、以下のように、現在の変更がある際にチェックアウトした際、Smart Checkout画面が表示されます。
この際にForce Checkoutを選択すると現在の変更は削除されますが、Smart Checkoutを選択すると、現在の変更をチェックアウト先のブランチにマージする画面に遷移し、そこでskipを選択すると現在の変更をShelfに退避することが出来ます。

![img_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/8a37c1d2-5100-21a8-401e-5d404d3fefab.png)


退避した変更は、Shelfタブから確認・復元することが出来ます。

![img_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/12cff73c-a7d0-2427-8478-97f5467197eb.png)


## コミット修正

過去のコミットを修正したい場合、リベースを行います。

ここでは、3つ前の `テストコミット2` に修正を加える例を紹介します。

![img_8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/ed39bbb9-7a44-2565-0801-a59fbf2846ec.png)

まず、リベースを行うコミットの一つ前のコミットを選択し、右クリックから `Interactive Rebase` を選択します。

![img_9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/3bedf57e-c629-0c66-34cd-0edd80e7c6b1.png)

すると、Interactive Rebase画面が表示されるので、修正したいコミットの `Stop to Edit` を選択し、 `Start Rebase` をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/87cd817a-dfdb-879f-8b23-119ea1cfa636.png)


すると、編集したいコミットの変更が行われた状態で、該当のコミットに黄色いラベルが付きます。

![img_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/0c082c4b-4fd9-6127-b6f2-882159530e4f.png)

ここで、該当のコミットを修正するため、 `テストコミット2` を選択し、`Undo Commit` を選択します。

![img_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/9ba53eef-40c7-364b-f2c8-d57dfc4fad53.png)

そうすると、コミットが取り消され、`テストコミット2` の変更をコミットする前の状態に戻ります。

![img_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/16c6aa36-ec6b-2deb-8742-91a1ff606d8e.png)

行いたかった修正を行い、コミットします。

![img_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/256bee0e-2056-3d43-dafe-f95bce6d97c4.png)

コミット後、ブランチ一覧から、`Continue Rebase` をクリックすると、コンフリクト解消画面に遷移するので、コンフリクトを解消します。

![img_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/82959ef2-83b4-298c-f96a-64600e4d9c1b.png)


コンフリクト解消後、 `Continue Rebase` をクリックすると、リベースが完了し、以下のように過去のコミットが修正されていることが確認できます。

![img_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103878/c6f305e0-6fbd-55a8-c2a6-251c8d0365e6.png)


## まとめ

IntelliJを使用したgit操作について、自分がよく使う便利な機能を紹介しました。 gitの操作をIDE上で完結させることで、コマンドラインでの操作よりも作業効率が上がると思います。 ぜひ、参考にしてみてください。

ちなみにWorkTreeを作成したりなどは出来ないようなので、そういったことはコマンドラインでやる必要があります。