Visual Studio Code の git 連携機能と git コマンドについて (2018/05/23)
Git - Book 2nd Edition (2014) 日本語訳の
に出てくるコマンドに VS Code のコマンドをあてる感じで書き直してみる
-
Visual Studio Code の git 連携機能と git コマンドについて (2018/05/23)
- Git の情報源
- Git クライアントとしての Visual Studio Code
- git コマンドと vscode の git 関連操作
- Git の基本
- Git のブランチ機能 (Chapter 3)
- Git のさまざまなツール (Chapter 7)
- 綺麗にまとめられないので、ひとまず下記においとく
- 外部エディタ/Diff ツール(差分表示ツール)としての Visual Studio Code
- あると便利な拡張機能
- プライベートな Git リポジトリ
- Thanks
理解できていないので、勉強のためにまとめてみる。
Visual Studio Code (以下、VS Code) の git 連携機能は、VS Code 自身が git 機能を持つ訳ではなく、PATH 上に存在する git コマンドを利用することで実現している。
そのため、VS Code に加えて Git を個別にインストールする必要あり。
下記のドキュメントにも記載がありますが、ほかのツールから外部エディタとして Visual Studio Code を呼び出すことを目的とした機能が追加されたため、git 2.0.0
以降が要件となっている。
- Git editor and -w / --wait mode for Code #4006
- -w options is not working as expected in Windows git config #4214
Git の情報源
VS Code の git (バージョン管理) については、下記のマニュアルを参考に。
- 英語: Using Version Control in VS Code
- 日本語: バージョン管理
VS Code の git 連携記事:
git そのものについては、下記で。
- Git - Reference
- Git - Book (日本語版あり, PDF, epub, mobi)
- Quick reference guides: GitHub Cheat Sheet
- Git Tutorials and Training
- Atlassian Blogs の Archives for the tag: git
- git pull/commi/push の基本的な操作の学習は Git-it がオススメ。git の基本と GitHub の使い方を手を動かしながら学べ、チュートリアル形式でわかりやすく日本語で解説してくれる Electron アプリケーション。
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 から変更になっている。
- Visual Studio Code Source Control API
- Microsoft/vscode-SCMBuilders - This is a repo to help the extension builder community create new SCM providers for Visual Studio Code. It contains samples as well as instructions for getting going.
git 連携機能の実装については、下記のソースコードが参考になるかと思います。
とりあえず、調べている途中のもの。
間違いがあったりはっきりわからない部分がありますが、理解できたものから更新してく。
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 リポジトリとして構成されているもからコピー(clone)してきても良い。
とにかく、リポジトリを用意しないとはじまらないよということ。
既存のディレクトリでのリポジトリの初期化
-
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 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 status
=ソースコード管理ビュー
ファイルの状態を確認する git status に相当するコマンドは VS Code にはなく、git status -z -u
コマンドを内部で実行し、VS Code のソースコード管理ビューとファイルエクスプローラにファイルの状態を表示する。(状態表示の簡略化を参照)
新しいファイルの追跡と変更したファイルのステージング
-
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 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) で無効にすることも可能。
ファイルの無視
- .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 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 rm
VS Code のコマンドは提供されておらず、エクスプローラからファイルを削除することで、deleted:
となるので、後は、ステージングに遷移させてからコミットでも良いし、Git: すべてコミット
で一気にやってしまっても良い。
ファイルの移動
git mv
こちらも、特別な VS Code のコマンドは提供されておらず、ファイルの削除と同じになるのかな。
コミット履歴の閲覧
コミットログを見るための git log 相当のコマンドは現時点では提供されていないため、下記の拡張機能で補完する。
拡張機能 | 概要 |
---|---|
Git History (git log) | git log をグラフィカルに参照することが可能 |
Git Lens | VS Code の Git 機能と連携し様々な機能を付加してくれる |
Git History Diff | git log を参照するための拡張機能 |
作業のやり直し
git commit --amend
ステージしたファイルの取り消し:
Git: 変更のステージング解除
Git: すべての変更のステージング解除
Git: 選択した範囲をアンステージする
ファイルへの変更の取り消し
Git: 変更を破棄
Git: すべての変更を破棄
コミットの取り消し
戻す:
Git: 前回のコミットを元に戻す
VS Code の "すべての変更を破棄" について
リモートでの作業
Git を使ったプロジェクトで共同作業を進めていくには、リモートリポジトリの扱い方を知る必要があります。リモートリポジトリとは、インターネット上あるいはその他ネットワーク上のどこかに存在するプロジェクトのことです。
リモートの表示
git remote -v
リモートリポジトリの追加
git remote add
リモートからのフェッチ、そしてプル
-
git fetch
=Git: 最新の情報に更新
-
git pull
=Git: プル
-
git pull branch
=Git: 指定元からプル
以前の VS Code では、定期的に git fetch
を実行し remote repository から更新情報を取得する動作がデフォルトだったが、git 認証用のポップアップが表示されることが混乱を招き、多くのユーザーが自動 fetch を無効にしていたため、 からデフォルトを無効とした。
動作が気に入らない場合は、"git.autofetch": false
を true
に変更する。
無効なった経緯は、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 push
=Git: プッシュ
- リモートを選択して psuh する場合は、
Git: プッシュ先
ステータスバーの同期アイコンは git.sync
コマンドを実行している。
リモートの調査
git remote show
リモートの削除・リネーム
git remote rename
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 では頻繁にブランチ作成とマージを繰り返すワークフローを推奨している。
Git Book のこの章で、Git のブランチの仕組みについて把握しておくと良い。
ブランチとは
Git Book で、ブランチや HEAD などの考え方を把握しておくと良い。
新しいブランチの作成
-
git branch
=Git: 分岐の作成...
VS Code 1.11 から、branch を作成するには、コマンドパレットから Git: 分岐の作成...
を実行する必要がある。
ブランチの切り替え
-
git checkout
=Git: チェックアウト先...
ステータスバーの左下に現在、アクティブになっているブランチが表示されている。それをクリックすることで、そのリポジトリが持っているブランチの一覧が表示され、そこから任意のブランチを選択することで切り替えることができる。
また、VS Code 1.15 (8 月にリリース予定)からは、ステータスバーと Git: チェックアウト先...
コマンドに + Create new branch
が追加され、これを選択することで、新しいブランチを作成することもできるようになっている。
Git のブランチ機能 - ブランチとマージの基本
ブランチを作成し、その上で更新作業を行い、必要に応じて master や他のブランチとマージを繰り返すフローになる。
ブランチの基本
マージを行うために必要なブランチの基本を把握する。
マージの基本
Git: ブランチをマージ...
切り出したブランチで作業した内容を master ブランチにマージする基本を把握する。
マージ時のコンフリクト
vscode 1.13 から、Marketplace で配布されていた Better Merge 拡張機能が core extension として統合されている。
マージのコンフリクトが発生しても、簡単に解決できるようになっている。
Git のブランチ機能 - ブランチの管理
ブランチの作成、マージ、そして削除を理解した上で、いくつかのコマンドベースのブランチ管理ツールについて把握しておく。
Git のブランチ機能 - ブランチでの作業の流れ
ブランチとマージの基本操作を理解した上で、それを実際にどう使えば良いかを解説するセクション。気軽にブランチを切れることでどういった作業ができるようになるのかを説明しているので、確認しておくと良いです。
Git のブランチ機能 - リモートブランチ
git ls-remote [remote]
git remote show [remote]
VS Code では、これらを実現する単一のコマンドは提供されていない。
プッシュ(リモートブランチへのプッシュ)
-
git push
=Git: プッシュ
ローカルブランチの内容が自動的にリモートと同期されることはなく、共有したいブランチは、明示的にプッシュする必要がある。
追跡ブランチ
プル
-
git pull
=Git: プル
リモートブランチの削除
-
git push --delete
=Git: ブランチの削除...
リベース
リベースについて「どういう意味か」「どのように行うのか」「なぜそんなにもすばらしいのか」「どんなときに使うのか」が説明されている。
VS Code で直接リベースを叩くコマンドは提供されていない(はず)。
Git のさまざまなツール (Chapter 7)
Git - Book Chapter 7 で紹介されるいくつかのツールも VS Code へ実装されています。
行単位のステージングと取り消し
Git では、ファイルの特定の箇所だけをステージして他の部分はそのままにしておくということもできますが、これを VS Code から行うことが可能です。
コマンドパレットから、直接、
-
Git: 選択した範囲をステージする
(git add -p
) -
Git: 選択した範囲をアンステージする
(git reset -p
)
を実行するか、または、
diff 画面の右上 …
をクリックするとでてくるメニューから選択することで、差分を確認しながら適用することが可能。選択は、1 行だけが対象なら行を選択する必要はなく、カーソルをその行に置くだけでも選択と見なされる。
関連 Issues:
- Export more git commands · Issue #18185 · Microsoft/vscode
- Add line per line in Git panel · Issue #18509 · Microsoft/vscode
- Improve git partial staging discoverability · Issue #3563 · Microsoft/vscode
- git reset -p : Reset line per line (and maybe per block too) · Issue #19118 · Microsoft/vscode
作業の隠しかたと消しかた
現在作業している内容をすぐにコミットしたくはないけど、ちょっとブランチを切り替えて作業したいときなどに利用する。stash でコミットされていない変更内容を一時的に待避させ、作業が終わったら、pop で待避していたものを戻すことができる。
自分の作業を隠す (git stash)
コマンドラインからの 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 のすばらしい点のひとつは、何をどうするかの決断をぎりぎりまで先送りできることです。
- どのファイルをどのコミットに含めるのかは、ステージングエリアの内容をコミットする直前まで変更することができる
- 既に作業した内容でも stash コマンドを使えばまだ作業していないことにできる
- すでにコミットしてしまった変更についても、それを書き換えてまるで別の方法で行ったかのようにすることもできる
- コミットの順序を変更したり、
- コミットメッセージやコミットされるファイルを変更したり、
- 複数のコミットをひとつにまとめたり
- ひとつのコミットを複数に分割したり
- コミットそのものをなかったことにしたり
と、コミットの歴史を思い通りに書き換えてから他の人と共有できるようにする様々な手段。
直近のコミットの変更
- git commit -amend
変更後のメッセージを含む新しいコミットを作成して直近のコミットをそれで置き換える。
この処理を行うと commit の SHA-1 が変わる事に注意。非常に小規模な rebase のようなもので、すでに push しているかどうかを判断基準にし、もし push した後なら commit は書き換えないようにしましょう。とのこと。
サブモジュール
「ふたつのプロジェクトはそれぞれ別のものとして管理したい。だけど、一方を他方の一部としても使いたい」という問題を解決するための機能。
サブモジュール使用時に気をつけるべきことについても言及されているので確認をしておく。
submodule の数だけ git プロセスが起動してしまうようで、数百の submodule があるようなリポジトリを開くと応答がなくなってしまうそう。そのため、VS Code 1.22 では、git.detectSubmodulesLimit
設定により submodule の数に制限をかけている (default: 10):
サブモジュールの作り方
サブモジュールを含むプロジェクトのクローン
サブモジュールを含むプロジェクトでの作業
サブモジュールに加えた変更の公開
変更されたサブモジュールのマージ
変更されたサブモジュールのマージ
綺麗にまとめられないので、ひとまず下記においとく
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 を実行することなども可能みたい。
- Getting Started with Git in Team Services
- Visual Studio Online Supports True Cross-Platform Development
- Visual Studio OnlineとGitHubを連携する方法 Visual Studio Online側準備編 #tfsug
外部のサービスを kick できる Services Hook もあるので、たとえば commit されたら Slack へ通知とか、jenkins に Job 投入とかできる。