VS Code ローカル履歴(タイムライン)でバージョン管理

VS Code のバージョン 1.66 から作業履歴を保存する Local history(ローカル履歴)機能が標準で組み込まれてデフォルトで有効になっています。

ローカル履歴は Git を使わずに、ローカル上でファイルのバージョン管理を行う便利な機能です。

以下はローカル履歴を使ってファイルの変更の差分を表示したり、変更を元に戻したり(特定の時点の状態に復元したり)、削除したファイルを取り戻す方法などについて。

作成日:2023年9月12日

関連ページ:

Local history(ローカル履歴)

ローカル履歴はファイル保存時に自動的に履歴ファイルを残してくれる作業履歴(ファイルのバージョン)を管理する機能です。

ローカル履歴はエクスプローラービューでファイルを選択すると、左下のタイムラインパネルに表示され、ファイルの保存や作成、やり直しなどの操作が行われるたびにエントリーが追加されます。

タイムラインに表示されているエントリーにマウスオーバーすると、編集された日時が表示されます。

エントリーを選択すれば、その時点の編集状態(過去のバージョン)と現在のファイルを比較することができます。

また、必要であれば内容を元に戻す(選択した時点の状態に復元する)ことや削除したファイルを取り戻すこともできます。

基本的な操作

以下は初めて VS Code で開いたプロジェクトです。まだ、VS Code で何も操作していないのでタイムラインには履歴(エントリー)はありません。

ファイルを編集して保存すると、履歴ファイルが作成され、タイムラインにその履歴ファイルを表すエントリー(バージョン)が追加されます。エントリーはファイルの保存以外にも、新規作成ややり直し、復元などの操作でも追加されます。

更に3回変更と保存を行うと以下のように保存を行うたびにタイムラインにエントリーが追加されます。

ファイルを比較

タイムラインのエントリーを選択すると、その時点の編集状態と現在のファイルが表示されます。その際、差分がハイライト表示され、追加された行の横には + が、削除された行の横には ‐ が表示されます。

変更を比較しながら右側の画面の現在のファイルを編集することもできます。左側の履歴ファイル(選択したエントリーのファイル)は読み取り専用です。

変更箇所には矢印(→)が表示され、クリックするとその時点の状態に戻すことができます。

操作を取り消すには control + z を押します。

変更箇所が複数ある場合は、それぞれに矢印(→)が表示されるので、個別に元に戻すことができます。

また、エントリーを右クリックして表示される「前と比較」を選択すると、1つ前の状態を比較することができます。

例えば、上記の場合現在のファイルと1つ前のファイルを比較していますが、「前と比較」を選択すると1つ前と2つ前のファイルを比較できます(この場合、両方とも読み取り専用です)。

エントリーを右クリックして表示される「コンテンツを表示」を選択すると、その時点のファイルの内容が表示されます。

インラインビュー表示

ファイルを比較する際に、右上の 「…」をクリックして表示されるメニューから「インラインビュー」を選択すると、差分を1つのファイルにまとめて表示することもできます。

以下のように表示されます。インラインビュー表示を終了するには、再度右上の 「…」をクリックして「インラインビュー」を選択してチェックを外して解除します。

また、「ー」の削除を表すマークの上でクリックすると「この変更を元に戻す」などのオプションが表示されます。

選択項目と比較

エントリーを右クリックして表示される「選択項目と比較」を使うと、「比較対象の選択」で選択した履歴ファイルと比較することができます。

以下の例では style.css と style-org.css という2つファイルの履歴ファイルを比較します。

まず、比較対象とするファイル style-org.css のタイムラインのエントリーを右クリックして「比較対象の選択」を選択して、比較対象として設定します。

続いて比較するファイル style.css を開いて、タイムラインで比較するエントリーを右クリックして「選択項目と比較」を選択します。

以下のように style.css と style-org.css を比較することができます。いずれの画面も読み取り専用です。

ファイルを復元(元に戻す)

タイムラインで選択したエントリーの状態にファイルを復元する(戻す)ことができます。

復元したい時点のエントリーを選択して右クリックし、「コンテンツの復元」を選択します。

以下のような「保存されていない全ての変更は破棄される」という警告が表示されるので、問題なければ「復元」をクリックします。

選択したエントリーの状態に戻ります。

この時点で control + z を押して保存すると、復元前の状態に戻ります。

履歴ファイルの保存場所

ローカル履歴のファイルの保存場所は OS により異なります。

macOS の場合は以下になります($HOME はユーザーのホームディレクトリ)。

$HOME/Library/Application Support/Code/User/History

Windows の場合は以下になります(未確認)。

C:\Users\<username>\AppData\Roaming\Code\User\History

履歴ファイルの表示

エクスプローラービューでファイルを選択し、タイムラインで表示したいエントリーを選択して右クリックから「Finder で表示します」を選択します。

メニュー項目の「Finder で表示します」は Mac の場合です。他の OS では異なるかと思います。

以下のような選択したエントリーが含まれるフォルダーが開き、選択したエントリーのファイルが選択された状態で表示されます。

このフォルダーの1つ上のフォルダ(History)がローカル履歴全体の保存場所です。

この例の場合、index.html の履歴ファイルを表示しているので、その他のファイルも index.html の他のバージョンのファイルになります。

entries.json にはエントリーの情報が記述されています。

entries.json の例
{"entries":[{"id":"SMue.html","timestamp":1694419364367},{"id":"aoG6.html","timestamp":1694419643562},{"id":"6R17.html","timestamp":1694419663261},{"id":"qAOJ.html","timestamp":1694420183514},{"id":"y81A.html","source":"undoRedo.source","timestamp":1694427619361},{"id":"5kUF.html","timestamp":1694428314054},{"id":"635M.html","source":"undoRedo.source","timestamp":1694428411976},{"id":"zhDt.html","timestamp":1694472336507},{"id":"w89S.html","source":"localHistoryRestore.source","timestamp":1694476470299},{"id":"mtOO.html","source":"undoRedo.source","timestamp":1694476667217},{"id":"qNhK.html","timestamp":1694483741838}]}

保存場所のパス名(Mac の場合)

ローカル履歴全体の保存場所フォルダ(History)のパス名は、ウィンドウ下部のステータスバーのフォルダ名(History)を右クリックして「History のパス名をコピー」でコピーできます。

削除したファイルを取り戻す

削除してしまったファイルはタイムラインには表示されませんが、ファイルが削除された場合でも、その履歴ファイルはまだローカルに存在します。

削除したファイルを取り戻すには以下のような方法があります。

同名のファイルを作成

例えば、以下の style.css を誤って削除してしまった場合、

削除してしまったファイル style.css はタイムラインには表示されません。

削除したファイルと同じ名前のファイル(style.css)を作成するとタイムラインに過去のエントリーが表示されます。エントリーから復元したいファイル(例えば最新のエントリー)を選択します。

以下のように差分が表示されます。エントリーを右クリックして「コンテンツの復元」を選択します。

以下が表示されるので、「復元」をクリックします。

ファイルが復元されます。

コマンドパレットを使う

同名のファイルを作成してもタイムラインに過去のエントリーが表示されない場合は、コマンドパレットを使って削除したファイルを検索することができます。

コマンドパレットlocal hlocal history などと入力すると、Local History(ローカル履歴)の操作が表示されるので「ローカル履歴:復元するエントリの検索」を選択します。

コマンドセンターの場合は入力欄にカーソルを置いて「コマンドの表示と実行」を選択するか > と入力すればコマンドパレットになります。

以下のようにファイルの一覧が表示されるので、ファイル名やその一部を入力して絞り込みます。

削除したファイル名 style.css を入力すると以下のように候補が表示されます。パスの表示されていないものは現在のプロジェクトのファイルなので、この例ではそのファイルを選択します。

復元するエントリーのリストが表示されるので、復元したいエントリーを選択します。

選択した履歴ファイルが表示されるのでファイルを確認し、右上のチェックボタン()をクリックすると、その履歴ファイルで復元できます。

以下が表示されるので「復元」をクリックして復元ます。

選択した履歴ファイルで復元されます。

履歴ファイルを検索する

前述のいずれの方法でも復元できない場合は、履歴ファイルが保存されているフォルダーを検索して目的のファイルを見つけて復元することができます。

以下は Mac の場合の例です。

Mac ではターミナルで grep コマンドを使って検索できます。

履歴ファイルの保存場所$HOME/Library/Application Support/Code/User/Historyになります。または /Users/ユーザー名/Library/Application Support/Code/User/History/でも同じです。

grep コマンドに -r オプションを指定するとサブディレクトリを含めて再帰的に検索して検索文字列を含むファイル名を取得できます。-i は大文字と小文字の区別をしないようにするオプションです。

この例では、検索文字列にはファイルに含まれる文字列として「style sheet for local history sample」を指定しています(スペースが含まれるので引用符で囲みます)。

% grep -r -i "style sheet for local history sample" "$HOME/Library/Application Support/Code/User/History"  // 改行されて表示されていますが1行です。
/Users/username/Library/Application Support/Code/User/History/4338b74a/wwbb.css:/* style sheet for local history sample */
/Users/username/Library/Application Support/Code/User/History/4338b74a/r4vq.css:/* style sheet for local history sample */
/Users/username/Library/Application Support/Code/User/History/4338b74a/YuGb.css:/* style sheet for local history sample */

上記の場合、History フォルダ内の 4338b74a という名前のフォルダに3つの該当するファイルが見つかったので、それらを cat コマンドなどで内容を確認します。

% cat /Users/username/Library/Application\ Support/Code/User/History/4338b74a/YuGb.css  // 改行されて表示されていますが1行です。
/* style sheet for local history sample */
.sample {
  border: 1px solid #CCC;
  background-color: #efefef;
}
.sample h3 {
  margin: 20px;
  font-size: 20px;
}
.sample .content p {
  color: blue;
}

History フォルダのパスの「Application Support」はスペースを含むので、前述の例のようにスペースを \ でエスケープするかパス全体を引用符で囲みます。

% cat "/Users/username/Library/Application Support/Code/User/History/4338b74a/YuGb.css"  // 改行されて表示されていますが1行です。
/* style sheet for local history sample */
.sample {
  border: 1px solid #CCC;
  background-color: #efefef;
}
.sample h3 {
  margin: 20px;
  font-size: 20px;
}
.sample .content p {
  color: blue;
}

必要な履歴ファイルが見つかったら、以下のように cat の結果をファイルに保存すれば復元できます。

% cat "/Users/username/Library/Application Support/Code/User/History/4338b74a/YuGb.css" > style.css //cat の結果を保存

Git を使っている場合

Git を使っている場合、デフォルトではタイムラインにはファイルの保存などのローカル履歴と Git のコミット履歴の両方が表示されますが、表示の有無を切り替えることができます。

表示を切り替えるには、タイムラインの部分にマウスオーバーして右側に表示されるフィルターのアイコンをクリックします。

例えば、上記の状態で Git 履歴のみを表示するには、「ローカル履歴」を選択してチェックを外します。

ローカル履歴の設定項目

ツールバーから[Code]→[基本設定]→[設定]を選択するか、command + , を押して設定エディタを開き、local history と検索欄に入力するとローカル履歴の設定項目が表示されます。

必要に応じて設定を変更できます。

設定項目の概要
設定 ID 説明 デフォルト
workbench.localHistory.enabled ローカル履歴を有効にするかどうか true
workbench.localHistory.exclude ローカル履歴から特定のファイルを除外するためのパスまたはグロブパターン {}
workbench.localHistory.maxFileEntries ファイルごとのローカル履歴エントリの最大数 50
workbench.localHistory.maxFileSize ローカル履歴エントリのファイスの最大サイズ(kb 単位)。このサイズより大きいファイルはローカル履歴には追加されません。 256
workbench.localHistory.mergeWindow ローカル履歴の最後のエントリが追加されるエントリに書き換えられる間隔を秒単位で指定します。 10