コミット履歴をグラフィカルに表示したり、そこからさまざまな操作を実行したりできるGit HistoryとGit Graphという拡張機能を紹介。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
前回はブランチの作成、マージ、コンフリクトの解決などの手順について見ました。今回はリポジトリの操作を支援する拡張機能を幾つか紹介します。
拡張機能を紹介する前に、何かのコードを書いてコミットして、ブランチを切って、そちらでもコードを書いてコミットしてという作業が必要です。ここでは、交差検証を行うために、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))
ローカルリポジトリの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))
ちなみにこの関数は例えば、次のように呼び出します。
result = make_kfold_range(12, 3)
print(result)
出力結果は例えば次のようになります。最初に整数列をシャッフルしているので、結果はランダムになります。
[([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
この時点で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オプションを指定すると、表示がより簡潔になります)。
ターミナルとコマンドラインでも十分かもしれませんが、VS Codeの拡張機能には、Gitの各種機能をより便利に扱えるものもあります。例えば、Git Graph拡張機能を使うと、上記のグラフがより分かりやすく表示されます。
以下ではこのような拡張機能を2つ紹介します。
Gitのリポジトリのグラフを分かりやすく表示してくれる拡張機能としては以下の2つが人気のようです。
以下ではこれらについて簡単に見ていきましょう。
Git Historyをインストールすると、[ソース管理]ビューの上部に表示される[Git View History]アイコンからその機能にアクセスできるようになります(あるいはコマンドパレットから[Git: View History]コマンドを実行します)。
これをクリックすると、次のような画面が表示されます。
下にある行が古いもので、上に向かってコミットをしてきた履歴が積み重なるように表示されます。下から上に引かれた線(グラフ)は一番左側がmainブランチのもので、そこから他のブランチのコミット履歴を表すグラフが派生したり(新規ブランチ)、mainブランチやその他のグラフに別のグラフが合流したりします(ブランチのマージ)。
各行にはコミットを取り消して特定の状態に戻すためのリンクや、タグを新規に作成するリンク、ブランチを新規に作成するリンクなどがあります。一番右の[]をクリックすると、マージやリベース、一部の機能だけを取り込むチェリーピック、特定のコミットへのチェックアウトなどを行うためのメニューが表示されます。最上部には表示する行(コミットやマージ)をフィルタリングするための検索ボックスなどが表示されています。これらを使って必要な情報を取捨選択できるでしょう。
各行をクリックすると、対応する操作に関する情報が表示されます。
ここではファイルを絞り込んだり、その時点でのファイルの内容を表示したり、現在のワークスペースあるいは以前のコミットからの差分を表示したり、コミット履歴を表示したりできます。
特定のブランチの最新状態にチェックアウトするには、行の右側にあるブランチ名のボタン(上の例なら[main]や[with_type_hint])をクリックしてください。
Copyright© Digital Advantage Corp. All Rights Reserved.