【LabVIEW】初心者向けLabVIEWプログラムのバージョンを管理する方法2

2019年12月13日

前回の記事でSourceTreeをインストールするところまで紹介を行いました。

SourceTreeはプログラミングに限らず、ファイルのバージョンを管理することを目的としてGitやMercurialという方式を使用して管理することが出来るソフトウェアです。前回の記事ではMercurialではなくGitをインストールしました。

目次

Sourcetree(Git)を使用するにあたって用語解説

まずSourcetreeを使用するにGitで使用される用語を一部解説したいと思います。

  • リポジトリ
    簡単に言うとバージョンを管理するための場所です。

     

    Sourcetreeの画面で後ほど解説をしますが、基本的にはバージョンを管理したいファイルがあるフォルダ(ディレクトリ)を選択して、そのフォルダ内にある各種ファイルのバージョンを管理します。

  • コミット
    ファイルを更新した際に、どのように更新をしたのかを記載していきます。

     

    更新を行う際は必ず、変更内容を記載する必要があります。

    コミットに記載する内容が不足している場合、どのように更新したのかが結局解らなくなるため、記載する内容は非常に重要となってきます。どのような変更を行ったのか?(新規機能を追加したのか、どのようなバグを修正したのか等)は必ず書いておく必要があります。

    単にバグ修正などと記載すると何をしたのか、結局解らなくなってしまい、バージョン管理をしている意味がなくなってしまいます。

  • ブランチ
    バージョン管理を行う際に、メインで作っているファイルとは別にファイルを分けて作業をすることがあると思います。既にリリース済みのファイルを変更して新機能を実装してしまうと、単純なバグ修正をしたい場合に、新機能が実装出来るまで、メインファイルを触れなくなるという問題が出てきてしまいます。

     

    それを回避するために、メインのファイルとは別に枝分け(ブランチ)をすることで、新機能を実装するためにファイルを分ける機能が備わっています。

    使用する例としては、新機能を実装、大幅にファイルを修正(リファクタリング)する場合等が考えられます。ブランチをしなくても最悪は前のバージョンに戻すという方法もありますが、ファイルを分けてしまった方が、管理しやすくはなります。

  • マージ
    ブランチの機能を使用して分けたファイルを、元のメインファイルに統合させる機能をマージと言います。

     

    新機能追加や大幅なプログラム変更を行った後に無事動作確認が出来た場合に、ブランチで分けたファイルをそのままにしておくと、結局どれが最新のファイルか解らなくなるため、マージ機能を使用して、メインのファイルと統合します。

    メインのファイルと統合することで、最新のファイル状況を把握しやすくなります。

    マージをせずにブランチから更にブランチを繰り返して、ファイルを分けすぎると結局どれが最新のファイルか解らなくなるため、ブランチの目的が完了をしたらマージ機能を使用してファイルを統合させることが大事です。

SourcetreeでLabVIEWのファイルバージョンを管理

インストールしたSourcetreeで実際にLabVIEWで作成したファイルのバージョンを管理してみます。

ローカルリポジトリを作成する

1.
Sourcetreeのローカルリポジトリの状態で、右にある「Create」ボタンをクリックします。Remoteリポジトリについては今回は割愛します。GitHubやBitbucketを使用する時に使います。

2.
リポジトリ(ディレクトリ)を作成するためのフォルダパスを入力します。
参照から既存のフォルダを選択することも出来ます。既存のフォルダを選択した場合は、使用するかどうか確認を求めてきます。

ファイルパスの下にあるワークスペースの名前については自動的にフォルダ名で入力されるので、特に入力をする必要はありません。
一番下にある項目は今回の場合は自動的に「Git」になっています。「Git」でバージョン管理を行います。

3.
リポジトリ作成の際に、フォルダが無い状態でフォルダパスを指定した場合、新規でフォルダが作成されます。

4.
リポジトリを作成すると、上記のような「WORKSPACE」画面が表示されます。この画面を使用して、ファイルのバージョン管理を行っていきます。

LabVIEWのファイルをSoucetreeに登録をする

5.
先ほど指定したフォルダにLabVIEWファイルを作成して保存します。とりあえず、適当に加算をして表示器に数値を表示するVIを作成しました。「Sample.vi」という名前で保存しています。

6.
Sourcetreeの「ファイルステータス」に戻って10秒くらい待っていると、Sourcetreeがリポジトリ(フォルダ)内に変化があった場合、自動的に更新をしてくれます。

今回の場合、先ほど保存した「Sample.VI」がリポジトリに保存されたので、「作業ツリーのファイル」に登録されています。しかし、この状態ではまだ、バージョン管理するファイルとして登録はされていません。まず、登録するファイルを選択してから、「選択をインデックスに追加」するか、「全てインデックスに追加」ボタンのどちらかをクリックします。今回は「全てをインデックスに追加」を選択しました。

7.
インデックスにファイルを追加すると「作業ツリーのファイル」から「Indexにステージしたファイル」に位置が変わります。この状態になったら、一番下の入力欄が先ほどまではグレーアウトしていましたが、入力出来るようになります。

コミット欄には「ファイルを新規作成しました」と入力した後、右下にある「コミット」ボタンをクリックしています。

ここまでの作業でようやくファイルのバージョンを管理するという状態になっています。

8.
インストールをしてから初めてコミットした場合、誰がコミットをしたのか記録する必要があるため、「ユーザーネーム」と「メールアドレス」のウィンドウが表示されます。インストールの際に入力しているので、自動的に入力されます。(画像はわざと消してあります。)、特に問題ないのでOKをクリックします。

9.
無事にコミットが完了した後に「History」の画面を選択してください。コミットしたファイルのバージョンが表示されます。

この時、先ほどコミットの時に入力した内容と日時が表示されます。この「History」画面でファイルがどのように変更されたのかを確認するため、コミット時には「どのような変更を行ったのか?」を具体的に解りやすく書いておく必要があります。「バグ修正」とかしか書いてないような内容は論外です。数ヶ月後には完全に内容忘れてしまいます。

登録したLabVIEWファイルを更新する

10.
先ほど作成した「Sample.VI」の中身を更新します。定数のみで加算処理を行っていましたが、制御器を加算と繋げて任意の数字を加算できるようにVIを変更しました。

11.
暫く待っていると先ほどと同様に、Sourcetreeが更新が始まります。変更したVIファイルが「作業ツリーのファイル」として登録をされます。

また、「History」の欄に「コミットされていない変更があります」との表示が出てきます。

12.
一番初めにファイルを登録した時と同様にファイルをインデックスに追加します。

13.
コミットの内容としては「制御器を追加して任意の数字を入力が出来る状態に変更」と記載をしてボタンをクリックしました。

14.
「History」で確認すると一番初めに登録したファイルの上に更新した内容が追加されています。

更新したファイルの内容を破棄する。

15.
Sample.VIファイルを適当にForループで回すような機能を追加して保存しました。

しかし、よく考えると、この機能は不要なので前の状態に戻したいと思うことがあると思います。

一旦、LabVIEWで開いているSample.VIを閉じます。

16.
Sourcetreeの「History」を確認すると今までと同様にファイルがコミットされていないとの表示が出ています。このままコミットしてしまえば、新たなバージョンとしてSourcetreeに登録されますが、実際は不要な機能だったため登録しないことにします。

この場合、「作業ツリーのファイル」に表示されているファイルを右クリックして、出てきたウィンドウから「破棄」を選択します。本当に破棄するか確認をされます。今回は不要なので破棄します。

この作業をすると、Forループを追加してから保存したVIファイルは破棄(削除)され、Forループを追加する前のファイルに替わっています。

間違って保存した場合は、コミットせずに破棄をすることで、バージョンとして登録をせずに済みます。しかし、不用意に破棄をすると後で必要だったという可能性もあるため、破棄をする場合は十分に考慮してからが良いと思います。

ファイルを前のバージョンに戻す

コミットをした後に、前のバージョンにファイルを戻すことが出来ます。

17.
前のバージョンを選択してダブルクリックします。

18.
ダブルクリックをすると警告が表示されます。前のバージョンに戻るため、どのブランチ(分かれたファイル)にも属さないファイルとの警告内容です。

特に問題がなければ、そのままOKボタンをクリックします。今回の場合は単純に前のファイルに戻ろうとしているだけなので問題ありません。

OKをクリックすると一瞬何か処理を始めます。処理の内容としてはフォルダにあるファイルを前のバージョンに戻しています。

19.
前のバージョンにファイルが戻ると、今はどこが先頭かを表すために、「HEAD」タグ左端付きます。

20.
やっぱり前のバージョンから元の最新バージョン等に戻りたい場合は最新のファイルをダブルクリックします。すると、また警告が表示されます。内容としては前のバージョンが消える可能性があるため心配であれば、ブランチしてから行った方が良いのでは?という内容です。

特に変更とかしていないようであれば、そのまま「はい」ボタンをクリックすることで新しいファイルに戻ることが出来ます。

バージョン管理ソフトなので、使用したいバージョンを行ったり来たりすることが出来ます。しかし、旧のファイルからブランチするのはあまりオススメしません。最新で修正した内容に抜けが発生したりすることが多々あります。

ファイルをブランチ(枝分け)する

バージョン管理してきたファイルに途中で大幅な変更を加えたい場合についてはファイルを「ブランチ」という機能を使用します。

通常であればファイルをコピーして別のフォルダで管理したりしますが、コピーなどの操作は必要なくSourcetree上で簡単にファイルを枝分けすることが出来ます。

21.
ブランチしたいファイルを選択して右クリックをします。すると上記のようにウィンドウが表示されます。その中から「ブランチ」を選択します。

22.
新規ブランチに名前を入力します。今回は「機能変更」と入力しました。入力が終わったら、「ブランチを作成」をクリックします。

23.
ブランチを作成し終えると、左端にある「ブランチ」という項目の下に「master」と先ほど入力した「機能変更」2つが表示されています。また、ブランチとして選択をしたバージョンに「機能変更」というブランチをしたタグが付いています。

「master」と作成したブランチの「機能変更」についてですが、○と太字になっている方がアクティブです。切替を行いたいときは、切替たいブランチを選択してダブルクリックすることで切替を行うことが出来ます。

切替を行うことでリポジトリ(ディレクトリ)にあるファイルが自動的に変更されます。

24.
機能変更のブランチをアクティブにした状態でファイルを変更してみます。Whileループを使用して0.1秒ごとに1ずつ加算して数値を表示するプログラムに変更しました。

25.
今まで通り、変更後にSourcetreeに戻り、「History」欄を確認すると、樹形図の項目でバージョンが枝分かれしているのを確認することが出来ます。(赤丸部分)

コミットされていないので、今まで通りコミットを行います。

26.
コミットをすると、最新の物が一番上に表示をされますが、樹形図は枝分かれしています。コミット時にアクティブなブランチが青色で表示されます。

この状態から「master」をアクティブに変更して、LabVIEWのファイルを再度変更します。

27.
「master」で管理されてるファイルの中身を制御器2つ使用して加算した数値を表示器に変更するプログラムに変更しました。

28.
「master」のファイルを変更したので「機能変更」のブランチとは別にバージョンが管理されています。枝が2つに分かれているのが上記の図から解ると思います。

樹形図の項目でブランチをしたファイルごとにバージョンが管理がされている。

ブランチしたファイルをマージ(統合)する

ブランチしたファイルをブランチした状態のまま置いておくと、その内どちらを更新したら良いのか判断が出来なくなってきます。

そこで、ブランチしたファイルをマージ(統合)することで、どれが最新のファイルなのか判断出来る状態にします。

ブランチしたファイルをマージする方法について記載していきます。

29.
ブランチした「機能変更」のVIファイルにメインで追加したように制御器を2つにしてWhileループで加算するプログラムに変更しました。

30.
変更したファイルをコミットしてHistoryに追加します。

31.
ブランチの「master」をアクティブにします。

32.
masterをアクティブにした状態で、マージをしたいファイルを選択し、右クリックをします。右クリックをして出てきたウィンドウにあるマージをクリックします。

33.
「master」のブランチに「機能変更」のブランチをマージしてもよいか確認をされるので「OK」をクリックします。

34.
すると、マージを行おうとした結果、ファイルの衝突(競合)が発生しました。衝突の警告が出てきた場合、Sourcetreeが自動でマージを行うことが出来ないため、自分でまず衝突を解決することが必要となります。「閉じる」をクリックします。

今回の衝突の原因は「master」と「機能変更」で同じファイルを編集したことが原因で起きています。「機能変更」のブランチを追加した際に新規ファイルを作成しているだけであれば、衝突は起きません。

テキストファイルであれば、Sourcetreeが自動でテキスト内での衝突箇所を教えてくれますが、バイナリファイルになると自分でどうにかするしかありません。

35.
ファイルステータス画面を見ると、コミットを記載する場所にどのファイルが衝突を起こしているのかを記載してくれています。今回の場合は「機能変更」のSample.viが原因で起きています。

36.
「作業ツリーのファイル」を選択し、右クリックをします。するとウィンドウが出てきますので「競合を解決」にマウスポインタを合わせます。更にウィンドウが表示されるので、その中から競合を解決するための手段を選びます。

「自分の変更内容で解決」を選択するとmasterのファイルでマージされます。
「相手の変更内容で解決」を選択すると今回の場合は「機能変更」の内容でマージされます。

37.
なお、どちらを選択しても上書きとなってしまうという点については注意が必要です。上書きをするかどうか確認されるので問題なければ「OK」をクリックします。もし間違えてもバージョン管理はされているので最悪、マージを破棄して元に戻すことは出来ます。

38.
無事にマージが完了すると「Indexにステージしたファイル」の横に出ていた!マークが消えています。あとはいつも通りコミットをして登録をします。

39.
マージをしたことでブランチを行ったことで別れていた枝が合流(統合)されています。

マージをするとエラーが出る

40.
マージをしたときに競合を解決せずにマージを破棄して再度マージを行おうとすると上記のエラーが発生しました。これが発生する状態になると、マージをしてもコミットが出てきません。エラーが出てきたら、一度Sourcetreeを再起動してください。

以上の方法でSourcetreeを使用してLabVIEWファイルのバージョン管理を行うことが出来ます。ネットワーク上のリポジトリ作成方法や、ネットワーク上でのファイル管理についてまたその内記事にしたいと思います。