連載
» 2021年10月22日 05時00分 公開

VS Codeでソースコード管理:拡張機能でコミット履歴を簡単操作Visual Studio Codeで快適Pythonライフ

コミット履歴をグラフィカルに表示したり、そこからさまざまな操作を実行したりできるGit HistoryとGit Graphという拡張機能を紹介。

[かわさきしんじ,Deep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Visual Studio Codeで快適Pythonライフ」のインデックス

連載目次

 前回はブランチの作成、マージ、コンフリクトの解決などの手順について見ました。今回はリポジトリの操作を支援する拡張機能を幾つか紹介します。

サンプルコード

 拡張機能を紹介する前に、何かのコードを書いてコミットして、ブランチを切って、そちらでもコードを書いてコミットしてという作業が必要です。ここでは、交差検証を行うために、PyTorchのデータセットを分割しようとしているとしましょう。以下はその前準備として、訓練データとして使うデータのインデックスと検証データとして使うデータのインデックスの組を要素とするリストを作成する関数を記述したものです(個人的に書いているコードなので詳細はあまり気にしないでください)。

from random import sample

def make_kfold_range(length, k):
    quotient, remainder = length // k, length % k
    trains, vals = [], []
    indices = sample(range(length), length)  # shuffle indices

    if k <= 1:
        return [(indices, [])]
    for num in range(k):
        start, end = 0, quotient
        tmp = []
        for cnt in range(k):
            if num == cnt:
                end += remainder
                vals.append(indices[start:end])
            else:
                tmp.extend(range(start, end))
            start, end = end, end + quotient
        r = [indices[idx] for idx in tmp]
        trains.append(r)
    return list(zip(trains, vals))

make_kfold_range関数(mainブランチ)

 ローカルリポジトリのmainブランチ上でこのコードを書いてコミットをしたところで、型ヒントを追加することにしました。with_type_hintというブランチを作成して、そこで型ヒントを付加しながら、mainブランチでは型ヒントなしでコードを追加していこうという考えです(ちゃんとした人であれば、最初から型ヒントを付けるべきなのでしょう)。

 というわけでwith_type_hintブランチで型ヒントを追加したのが以下のコードです。コード量が増えているのは、主にタプルのアンパッキング(変数をカンマ区切りで並べて、複数の値を代入しようとするときに自然と使っているアレです)やfor文のループ変数では型ヒントを「x: int, y: int = 0, 1」とか「for num: int in range(10):」のようには書けないからです(PEP 526などを参照)。

from random import sample

def make_kfold_range(length: int, k:int) -> list[tuple[list[int], list[int]]]:
    quotient: int
    remainder: int
    quotient, remainder = length // k, length % k

    trains: list[list[int]]
    vals: list[list[int]]
    trains, vals = [], []
    indices: list[int] = sample(range(length), length)  # shuffle indices

    if k <= 1:
        return [(indices, [])]

    num: int
    for num in range(k):
        start: int = 0
        end: int = quotient
        tmp: list[int] = []
        cnt: int
        for cnt in range(k):
            if num == cnt:
                end += remainder
                vals.append(indices[start:end])
            else:
                tmp.extend(range(start, end))
            start, end = end, end + quotient
        r: list[int] = [indices[idx] for idx in tmp]
        trains.append(r)
    return list(zip(trains, vals))

型ヒントを付加したコード(with_type_hintブランチ)

 ちなみにこの関数は例えば、次のように呼び出します。

result = make_kfold_range(12, 3)
print(result)

make_kfold_range関数の呼び出し例

 出力結果は例えば次のようになります。最初に整数列をシャッフルしているので、結果はランダムになります。

[([2, 11, 7, 10, 9, 6, 0, 8], [3, 1, 4, 5]), ([3, 1, 4, 5, 9, 6, 0, 8], [2, 11, 7, 10]), ([3, 1, 4, 5, 2, 11, 7, 10], [9, 6, 0, 8])]

出力結果の例

 大外のリストの要素となっているタプルは2つの要素を持ちますが、その2つ目のリストが検証データで使用するインデックスを格納しています。上記の最初のタプルなら、[3, 1, 4, 5]が検証データで、もう1つのリストが訓練データに対応します(もちろん、こんなに少ないデータ数のハズがありませんが、これは動作を確認するために少ないデータ数を指定して呼び出したと考えてください)。

 そういうわけで、with_type_hintブランチで上のコードをコミットした一方で、mainブランチでは、上に示した関数を使用する以下のようなコードを書きました(データセットを渡すと、make_kfold_range関数を使ってインデックスを分割し、それを使ってデータセットを分割します)。やはり型ヒントは付けていません。

# 省略

from torch.utils.data import Subset

# 省略

def get_kfold_datasets(dataset, k):
    datasets = []

    if not hasattr(dataset, '__len__'):
        raise TypeError(f'{dataset} does not have a __len__ attr')
    else:
        ds_length = len(dataset)  # ok since dataset has a __len__ attr

    for trainidx, validx in make_kfold_range(ds_length, k):
        datasets.append((Subset(dataset, trainidx), Subset(dataset, validx)))
    return datasets

get_kfold_datasets関数(mainブランチ)

 この時点でwith_type_hintブランチからmainブランチにマージをして型ヒントを付加したコードを反映し、その結果をさらにwith_type_hintブランチにマージをしてみました(リベースした方がよかったかもしれません)。

 そこでさらに両方のブランチにコードを追加したとしましょう(詳細は省略しますが、with_type_hintブランチではget_kfold_datasets関数に型ヒントを付加し、mainブランチでは何もしない関数を加えました)。

 ここで、これまでのコミットやマージの歴史がどうなっているか確認したいと思いました。しかし、Visual Studio Code(以下、VS Code)のコマンドパレットには実はそのようなコマンドはされていません。そのため、ターミナルを開いて、「git log」コマンドや、それをグラフ表示してくれる「git log --graph --all」コマンドを実行するのが簡単です。以下は「git log --graph --all --oneline」コマンドを実行した結果です(--onelineオプションを指定すると、表示がより簡潔になります)。

「git log --graph --all」コマンドの実行結果 「git log --graph --all」コマンドの実行結果

 ターミナルとコマンドラインでも十分かもしれませんが、VS Codeの拡張機能には、Gitの各種機能をより便利に扱えるものもあります。例えば、Git Graph拡張機能を使うと、上記のグラフがより分かりやすく表示されます。

Git Graph拡張機能によるコミット履歴のグラフ表示 Git Graph拡張機能によるコミット履歴のグラフ表示

 以下ではこのような拡張機能を2つ紹介します。

VS Codeで使えるGit拡張機能

 Gitのリポジトリのグラフを分かりやすく表示してくれる拡張機能としては以下の2つが人気のようです。

 以下ではこれらについて簡単に見ていきましょう。

Git History拡張機能

 Git Historyをインストールすると、[ソース管理]ビューの上部に表示される[Git View History]アイコンからその機能にアクセスできるようになります(あるいはコマンドパレットから[Git: View History]コマンドを実行します)。

[Git View History]アイコン [Git View History]アイコン

 これをクリックすると、次のような画面が表示されます。

Git History拡張機能により表示されたコミット履歴のグラフ Git History拡張機能により表示されたコミット履歴のグラフ

 下にある行が古いもので、上に向かってコミットをしてきた履歴が積み重なるように表示されます。下から上に引かれた線(グラフ)は一番左側がmainブランチのもので、そこから他のブランチのコミット履歴を表すグラフが派生したり(新規ブランチ)、mainブランチやその他のグラフに別のグラフが合流したりします(ブランチのマージ)。

 各行にはコミットを取り消して特定の状態に戻すためのリンクや、タグを新規に作成するリンク、ブランチを新規に作成するリンクなどがあります。一番右の[]をクリックすると、マージやリベース、一部の機能だけを取り込むチェリーピック、特定のコミットへのチェックアウトなどを行うためのメニューが表示されます。最上部には表示する行(コミットやマージ)をフィルタリングするための検索ボックスなどが表示されています。これらを使って必要な情報を取捨選択できるでしょう。

 各行をクリックすると、対応する操作に関する情報が表示されます。

コミットやマージについての情報が表示されたところ コミットやマージについての情報が表示されたところ

 ここではファイルを絞り込んだり、その時点でのファイルの内容を表示したり、現在のワークスペースあるいは以前のコミットからの差分を表示したり、コミット履歴を表示したりできます。

 特定のブランチの最新状態にチェックアウトするには、行の右側にあるブランチ名のボタン(上の例なら[main]や[with_type_hint])をクリックしてください。

Git Graph拡張機能

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。