VSCodeでラクラクGit操作

## 概要

皆さんVSCode使ってますか？TypeScriptやPythonなど複数の言語を使う場合に、一つのエディタで完結できる、VSCodeはとっても便利です。VSCodeには様々な拡張機能があるのですが、今回はGitを便利に使うためのTipsについて紹介したいと思います。

この記事を読めば、VSCodeでGit管理を完結することが出来るかと思います。今回はサンプルとしてVue.jsの公式リポジトリを使用します。開発者の方、ありがとうございます。
では、始めましょう＼(^o^)／

## 前提条件

Mac環境のVSCodeを想定しています。
(Windowsでも基本的には変わらないかと、、、)
また、下記のプラグインの追加をお願いします。

* [GitLens](https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens)
* [Git History](https://marketplace.visualstudio.com/items?itemName=donjayamanne.githistory)

## Gitの基本操作

VSCodeでのGit操作は、まず左のメニュー（？）から、ソース管理(図内の赤枠のアイコン)を選択します。
「3」のアイコンがついているのは、3つのファイルに変更があるよ、という意味です。
最新バージョン(2019年8月11日時点)なので、アイコンが異なる可能性があります。

<img width="1431" alt="error-detector_js_—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/184071d1-2409-6adf-d502-082ebc9f895e.png">


すると、下記画像のようになるかと思います。
「STAGED CHANGES」に２つのファイル(README.mdとBACKERS.md)、「CHANGES」に一つのファイル(error-detector.js)があることが分かります。
では、このerror-detector.jsをクリックしてみましょう。

<img width="937" alt="error-detector_js_—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/23493757-72b2-2142-0260-46d8bf55a87a.png">

すると下記画像のようにファイルのどの部分を変更したのかが、非常に分かりやすく表示されます。

<img width="1436" alt="error-detector_js__Working_Tree__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/802d913a-13d8-2feb-452c-59a0252fdab7.png">

ちなみに、右上にある矢印をクリックすると、「次の変更」、「前の変更」に移動することが可能です。

<img width="285" alt="error-detector_js__Working_Tree__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/da3cc3f9-53fc-1317-7867-9f336d389399.png">

また、ファイルの変更箇所については、右側にあるバーを見ることで確認できます。
下記画像では、5件の追加(緑色)と、4件の削除(赤色)が行われていることが分かります。

<img width="1444" alt="README_md__Index__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/f2b28a28-3001-e798-30e0-9cee1047122a.png">


### ステージング、アンステージング

次に、ステージング、アンステージングをVSCodeで試してみましょう。
ファイル名の上にカーソルを持っていくかファイルを選択すると、下記画像のようなアイコンが表示されます。
左から、「ファイルを開く」、「変更をステージ」、「変更を破棄」となっています。
今回は真ん中のプラスボタンである変更をステージをクリックしてみましょう。

<img width="924" alt="スクリーンショット_2019-08-11_13_18_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/31b4d2b5-56dc-943e-f232-0d55d0cb24c0.png">

すると、下記画像のように、error-detector.jsがSTAGED CHANGESに移動して、ステージされたことが分かります。

<img width="925" alt="error-detector_js__Working_Tree__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/1971c491-8ef0-35d4-fdcf-877440b3a6aa.png">

先ほどと同様にファイル名を選択すると、下記画像のようにアイコンが２つ表示されます。
左から、「ファイルを開く」、「変更のステージングを解除」となっています。
アンステージするために、マイナスのアイコンをクリックします。

<img width="924" alt="スクリーンショット_2019-08-11_13_30_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/299ba3d8-59ec-b52c-11a4-ade94e585a6f.png">

すると、下記画像のようにアンステージされたことが分かります。

<img width="944" alt="error-detector_js__Working_Tree__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/33217553-95b7-006b-6339-e20f2cb839d3.png">

### コミット

コミットは、下記画像のようにコミットメッセージを入力した後、Command+Enterか、チェックマークをクリックします。

<img width="931" alt="README_md__Index__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/92719b85-c4c2-c12e-98bb-9cf75fd8931a.png">

### その他の操作

下記画像のように三点リーダーをクリックします。
すると、いろいろな選択肢が表示されますので、使いたいものを選択して下さい。
プッシュやスタッシュはよく使う機能かと思います。

<img width="924" alt="スクリーンショット_2019-08-11_13_56_36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/364023a1-8e7c-449e-fdbc-ee6346b94a43.png">

## Git応用編

ここからは使用頻度は少ないですが、いざというときに役に立つTipsを紹介します。

### この行の変更者は誰？

チーム開発していると、このコードの意味がわからないけど、誰に聞いたら良いのか分からない。
この部分を実装した人を知りたい、ということがよくあります。
そのときに、便利なテクニックです。

まず、左のメニューからエクスプローラー(下図の赤枠)を選択して下さい。

<img width="859" alt="error-detector_js_—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/16107b02-75a6-c56e-d03f-ec7575cc11f2.png">

右上にあるGitのアイコン(赤枠)をクリックして下さい。
(Gitのアイコンが２つありますが、マウスオーバーした時に、「Toggle File Blame Annatations」と表示される方を選択して下さい。)

<img width="205" alt="スクリーンショット_2019-08-11_14_18_32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/b5a1bb91-184c-a356-c8f3-63c0e6b6e2a3.png">

すると、その行に対するコミットの対応が表示されます。

<img width="1402" alt="error-detector_js_—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/fe0a5374-4183-8a3d-dfca-57f1acd3f8cd.png">

試しに、一つコミットを選択してみましょう。
選択すると、下記画像のようになります。
Jasonさんが、8ヶ月前に変更した行がハイライトされて表示されます。

<img width="998" alt="スクリーンショット 2019-08-11 14.25.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/60f9baaf-56bf-6b4b-7680-5b442bd65a23.png">

また、いちいちボタンを押して、コミットの対応を表示するのがめんどくさい、という方は、
ソースコードの右側に表示されるコメントの部分にマウスカーソルを置くだけで、どのコミットの変更かを表示させることが可能です。
下記画像の赤枠部分にカーソルを持っていくと、ポップアップでどのコミットで変更されたのかが表示されます。
8ヶ月前のb31alaaのコミットでの変更だということが分かります。

<img width="1008" alt="スクリーンショット_2019-08-11_14_16_44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/fc06c71d-67ef-d967-b7a8-20e9b26d0132.png">

ちなみに、コードの右側に表示されるコミットの情報を非表示にしたい場合は、下記画像のように「Toggle Line Blame Annotations」を押すと、表示と非表示を切り替えることが出来ます。

<img width="1027" alt="スクリーンショット_2019-08-11_14_32_50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/036f3dce-134b-bdba-1778-119df8e82fd0.png">


### このファイルの変更履歴を見たい

あるファイルがどのタイミングでどの様な変更が行われたのかを知りたいこともよくあります。
機能追加のコミットが複数に分かれていた場合、変更のあったコミットを洗い出したい場合に、便利なテクニックを紹介します。

まず、変更履歴を見たいファイルのコード内で右クリックします。
表示されたメニューから「Git: View File History」をクリックします。

<img width="998" alt="スクリーンショット_2019-08-11_14_38_23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/1a5cc2b1-bbc9-f57f-a465-fc0a61216b29.png">

すると、下記画像のように「error-detector.js」の変更履歴のコミットが一覧で表示されます。

<img width="998" alt="File_History__error-detector_js__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/702fbd9c-bc08-f705-501b-af038cbb7f43.png">

試しに、一つコミットをクリックしてみましょう。
すると、下側にそのコミットがどのファイルを変更しているのかが分かります。

<img width="1003" alt="File_History__error-detector_js__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/7b13354f-70ff-451d-78c4-1b127e7ec6c8.png">

そのコミットでどの様な変更を行っているのかを見たい場合は、まず見たいファイルをクリックして(下図の1)、開いたコマンドパレットから「Compare against previous version」をクリックします。(下図の2)

<img width="1051" alt="スクリーンショット_2019-08-11_14_47_52.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/87711fcb-4470-04b9-bcea-000b6a89d551.png">

すると、ebcf586のコミットとd891cd17のコミットとの変更を見ることが出来ます。(下図)

<img width="1004" alt="error-detector_js__ebcef586_↔_d891cd17__—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/77834f29-b0cb-4a5d-dd8f-3d75142b43a6.png">

### 自分が作ったコミットの一覧を見たい

このパターンもたまに出会います。
自分が実装した記憶があるのですが、どのコミットでどのファイルを編集したのかがわからない場合、自分が作ったコミットの一覧がわかると、そのコミットをさかのぼって記憶を呼び出すことが出来ます。

まずコマンドパレットを開きます。(Macの場合は、Command+Shift+P)
「Git: VIew History(git log)」をクリックします。

<img width="605" alt="スクリーンショット_2019-08-11_14_57_47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/a37be1be-e9c1-5740-fdff-4ec25d6f60e5.png">

するとGit logの結果が表示されます。

<img width="994" alt="Git_History_—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/dd15e0b1-ecc1-7ffa-d334-616c544965d1.png">

右上にあるAll Authorsのプルダウンをクリックして、絞り込みたい人名を選択します。
今回は、Vue.jsの開発者であるEvan Youさんを選択します。

<img width="992" alt="スクリーンショット_2019-08-11_15_02_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/10889f4e-8418-b666-2d35-02295ce0ab11.png">

すると、下記画像のようにEvanさんのコミットのみに絞り込むことが出来ます。

<img width="998" alt="Git_History_—_vue.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/192873/07b0a1fd-d6cd-d6eb-9f48-216cb21591a7.png">

## よく使うショートカット

おまけとして、よく使うショートカットを記載します。

**コマンドパレットを開く**
Cammand+Shift+P

**ウィンドウを閉じる**
Command+W

**ウィンドウを右に移動**
Command+Shift+]

**ウィンドウを左に移動**
Command+Shift+[

## 最後に

基本的なことであれば、VSCode内でGit管理は完結できるかと思います。
一部、複雑な操作(originの変更やreflog使った巻き戻しなど)は、コマンドを叩くこともありますし、Sourcetreeも愛用しているので使うこともありますが、大体はVSCodeで欲しい機能は足りてるかな、という印象です。
他にも色々と便利な機能があると思いますので、もしよければコメントなどで教えて頂ければ幸いです。
皆さんもVSCodeで良い開発者ライフを。