Edited at

Visual Studio Code の git 連携機能と git コマンドについて (2018/05/23)

More than 1 year has passed since last update.


Visual Studio Code の git 連携機能と git コマンドについて (2018/05/23)


Git - Book 2nd Edition (2014) 日本語訳の

に出てくるコマンドに VS Code のコマンドをあてる感じで書き直してみる


理解できていないので、勉強のためにまとめてみる。

Visual Studio Code (以下、VS Code) の git 連携機能は、VS Code 自身が git 機能を持つ訳ではなく、PATH 上に存在する git コマンドを利用することで実現している。

そのため、VS Code に加えて Git を個別にインストールする必要あり。

下記のドキュメントにも記載がありますが、ほかのツールから外部エディタとして Visual Studio Code を呼び出すことを目的とした機能が追加されたため、git 2.0.0 以降が要件となっている。


Git の情報源

VS Code の git (バージョン管理) については、下記のマニュアルを参考に。

VS Code の git 連携記事:

git そのものについては、下記で。


Git クライアントとしての Visual Studio Code

コマンドを知らなくても、git リポジトリを操作できる。

もともと、Visual Studio Code では source code control に Git の利用を想定していたが、Source control manager (SCM) の登場により、このあたりはいろいろと変わってきている。

しばらくの間、バージョン管理機能は、git 一択だったけど、VS Code 1.10.0 で Contributable SCM providers と呼ばれるフレームワークに移行し、built-in だった git 連携機能は、SCM を利用する一つの拡張機能として切り出され実装しなおされた。

VS Code 1.11.0 では、Git extension enabled として default で SCM が利用されるようになり、様々な機能が追加されてきている。

Git なので、当然だけど、ローカル/リモートリポジトリを利用できる。


git コマンドと vscode の git 関連操作

ソース管理: GIT ビューで可能な git 操作はこんな感じ (・・・をクリックすると表示されるメニュー)

SCM プロバイダーの切り替え... では、ソースコード管理に利用するツールを指定できる。標準では Git のみだったが、ついに Mercurial をサポートする拡張機能 Hg - Visual Studio Marketplace が登場した。こんな感じで、機能を追加できるように VS Code 1.11 から変更になっている。

git 連携機能の実装については、下記のソースコードが参考になるかと思います。

とりあえず、調べている途中のもの。

間違いがあったりはっきりわからない部分がありますが、理解できたものから更新してく。

git コマンド
vscode コマンド
command
コマンド
バージョン

git branch
git.branch
Create Branch...
分岐の作成...

git checkout -q
git.checkout
Checkout to...
チェックアウト先...

git checkout --
git.clean
Git: Discard Changes
変更を破棄

git clean ?
git.cleanAll
Git: Discard All Changes
すべての変更を破棄

git clone
git.clone
Clone
クローン
1.10

git commit
git.commit
Commit
コミット

git commit -a
git.commitAll
Commit All
すべてコミット

git commit -a -s
git.commitAllSigned
Commit All (Signed Off)
すべてコミット (サインオフ)

git commit --amend
git.commitStaged
Commit Staged
ステージング済みをコミット

git commit -s --amend
git.commitStagedSigned
Commit Staged (Signed Off)
ステージング済みをコミット (サインオフ)

git.commitAllAmend
Commit All (Amend)
すべてコミット (修正)

git.commitStagedAmend
Commit Staged (Amend)
コミットしてステージング (修正)

git tag (-a -m)
git.createTag
Create Tag
タグを作成

git.pushWithTags
Push With Tags
タグをつけてプッシュ

git fetch
git.fetch
Fetch
フェッチ

git stash
git.stash
Stash
スタッシュ

git stash
git.stashIncludeUntracked
Stash (Include Untracked)
スタッシュ (未追跡ファイルを含む)

git stash list
git.stashPop
Pop Stash
スタッシュを適用して削除...

git stash apply
git.stashPopLatest
Pop Latest Stash
最新のスタッシュを適用して削除

git branch -d
git.deleteBranch
Delete Branch...
ブランチの削除...

git.ignore
Add File to .gitignore
ファイルを .gitignore に追加

git init
git.init
Initialize Repository
リポジトリの初期化

git merge
git.merge
Merge Bracnhe...
ブランチをマージ...

git.openChange
Open Changes
変更を開く

git.openFile
Open File
ファイルを開く

git.openHEADFile
Open File (HEAD)
HEAD のファイルを開く

git.publish
Publish Branch
ブランチの発酵
1.13 で変更

git pull
git.pull
Pull
プル

git pull
git.pullFrom
Pull (From Remote)
指定元からプル

で remote branch 表示対応

git pull --rebase
git.pullRebase
Pull (Rebase)
プル (リベース)

git push
git.push
Push
プッシュ

git push (remote) (branch)
git.pushTo
Push to...
プッシュ先...

git.refresh
Refresh
最新の情報に更新

git reset -p
git.revertSelectedRanges
Revert Selected Ranges
選択範囲を元に戻す

git add
git.stage
Stage Changes
変更のステージング

git add -A --
git.stageAll
Stage All Changes
すべての変更のステージング

git add -p
git.stageSelectedRanges
Stage Selected Ranges
選択した範囲をステージする

git.stageChange
Stage Change
変更のステージング

git.revertChange
Revert Change
変更を元に戻す

git pull して必要であれば push してる?
git.sync
Sync
同期

git pull して必要であれば push してる?
git.syncRebase
Sync (Rebase)
同期 (リベース)

git reset --hard HEAD^
git.undoCommit
Undo Last Commit
前回のコミットを元に戻す

git revert
git.unstage
Unstage Changes
変更のステージング解除

git revert ?
git.unstageAll
Unstage All Changes
すべての変更のステージング解除

git.unstageSelectedRanges
Unstage Selected Ranges
選択した範囲をアンステージする

内部コマンド
git.commitWithInput

内部コマンド
git.openResource

内部コマンド
git.showOutput

内部コマンド
git.close

リポジトリを閉じる


git 連携機能の設定項目

settings.json に出てくる Git 関連の設定 (VS Code 1.24-insiders の実装から):

  // 自動フェッチが有効かどうか

"git.autofetch": false,

// 自動更新が有効かどうか
"git.autorefresh": true,

// レポジトリを自動的に検出するかどうか
"git.autoRepositoryDetection": true,

// `Checkout to...` を実行するときに表示されるブランチの種類を制御します。`all` はすべての参照を表示します。`local` はローカル ブランチのみ、`tags` はタグのみ、`remote` はリモート ブランチのみを表示します。
"git.checkoutType": "all",

// Git リポジトリを同期する前に確認する
"git.confirmSync": true,

// Git バッジ カウンターを制御します。`all` はすべての変更をカウントします。 `tracked` は追跡している変更のみカウントします。 `off` はカウントをオフします。
"git.countBadge": "all",

// Git が配色とバッジをエクスプローラーと開いているエディターのビューに提供するかどうかを制御します。
"git.decorations.enabled": true,

// Git リポジトリをクローンする既定の場所
"git.defaultCloneDirectory": null,

// Git のサブモジュールを自動的に検出するかどうかを制御します。
"git.detectSubmodules": true,

// Git サブモジュールの検出の制限を制御します。
"git.detectSubmodulesLimit": 10,

// GPG によりデジタル署名されたコミットを有効にします。
"git.enableCommitSigning": false,

// Git を有効にするかどうか
"git.enabled": true,

// ステージされた変更がない場合はすべての変更をコミットします。
"git.enableSmartCommit": false,

// Git の警告を無視します
"git.ignoreLegacyWarning": false,

// リポジトリ内に変更が多い場合は警告を無視します
"git.ignoreLimitWarning": false,

// Git が見つからない場合の警告を無視します
"git.ignoreMissingGitWarning": false,

// コミット メッセージの入力検証をいつ表示するかを制御します。
"git.inputValidation": "warn",

// Git 実行可能ファイルのパス
"git.path": null,

// コミット前に Git が保存していないファイルを確認すべきかどうかを制御します。
"git.promptToSaveFilesBeforeCommit": false,

// Git 変更の表示内にインラインのファイルを開くアクションを表示するかどうかを制御します。
"git.showInlineOpenFileAction": true


  • VS Code の Git 操作を無効にする場合は false を設定する。標準コマンドは全て見えなくなる

  // Git が有効になっているかどうか

"git.enabled": true,


  • 異なる Git バージョンがインストールされており、明示的に利用するバージョンを指定したい場合には、バイナリへのパスを指定する

  // Git 実行可能ファイルのパス

"git.path": null,

すでに Git リポジトリとして構成されるフォルダを開いている VS Code 上で、異なる Git リポジトリとして構成されているフォルダに配置されるファイルを開くと、そのファイルを含むリポジトリ情報が SCM ビューに追加される仕様になっていた。

で、このリポジトリの自動認識機能を抑制することが可能になった。下記設定を false にする。

ただし、これを false にしてしまうと、単体ファイルとして開くことになるため、VS Code の Git 拡張機能のトラッキング対象として扱われなくなる。ファイルを編集してもエディタ上には何も反映されない。惜しい。

  // Whether repositories should be automatically detected

"git.autoRepositoryDetection": true,


出力パネル

git の機能ではなく、VS code の機能になります。VS Code が呼び出している git コマンドの出力を表示してくれる。


  • Git: Git 出力表示

Git リポジトリの操作にコマンドが発行される場合は、実行されたコマンドが出力パネルにログとして記録されてゆく。

Git リポジトリとして初期化されていないディレクトリでの出力例:

    /usr/local/bin/git から Git 2.9.2 を使用しています

git rev-parse --show-toplevel
git rev-parse --show-toplevel
fatal: Not a git repository (or any of the parent directories): .git

fatal: Not a git repository (or any of the parent directories): .git

fatal: Not a git repository (or any of the parent directories): .git


Git の基本

ここからは、Git Book の Chapter 2. Git の基本 に掲載されている git コマンド操作と VS Code コマンドを対比させながら見ていきたいと思います。


Git リポジトリの取得


参考: Git - Book: Git の基本 - Git リポジトリの取得


ユーザーは、リポジトリをどのように用意するかが記載されている。

新たに作成したディレクトリや既存のディレクトリをリポジトリとすることもできるし、既に git リポジトリとして構成されているもからコピー(clone)してきても良い。

とにかく、リポジトリを用意しないとはじまらないよということ。


既存のディレクトリでのリポジトリの初期化


参考: Git - Book: 既存のディレクトリでのリポジトリの初期化




  • git init = Git: リポジトリの初期化


VS Code 1.16 では、Multi-root をサポートするために動作が変更されている。ソース管理ビューの上段にある、リポジトリの初期化 はなくなり、コマンドパレットから Git: リポジトリの初期化 を実行することに。

その際、初期化するディレクトリを指定するように促される変更が入った。 SCM: Support multiple repositories by joaomoreno · Pull Request #31325 · Microsoft/vscode

ディレクトリ配下を Git で管理するために必要な操作。この操作により Git リポジトリを取得したことになる。新たに作成したディレクトリや既存のディレクトリを Git リポジトリとして管理するために必要な情報が格納される .git が作成される。

作成されるだけで、まだ、何も管理対象にはならないことを覚えておくと良い。

フォルダに .git ディレクトリがない場合は、ソース管理ビューには何も表示されない。


  • コマンドパレットから Git: リポジトリの初期化 を実行

からは、Multi Root Workspaces サポートに絡んで、下記のように folder を指定するよう動作が変更になっている

まで:


  • ソース管理ビューの上段にある、リポジトリの初期化 コマンドをクリック

の何れかを実行することで、git init 同じ結果を得られる。

ディレクトリが Git リポジトリとして初期化され認識されると、ソース管理ビューの上段に マークが追加されるので、これを目安にすると良い。

すでに、Git リポジトリとして構成されている場合は、何れのメニューも表示されない。

Git: リポジトリの初期化を実行した際に投入されるコマンドは下記となる (vscode insiders 1.13):

git init

git rev-parse --show-toplevel
git status -z -u
git symbolic-ref --short HEAD
git rev-parse master
fatal: ambiguous argument 'master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

git for-each-ref --format %(refname) %(objectname)
git remote --verbose

git status -z -u
git symbolic-ref --short HEAD
git rev-parse master
fatal: ambiguous argument 'master': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

git for-each-ref --format %(refname) %(objectname)
git remote --verbose


既存のリポジトリのクローン


参考: Git - Book: 既存のリポジトリのクローン




  • git clone = Git: クローン

既存の Git リポジトリのコピー(クローン)を作成するには、VS Code のコマンドパレットから Git: クローン コマンドを実行する。

クローンされたリポジトリの配置先は、(vscode 1.23 から) native dialog が開くようになったので、そこで指定する。

ディレクトリを固定にしたい場合は、"git.defaultCloneDirectory" に配置ディレクトリを設定しておく。

また、シェル (macOS) やコマンドプロンプト (Widnows) 上から、下記のように実行すると Git: Clone を叩くことができる:


  • Windows: In a Command Prompt, type: explorer "vscode://vscode.git/clone?url=https%3A%2F%2Fgithub.com%2FMicrosoft%2Fvscode-vsce.git".

  • macOS: In a shell, type: open vscode://vscode.git/clone?url=https%3A%2F%2Fgithub.com%2FMicrosoft%2Fvscode-vsce.git.


変更内容のリポジトリへの記録


参考: Git - Book: 変更内容のリポジトリへの記録



ファイルの状態の確認



  • git status = ソースコード管理ビュー

ファイルの状態を確認する git status に相当するコマンドは VS Code にはなく、git status -z -u コマンドを内部で実行し、VS Code のソースコード管理ビューとファイルエクスプローラにファイルの状態を表示する。(状態表示の簡略化を参照)


新しいファイルの追跡と変更したファイルのステージング


参考: Git - Book: 新しいファイルの追跡

参考: Git - Book: 変更したファイルのステージング




  • git add = 変更のステージング

ファイルを作成すると、そのファイルは Untracked files: となり、変更のステージング コマンドを実行することにより追跡対象となる。以後、追跡対象となったファイルの編集も同様に、変更のステージング でステージに遷移させる。

git status の情報は、ソース管理ビューに反映されるので、それを確認しながら状態を把握する。

例: 変更のステージングを extension.ts ファイルに適用した際のログ:

git for-each-ref --format %(refname) %(objectname)

git remote --verbose
git show :README.md
git show HEAD:README.md
git add -A -- /Users/satokaz/Gits/vscode-bs-ctrlchar-remover/src/extension.ts
git status -z -u
git symbolic-ref --short HEAD
git rev-parse master
git rev-parse --symbolic-full-name --abbrev-ref master@{u}
fatal: no upstream configured for branch 'master'


状態表示の簡略化


参考: Git - Book: 2.2 Git の基本 - 変更内容のリポジトリへの記録: 状態表示の簡略化




  • git status -s =

git status -s で得られる簡略表示と同じ情報が、ソース管理ビューで提供される。

ソース管理ビューには、git status -s の出力が現す 1 文字目(ステージされたファイルの状態)と、2 文字目(ファイルが変更されたかどうか)がステージング済みの変更変更にあるそれぞれのファイル名に反映される。

また、

から git status の情報が、File Explorer に反映されるようになった。(See Git status in File Explorer)

下記の 5 つの情報を反映させることができ、それぞれの色を好みの色に変更することが可能:

"workbench.colorCustomizations": {

"gitDecoration.conflictingResourceForeground": "#ff0000",
"gitDecoration.deletedResourceForeground": "#ff0000",
"gitDecoration.ignoredResourceForeground": "#ff0000",
"gitDecoration.modifiedResourceForeground": "#ff0000",
"gitDecoration.untrackedResourceForeground": "#ff0000",
"gitDecoration.submoduleResourceForeground": "#ff0000"
}

状態

modified
"gitDecoration.modifiedResourceForeground"

deleted
"gitDecoration.deletedResourceForeground"

untracked
"gitDecoration.untrackedResourceForeground"

ignored
"gitDecoration.ignoredResourceForeground"

conflict
"gitDecoration.conflictingResourceForeground"

submodule
"gitDecoration.submoduleResourceForeground"

"git.decorations.enabled": false (default: true) で無効にすることも可能。


ファイルの無視


参考: Git - Book: 2.2 Git の基本 - 変更内容のリポジトリへの記録: ファイルの無視



  • .gitignore を扱うコマンド = Git: ファイルを .gitignore に追加

.gitignore を扱うための Git: ファイルを .gitignore に追加 コマンドが、1.14 から追加された。

既存の .gitignore ファイルを編集するためのコマンドとなり、ファイルが存在しない場合は何もしないコマンド。

そのため、.gitignore は、ユーザー側で用意する必要がある。VS Code から扱うなら、下記の拡張機能をインストールしておくのもオススメ。

拡張機能
概要

gi
言語や開発環境にあわせた .gitignore ファイルのテンプレートを生成してくれる gitignore.io を VS Code から利用するための拡張機能。.gitignore ファイルが生成され、複数のテンプレートを追記してゆくことも可能。

ignore "g" it
VS Code のエクスプローラー上で選択したフォルダやファイルの拡張子をコンテキストメニューから .gitignore に追加/削除可能できる拡張機能(コマンドパレットからも可能)

.gitignore Generator
gitignore.io


ステージされている変更/されていない変更の閲覧


参考: Git - Book: 2.2 Git の基本 - 変更内容のリポジトリへの記録 - ステージされている変更/されていない変更の閲覧


Version Control in VS Code - Viewing Diffs



  • git diff = Git: 変更を開く

「変更したけれどもまだステージしていない内容」は、

ソース管理ビューで、ファイルをクリックすることで変更点を参照することが可能。または、Git: 変更を開く コマンドを実行でも可能。

デフォルトでは、変更前と変更後のファイルを横並びにして差分を表示するが、右上の … メニューにある Toggle Inline View でインライン表示することも可能。

「次のコミットに含めるべくステージされた内容」(git diff --staged or --cached) のように差分だけを表示する機能はない。


変更のコミット


参考: Git - Book: 2.2 Git の基本 - 変更内容のリポジトリへの記録 - 変更のコミット


コミットの対象となるのはステージされたものだけ、つまり追加したり変更したりしただけで、まだ git add を実行していないファイルはコミットされないことを覚えておきましょう。とあるので、覚えておく。



  • git commit = Git: Commit

ステージングされたファイルをコミットする:


  • Git: Commit

  • Git: ステージング済みをコミット

  • Git: すべてコミット (サインオフ)

  • Git: コミットしてステージング (サインオフ)

ステージングされていないファイルも含め全てをコミットする:


  • Git: すべてコミット

また、コミットメッセージの入力が必須になる。

git コマンドでは、デフォルトのコミットメッセージとして、直近の git status コマンドの結果を入れられるが、VS Code の場合は、それを手軽に入力する方法がない。

Git Hooks の githooks - prepare-commit-msg を利用することで、コミットメッセージをカスタマイズすることもできるみたい。

これと、Git commit message templates を組み合わせれば、cmd+Enter だけで commit 出来るかな?


コミットメッセージについて


commit message のテンプレート

commit 時に入力するメッセージの雛形をテンプレートからひっぱってくる git commit template も利用可能

git config --get commit.template に設定されたファイルからテンプレート情報を引っ張ってきて利用している。


ステージングエリアの省略



  • git add -a = Git: すべてコミット

追跡対象となっているファイルを自動的にステージしてからコミットを行います。


ファイルの削除


参考: Git - Book: 2.2 Git の基本 - 変更内容のリポジトリへの記録 - ファイルの削除



  • git rm

VS Code のコマンドは提供されておらず、エクスプローラからファイルを削除することで、deleted: となるので、後は、ステージングに遷移させてからコミットでも良いし、Git: すべてコミット で一気にやってしまっても良い。


ファイルの移動


参考: Git - Book: 2.2 Git の基本 - 変更内容のリポジトリへの記録 - ファイルの移動



  • git mv

こちらも、特別な VS Code のコマンドは提供されておらず、ファイルの削除と同じになるのかな。


コミット履歴の閲覧


参考: Git - Book: 2.3 Git の基本 - コミット履歴の閲覧


コミットログを見るための git log 相当のコマンドは現時点では提供されていないため、下記の拡張機能で補完する。

拡張機能
概要

Git History (git log)
git log をグラフィカルに参照することが可能

Git Lens
VS Code の Git 機能と連携し様々な機能を付加してくれる

Git History Diff
git log を参照するための拡張機能


作業のやり直し


参考: Git - Book: 2.4 Git の基本 - 作業のやり直し



  • git commit --amend


ステージしたファイルの取り消し:


参考: Git - Book: 2.4 Git の基本 - 作業のやり直し - ステージしたファイルの取り消し



  • Git: 変更のステージング解除

  • Git: すべての変更のステージング解除

  • Git: 選択した範囲をアンステージする


ファイルへの変更の取り消し


参考: Git - Book: 2.4 Git の基本 - 作業のやり直し - ファイルへの変更の取り消し


Git: 変更を破棄

Git: すべての変更を破棄


コミットの取り消し


参考: Git - Book: 7.7 Git のさまざまなツール - リセットコマンド詳説


戻す:


  • Git: 前回のコミットを元に戻す


VS Code の "すべての変更を破棄" について


リモートでの作業


参考: Git - Book: 2.5 Git の基本 - リモートでの作業


Git を使ったプロジェクトで共同作業を進めていくには、リモートリポジトリの扱い方を知る必要があります。リモートリポジトリとは、インターネット上あるいはその他ネットワーク上のどこかに存在するプロジェクトのことです。


リモートの表示


参考: Git - Book: 2.5 Git の基本 - リモートでの作業 - リモートの表示



  • git remote -v


リモートリポジトリの追加


参考: Git - Book: 2.5 Git の基本 - リモートでの作業 - リモートリポジトリの追加



  • git remote add


リモートからのフェッチ、そしてプル


参考: Git - Book: 2.5 Git の基本 - リモートでの作業 - リモートからのフェッチ、そしてプル




  • git fetch = Git: 最新の情報に更新


  • git pull = Git: プル


  • git pull branch = Git: 指定元からプル

以前の VS Code では、定期的に git fetch を実行し remote repository から更新情報を取得する動作がデフォルトだったが、git 認証用のポップアップが表示されることが混乱を招き、多くのユーザーが自動 fetch を無効にしていたため、

からデフォルトを無効とした。

動作が気に入らない場合は、"git.autofetch": falsetrue に変更する。


無効なった経緯は、Set git.autofetch to disabled, by default · Issue #34684 · Microsoft/vscodeで。



  • fetch は、持ってくるだけで、merge されたり作業中の内容を書き換えたりしない。自分で merge する必要がある

  • pull は、最初に clone した remote repository からデータを取得し、現在作業中のコードへの merge を試みる

また、pull する際に rebase を適用することも可能



  • git pull -r = Git: プル(リベース)

pull の際に、merge ではなく、rebase を適用する。


リモートへのプッシュ


参考: Git - Book: 2.5 Git の基本 - リモートでの作業 - リモートへのプッシュ




  • git push = Git: プッシュ

  • リモートを選択して psuh する場合は、Git: プッシュ先

ステータスバーの同期アイコンは git.sync コマンドを実行している。


リモートの調査


参考: Git - Book: 2.5 Git の基本 - リモートでの作業 - リモートの調査



  • git remote show


リモートの削除・リネーム


参考: Git - Book: 2.5 Git の基本 - リモートでの作業 - リモートの削除・リネーム



  • git remote rename


Git の基本 - タグ


参考: Git - Book: 2.6 Git の基本 - タグ


重要なポイントに印をつけることができる tag 機能は、VS Code 1.16 で実装された。



  • Git: タグを作成 (Create Tag)


  • Git: タグをつけてプッシュ (Push With Tags)

[#25575] Add Git Tag feature. by ashutoshdhundhara · Pull Request #26999 · Microsoft/vscode が merge されたが、showTags の機能は削除されている。

VS Code で、Tag 一覧を参照したい場合は、拡張機能: Git Tags を利用する

Git Tags - Visual Studio Marketplace


Git のブランチ機能 (Chapter 3)


参考: Git - Book: Chapter 3. Git のブランチ機能


ブランチとは、開発の本流から分岐し、本流の開発を邪魔することなく作業を続ける機能のことで、Git では頻繁にブランチ作成とマージを繰り返すワークフローを推奨している。

Git Book のこの章で、Git のブランチの仕組みについて把握しておくと良い。


ブランチとは


参考: Git - Book: 3.1 Git のブランチ機能 - ブランチとは


Git Book で、ブランチや HEAD などの考え方を把握しておくと良い。


新しいブランチの作成


参考: Git - Book: 3.1 Git のブランチ機能 - ブランチとは - 新しいブランチの作成




  • git branch = Git: 分岐の作成...

VS Code 1.11 から、branch を作成するには、コマンドパレットから Git: 分岐の作成... を実行する必要がある。


ブランチの切り替え



  • git checkout = Git: チェックアウト先...


参考: Git - Book: 3.1 Git のブランチ機能 - ブランチとは - ブランチの切り替え


ステータスバーの左下に現在、アクティブになっているブランチが表示されている。それをクリックすることで、そのリポジトリが持っているブランチの一覧が表示され、そこから任意のブランチを選択することで切り替えることができる。

また、VS Code 1.15 (8 月にリリース予定)からは、ステータスバーと Git: チェックアウト先... コマンドに + Create new branch が追加され、これを選択することで、新しいブランチを作成することもできるようになっている。


Git のブランチ機能 - ブランチとマージの基本


参考: Git - Book: 3.2 Git のブランチ機能 - ブランチとマージの基本


ブランチを作成し、その上で更新作業を行い、必要に応じて master や他のブランチとマージを繰り返すフローになる。


ブランチの基本


参考: Git - Book: 3.2 Git のブランチ機能 - ブランチとマージの基本 - ブランチの基本


マージを行うために必要なブランチの基本を把握する。


マージの基本


参考: Git - Book: 3.2 Git のブランチ機能 - ブランチとマージの基本 - マージの基本



  • Git: ブランチをマージ...

切り出したブランチで作業した内容を master ブランチにマージする基本を把握する。


マージ時のコンフリクト


参考: Git - Book: 3.2 Git のブランチ機能 - ブランチとマージの基本 - マージ時のコンフリクト


vscode 1.13 から、Marketplace で配布されていた Better Merge 拡張機能が core extension として統合されている。

マージのコンフリクトが発生しても、簡単に解決できるようになっている。


Git のブランチ機能 - ブランチの管理


参考: Git - Book: 3.3 Git のブランチ機能 - ブランチの管理


ブランチの作成、マージ、そして削除を理解した上で、いくつかのコマンドベースのブランチ管理ツールについて把握しておく。


Git のブランチ機能 - ブランチでの作業の流れ


参考: Git - Book: 3.4 Git のブランチ機能 - ブランチでの作業の流れ


ブランチとマージの基本操作を理解した上で、それを実際にどう使えば良いかを解説するセクション。気軽にブランチを切れることでどういった作業ができるようになるのかを説明しているので、確認しておくと良いです。


Git のブランチ機能 - リモートブランチ


参考: Git - Book: 3.5 Git のブランチ機能 - リモートブランチ



  • git ls-remote [remote]

  • git remote show [remote]

VS Code では、これらを実現する単一のコマンドは提供されていない。


プッシュ(リモートブランチへのプッシュ)


参考: Git - Book: 3.5 Git のブランチ機能 - リモートブランチ - プッシュ




  • git push = Git: プッシュ

ローカルブランチの内容が自動的にリモートと同期されることはなく、共有したいブランチは、明示的にプッシュする必要がある。


追跡ブランチ


参考: Git - Book: 3.5 Git のブランチ機能 - リモートブランチ - 追跡ブランチ



プル


参考: Git - Book: 3.5 Git のブランチ機能 - リモートブランチ - プル




  • git pull = Git: プル


リモートブランチの削除


参考: Git - 3.5 Git のブランチ機能 - リモートブランチ - Book: リモートブランチの削除




  • git push --delete = Git: ブランチの削除...


リベース


参考: Git - Book: 3.6 Git のブランチ機能 - リベース


リベースについて「どういう意味か」「どのように行うのか」「なぜそんなにもすばらしいのか」「どんなときに使うのか」が説明されている。

VS Code で直接リベースを叩くコマンドは提供されていない(はず)。


Git のさまざまなツール (Chapter 7)


参考: Git - Book: 7. Git のさまざまなツール


Git - Book Chapter 7 で紹介されるいくつかのツールも VS Code へ実装されています。


行単位のステージングと取り消し


参考: Git - Book: 7.2 Git のさまざまなツール - 対話的なステージング


Git では、ファイルの特定の箇所だけをステージして他の部分はそのままにしておくということもできますが、これを VS Code から行うことが可能です。

コマンドパレットから、直接、


  • Git: 選択した範囲をステージする (git add -p)

  • Git: 選択した範囲をアンステージする (git reset -p)

を実行するか、または、

diff 画面の右上 をクリックするとでてくるメニューから選択することで、差分を確認しながら適用することが可能。選択は、1 行だけが対象なら行を選択する必要はなく、カーソルをその行に置くだけでも選択と見なされる。

関連 Issues:


作業の隠しかたと消しかた


参考: Git - Book: 7.3 Git のさまざまなツール - 作業の隠しかたと消しかた


現在作業している内容をすぐにコミットしたくはないけど、ちょっとブランチを切り替えて作業したいときなどに利用する。stash でコミットされていない変更内容を一時的に待避させ、作業が終わったら、pop で待避していたものを戻すことができる。


自分の作業を隠す (git stash)


参考: Git - Book: 7.3 Git のさまざまなツール - 作業の隠しかたと消しかた - 自分の作業を隠す


コマンドラインからの git stash は、引数なしで実行でき、hash と直近のコミットメッセージを利用して stash message を自動生成してくれる。

VS Code の Git: Stash コマンドでは、stash message の入力を求められるが、何も入力せずに Enter を押すことで同様の動作となる。

stash を作成し待避させる:



  • git stash = Git: スタッシュ


  • git stash -u = Git: スタッシュ(未追跡ファイルを含む)

stash を選択して戻す:



  • git stash pop = Git: スタッシュを適用して削除...

直近の stash を戻す:


  • `Git: 最新のスタッシュを適用して削除

また、Git Lens 拡張機能で Stash 管理を VS Code に統合きる。

拡張機能
概要

Git Lens
stash の管理を VS Code 上で行える、Git Stashes explorer を提供してくれる。VS Code 1.16 の Git: Stash 関連コマンドと連携可能


歴史の書き換え


参考: Git - Book: 7.6 Git のさまざまなツール - 歴史の書き換え


Git のすばらしい点のひとつは、何をどうするかの決断をぎりぎりまで先送りできることです。


  • どのファイルをどのコミットに含めるのかは、ステージングエリアの内容をコミットする直前まで変更することができる

  • 既に作業した内容でも stash コマンドを使えばまだ作業していないことにできる

  • すでにコミットしてしまった変更についても、それを書き換えてまるで別の方法で行ったかのようにすることもできる

  • コミットの順序を変更したり、

  • コミットメッセージやコミットされるファイルを変更したり、

  • 複数のコミットをひとつにまとめたり

  • ひとつのコミットを複数に分割したり

  • コミットそのものをなかったことにしたり

と、コミットの歴史を思い通りに書き換えてから他の人と共有できるようにする様々な手段。


直近のコミットの変更


参考: Git - Book: 直近のコミットの変更



  • git commit -amend

変更後のメッセージを含む新しいコミットを作成して直近のコミットをそれで置き換える。

この処理を行うと commit の SHA-1 が変わる事に注意。非常に小規模な rebase のようなもので、すでに push しているかどうかを判断基準にし、もし push した後なら commit は書き換えないようにしましょう。とのこと。


サブモジュール


参考: Git - Book: 7.6 Git のさまざまなツール - サブモジュール


「ふたつのプロジェクトはそれぞれ別のものとして管理したい。だけど、一方を他方の一部としても使いたい」という問題を解決するための機能。

サブモジュール使用時に気をつけるべきことについても言及されているので確認をしておく。

で追加される機能となり、S としてマークされる。

submodule の数だけ git プロセスが起動してしまうようで、数百の submodule があるようなリポジトリを開くと応答がなくなってしまうそう。そのため、VS Code 1.22 では、git.detectSubmodulesLimit 設定により submodule の数に制限をかけている (default: 10):


サブモジュールの作り方


参考: Git - Book: 7.6 Git のさまざまなツール - サブモジュールの作り方



サブモジュールを含むプロジェクトのクローン


参考: Git - Book: 7.6 Git のさまざまなツール - サブモジュールを含むプロジェクトのクローン



サブモジュールを含むプロジェクトでの作業


参考: Git - Book: 7.6 Git のさまざまなツール - サブモジュールを含むプロジェクトでの作業



サブモジュールに加えた変更の公開


参考: Git - Book: 7.6 Git のさまざまなツール - サブモジュールに加えた変更の公開



変更されたサブモジュールのマージ


参考: Git - Book: 7.6 Git のさまざまなツール - 変更されたサブモジュールのマージ



変更されたサブモジュールのマージ


参考: Git - Book: 7.6 Git のさまざまなツール - サブモジュールの作り方



綺麗にまとめられないので、ひとまず下記においとく


Added support for encodings for Git.

utf-8 固定だったものを files.encoding をベースにするよう変更


外部エディタ/Diff ツール(差分表示ツール)としての Visual Studio Code

長くなったので、別コンテンツとして切り出しました:


あると便利な拡張機能


Open in SourceTree

開いているプロジェクトを SourceTree クライアントで開く拡張機能


Open in Fork

開いているプロジェクトを Fork クライアントで開く拡張機能


Open in GitHub


プライベートな Git リポジトリ

プライベートな Git リモートリポジトリが欲しい場合は、無償利用可能な Visual Studio Team Services (または VTST と略して呼ばれる。旧 Visual Studio Online) も選択肢に入れられる。

無償で制限なくプライベート Git リポジトリを利用することが可能だし、Visual Studio で利用される TFVC(Team Foundation Version Control)リポジトリも使える。

TFVC を利用したい場合は、Visual Studio Team Services 拡張機能が必要。

外部リポジトリ(GitHub など)を source repository として VSTS と連携できる。GitHub 側に commit すると、VSTS 側で build task を実行することなども可能みたい。

外部のサービスを kick できる Services Hook もあるので、たとえば commit されたら Slack へ通知とか、jenkins に Job 投入とかできる。


Thanks