[Veracity]Veracityの基礎練習

結城浩先生の基礎練習をマネしてVeracityを勉強したいと思います。
コマンドラインでの一通りの操作を行なってみます。

Gitの基礎練習:http://www.hyuki.com/techinfo/gitinit.html
Veracity:http://veracity-scm.com/

はじめに

Windows 7コマンドプロンプトでVeracityを動かしてみたいと思います。
基礎練習シリーズの真似なので概念の説明は省いてオペレーションのみ示します。

ダウンロードとインストール

Veracityのサイトからダウンロードします。Windowsは32bit/64bitのそれぞれにZipとMSIが用意されています。
今回はMSIをダウンロードします。今回私が使ったファイルはveracity_1.5.0.10647_x86.msiです。

インストーラはラインセンスに同意するかのチェックをつけてInstallボタンを押すだけで完了します。
デフォルトではC:\Program Files\SourceGear\Veracityにインストールされます。
(インストール場所を変える画面はありませんでした。Zipファイルの方をダウンロードして手動でインストールすれば自由な場所にインストールできます。)

ファイルをGitの管理下に置きましょう

ファイルをVeracityの管理下に置きましょう。

ディレクトリとファイルを作成しましょう

まずは作業環境を整え、readme.txtというファイルを作ります。

C:\>mkdir work

C:\>cd work

C:\work>mkdir myproject

C:\work>cd myproject

C:\work\myproject>echo This is a read me file. > readme.txt

C:\work\myproject>type readme.txt
This is a read me file.
カレントディレクトリ以下のファイルを管理下に置きましょう。
C:\work\myproject>vv init myprojectrepo .

C:\work\myproject>vv add .

C:\work\myproject>vv commit -m "Initial commit."
Error: The user has not been set. Use 'vv whoami' to set a user. ※事前にwhoamiコマンドで情報をセットしておかなかったのでエラーになった。

C:\work\myproject>vv whoami --create zuisener@example.com

C:\work\myproject>vv commit -m "Initial commit."

        revision:  2:c10bc00ebed59e30fd8ff609f0fdfcc9ba498ec1
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 15:20:14.579 +0900
         comment:  Initial commit.
          parent:  1:10468365b64efd643ba52e29b247bf366e841747
  • Veracityのinitコマンドは<レポジトリ名> <フォルダ名>を取ります。
  • コミット前に、whoami(Who am I?)コマンドで、自分の情報をセットしておきましょう。
  • 最初のコミットをした時点でリビジョンは2になります。initコマンドを使った直後はリビジョンは1です。

なお、initコマンドを使った直後に管理用のディレクトリができています。

C:\work\myproject>dir /b
.sgdrawer
readme.txt
差分を確認しましょう

readme.txtファイルに一行追加してから差分を確認してみましょう。

C:\work\myproject>echo nice to meet you >> readme.txt

C:\work\myproject>type readme.txt
This is a read me file.
nice to meet you

C:\work\myproject>vv diff
=== ================
===   Modified: File @/readme.txt
--- @/readme.txt        a56e6757d49cfd8fc3f6a2d954d8c5a7124a63c6
+++ @/readme.txt        2012/01/03 06:26:25.082 +0000
@@ -1 +1,2 @@
 This is a read me file.
+nice to meet you
現在の状態をみてみましょう
C:\work\myproject>vv status
Modified:  @/readme.txt
コミットすると編集結果が反映されます

行った修正は、コミットしてはじめてリポジトリに反映されます。 コミットするときには、-mオプションで修正内容を書きます。

C:\work\myproject>vv commit -m "Add a greeting."

        revision:  3:a772838a2b913c547a5c9f87edbeb57991907d0e
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 15:34:56.804 +0900
         comment:  Add a greeting.
          parent:  2:c10bc00ebed59e30fd8ff609f0fdfcc9ba498ec1

なお、gitでは-aオプションはaddされていないファイルに自動的にaddコマンドを実行するオプションですが、Veracityでは-aオプションはコミットを「ワークアイテム」(バグとか)に関連付けるために用います。詳細は省略します。

新しいファイルを追加します

作業コピーの状態を確かめます
C:\work\myproject>vv status

Veracityでは、標準出力はシンプルに抑えられています。特に何も変更がないので何も表示されません。

新しいhello.txtファイルを作ります
C:\work\myproject>echo Hello. > hello.txt

C:\work\myproject>type hello.txt
Hello.
新しく作ったファイルはまだVeracityの管理下にありません
C:\work\myproject>vv status
   Found:  @/hello.txt
hello.txtを追加します。
C:\work\myproject>vv add hello.txt

C:\work\myproject>vv status
   Added:  @/hello.txt

vv addで、 ファイルhello.txtをVeracityの管理下に置きました。 でも、まだリポジトリには反映していません。
vv statusを実行すると、 追加したけれどまだコミットしていないファイルがわかります(Added: @/という印がつきます。@/はカレントディレクトリが管理されているレポジトリのルートディレクトリを意味します(今はC:\work\myproject))。

コミットしてリポジトリに反映します
C:\work\myproject>vv commit -m "Add hello.txt."

        revision:  4:66dc9f7d393173681e2e2a13eb50d0f8a1eef683
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 15:41:05.999 +0900
         comment:  Add hello.txt.
          parent:  3:a772838a2b913c547a5c9f87edbeb57991907d0e

C:\work\myproject>vv status      ※ 作業コピーの変更がなくなったので何も出力されない。

新しいディレクトリを追加します

新しいディレクトリに新しいファイルを作り、リポジトリにコミットしてみましょう。

C:\work\myproject>mkdir src

C:\work\myproject>cd src

※ここでエディタを使ってGood.javaを作成します。

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good");
    }
}

C:\work\myproject\src>vv add Good.java

C:\work\myproject\src>vv status
   Added:  @/src/
   Added:  @/src/Good.java

C:\work\myproject\src>cd ..

C:\work\myproject>vv status
   Added:  @/src/
   Added:  @/src/Good.java

C:\work\myproject>vv commit -m "Add a Java source file."

        revision:  5:2ddaa224d665927e2b04baf0144cab56f52aa38d
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 15:46:54.696 +0900
         comment:  Add a Java source file.
          parent:  4:66dc9f7d393173681e2e2a13eb50d0f8a1eef683

C:\work\myproject>vv status

statusコマンドはどのディレクトリで実行しても出力ファイルはレポジトリ全体の変更が表示されます。
また、Veracityでは空のフォルダを管理できます。

編集からコミットまでの流れはこんな風に進みます

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!");
    }
}

C:\work\myproject\src>vv diff
=== ================
===   Modified: File @/src/Good.java
--- @/src/Good.java     386e6352a43647ac2cfbb8731eb696611a9ddb4a
+++ @/src/Good.java     2012/01/03 06:55:23.189 +0000
@@ -1,5 +1,5 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good");
+        System.out.println("Good!");
     }
 }

C:\work\myproject\src>vv commit -m "Add an exclamation mark."

        revision:  6:4e793fb855956b49d21770c77eb9ea52634624b6
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 15:56:04.519 +0900
         comment:  Add an exclamation mark.
          parent:  5:2ddaa224d665927e2b04baf0144cab56f52aa38d

ブランチを使ってみましょう

新しいブランチを作ります。
C:\work\myproject\src>vv branch list
master

C:\work\myproject\src>vv branch
master

C:\work\myproject\src>
C:\work\myproject\src>vv branch new mytrial
Working copy attached to mytrial. A new head will be created with the next commit.

C:\work\myproject\src>vv branch list
master

C:\work\myproject\src>vv branch
mytrial

branchコマンドはサブコマンドがたくさんあります。ややこしいので説明は省略しますが、ここで出てきたものだけ説明します。

vv branch listはレポジトリ全体に対してブランチを表示するコマンド、vv branch(サブコマンドなし)は現在の作業コピーが「アタッチ」しているブランチ名を表示するコマンドです。
vv branch new <ブランチ名>ではブランチが作られ、作業コピーが新しく作ったブランチに「アタッチ」されます。しかし、vv branch newコマンドは次にコミットするまではブランチ自体をレポジトリに反映しません。

ブランチをmytrialに切り替えましょう

すでにブランチはmytrialに切り替えられていますので、単にブランチでファイルを編集してコミットします。

C:\work\myproject\src>vv branch
mytrial

※ ここでエディタを使ってGood.javaを編集する。

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!!!!!!!!!");
        System.out.println("Try!Try!Try!");
        System.out.println("Good!Good!Good!");
    }
}
C:\work\myproject\src>vv diff
=== ================
===   Modified: File @/src/Good.java
--- @/src/Good.java     2a62fe7dc5e793ff1a54981c517a61d4608236c6
+++ @/src/Good.java     2012/01/03 07:12:10.597 +0000
@@ -1,5 +1,7 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good!");
+        System.out.println("Good!!!!!!!!!");
+        System.out.println("Try!Try!Try!");
+        System.out.println("Good!Good!Good!");
     }
 }

C:\work\myproject\src>vv commit -m "Add messages."

        revision:  7:51cff053125105ebbd478c2c6b7e171eee21e033
          branch:  mytrial
             who:  zuisener@example.com
            when:  2012/01/03 16:12:45.337 +0900
         comment:  Add messages.
          parent:  6:4e793fb855956b49d21770c77eb9ea52634624b6

C:\work\myproject\src>vv status
ブランチをmasterに戻してmytrialブランチの変更をマージしましょう
C:\work\myproject\src>vv branch
master

C:\work\myproject\src>vv branch attach mytrial
Working copy attached to mytrial. A new head will be created with the next commit.

C:\work\myproject\src>
C:\work\myproject\src>
C:\work\myproject\src>vv branch
mytrial

C:\work\myproject\src>vv branch attach master
Working copy attached to master. A new head will be created with the next commit.

C:\work\myproject\src>vv branch
master

C:\work\myproject\src>type Good.java ※ アタッチしているブランチを変えただけなので作業コピーの状態はそのまま
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!!!!!!!!!");
        System.out.println("Try!Try!Try!");
        System.out.println("Good!Good!Good!");
    }
}
C:\work\myproject\src>vv update ※ masterブランチのヘッドで作業コピーを更新する。

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!");
    }
}

C:\work\myproject\src>vv diff -b mytrial ※ -bオプションは--branchオプションと同じ
=== ================
===   Modified: File @/src/Good.java
--- @/src/Good.java     d02534bb8babfa42ec983463c3e758c00dfc74e5
+++ @/src/Good.java     2012/01/03 07:20:12.530 +0000
@@ -1,7 +1,5 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good!!!!!!!!!");
-        System.out.println("Try!Try!Try!");
-        System.out.println("Good!Good!Good!");
+        System.out.println("Good!");
     }
 }

Gitの基礎練習のとおりだとマージ(このケースはVeracityではマージではない)はちょっと変則的なやり方になります。これはmasterブランチの方で変更がないためです。後でマージのケースを示します。まずはmytrialブランチの内容をmasterに反映させる方法を示します。

C:\work\myproject\src>vv branch move-head master --rev 7    ※ 7はmytrialブランチのヘッドリビジョン

C:\work\myproject\src>vv branch attach master
Working copy attached to master. A new head will be created with the next commit.

C:\work\myproject\src>vv update

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!!!!!!!!!");
        System.out.println("Try!Try!Try!");
        System.out.println("Good!Good!Good!");
    }
}

上記の手順はVeracity Questionの回答を参考にしました。
http://veracity-scm.com/qa/questions/39/how-do-i-update-the-master-branch-after-merging-it-into-another-branch

ここまでの作業ログを見ましょう

C:\work\myproject\src>vv log

        revision:  7:51cff053125105ebbd478c2c6b7e171eee21e033
          branch:  mytrial
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 16:12:45.337 +0900
         comment:  Add messages.
          parent:  6:4e793fb855956b49d21770c77eb9ea52634624b6

        revision:  6:4e793fb855956b49d21770c77eb9ea52634624b6
             who:  zuisener@example.com
            when:  2012/01/03 15:56:04.519 +0900
         comment:  Add an exclamation mark.
          parent:  5:2ddaa224d665927e2b04baf0144cab56f52aa38d

        revision:  5:2ddaa224d665927e2b04baf0144cab56f52aa38d
             who:  zuisener@example.com
            when:  2012/01/03 15:46:54.696 +0900
         comment:  Add a Java source file.
          parent:  4:66dc9f7d393173681e2e2a13eb50d0f8a1eef683

        revision:  4:66dc9f7d393173681e2e2a13eb50d0f8a1eef683
             who:  zuisener@example.com
            when:  2012/01/03 15:41:05.999 +0900
         comment:  Add hello.txt.
          parent:  3:a772838a2b913c547a5c9f87edbeb57991907d0e

        revision:  3:a772838a2b913c547a5c9f87edbeb57991907d0e
             who:  zuisener@example.com
            when:  2012/01/03 15:34:56.804 +0900
         comment:  Add a greeting.
          parent:  2:c10bc00ebed59e30fd8ff609f0fdfcc9ba498ec1

        revision:  2:c10bc00ebed59e30fd8ff609f0fdfcc9ba498ec1
             who:  zuisener@example.com
            when:  2012/01/03 15:20:14.579 +0900
         comment:  Initial commit.
          parent:  1:10468365b64efd643ba52e29b247bf366e841747

        revision:  1:10468365b64efd643ba52e29b247bf366e841747
             who:  nobody
            when:  2012/01/03 15:16:42.749 +0900

マージをしましょう

mytrialブランチとmasterブランチでそれぞれ変更します

mytrialブランチで変更した内容はmasterブランチに反映してしまったので別の変更を加えます。なお、Veracityではコミットの取り消しはできません(Mercurialでいうrollbackはない)。

C:\work\myproject\src>vv branch attach mytrial
Working copy attached to mytrial. A new head will be created with the next commit.

C:\work\myproject\src>vv branch
mytrial

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Try!Try!Try!");
        System.out.println("Good!Good!Good!");
    }
}
C:\work\myproject\src>vv commit -m "Remove first good message."

        revision:  8:f873c7fc81183e134c5315c53ed520cf8c2eccb3
          branch:  mytrial
             who:  zuisener@example.com
            when:  2012/01/03 17:06:51.889 +0900
         comment:  Remove first good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033
C:\work\myproject\src>vv branch  attach master
Working copy attached to master. A new head will be created with the next commit.

C:\work\myproject\src>vv branch
master

C:\work\myproject\src>vv update    ※ 作業コピーはmytrial用の変更が残っているのでmasterのヘッドで更新します。

※ エディタでGood.javaを変更します。

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!!!!!!!!!");
        System.out.println("Try!Try!Try!");
    }
}

C:\work\myproject\src>vv commit -m "Remove last good message."

        revision:  9:612046820266adf17f1c9cf7d919c2fba49e9b9b
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 17:09:57.235 +0900
         comment:  Remove last good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033

C:\work\myproject\src>vv log

        revision:  9:612046820266adf17f1c9cf7d919c2fba49e9b9b
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 17:09:57.235 +0900
         comment:  Remove last good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033

        revision:  8:f873c7fc81183e134c5315c53ed520cf8c2eccb3
          branch:  mytrial
             who:  zuisener@example.com
            when:  2012/01/03 17:06:51.889 +0900
         comment:  Remove first good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033

        revision:  7:51cff053125105ebbd478c2c6b7e171eee21e033
             who:  zuisener@example.com
            when:  2012/01/03 16:12:45.337 +0900
         comment:  Add messages.
          parent:  6:4e793fb855956b49d21770c77eb9ea52634624b6

※ 1〜6は省略します

リビジョン7の変更はmaster, mytrialで共通なのでブランチ表示はなくなりました。
リビジョン8はmytrial, リビジョン9はmasterにあることがわかります。

mytrialブランチの変更内容をmasterブランチにマージします
C:\work\myproject\src>vv branch attach master
Working copy attached to master. A new head will be created with the next commit.

C:\work\myproject\src>vv update

C:\work\myproject\src>vv merge -b mytrial
1 updated, 0 deleted, 0 added, 1 merged, 0 unresolved

C:\work\myproject\src>type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Try!Try!Try!");
    }
}

C:\work\myproject\src>vv log

        revision:  9:612046820266adf17f1c9cf7d919c2fba49e9b9b
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 17:09:57.235 +0900
         comment:  Remove last good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033

        revision:  8:f873c7fc81183e134c5315c53ed520cf8c2eccb3
          branch:  mytrial
             who:  zuisener@example.com
            when:  2012/01/03 17:06:51.889 +0900
         comment:  Remove first good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033
(※ 1-7は省略します)

C:\work\myproject\src>type Good.java   ※ どちらの変更も適用されてGoodメッセージは両方なくなっている。
public class Good {
    public static void main(String[] args) {
        System.out.println("Try!Try!Try!");
    }
}
C:\work\myproject\src>vv commit -m "Merged from mytrial to master."

        revision:  10:c2b5a000d0bfc9ac31337afb2d2cc70323b7001d
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 17:16:27.497 +0900
         comment:  Merged from mytrial to master.
          parent:  9:612046820266adf17f1c9cf7d919c2fba49e9b9b
          parent:  8:f873c7fc81183e134c5315c53ed520cf8c2eccb3

C:\work\myproject\src>vv log

        revision:  10:c2b5a000d0bfc9ac31337afb2d2cc70323b7001d
          branch:  master
             who:  zuisener@example.com
            when:  2012/01/03 17:16:27.497 +0900
         comment:  Merged from mytrial to master.
          parent:  9:612046820266adf17f1c9cf7d919c2fba49e9b9b
          parent:  8:f873c7fc81183e134c5315c53ed520cf8c2eccb3

        revision:  9:612046820266adf17f1c9cf7d919c2fba49e9b9b
             who:  zuisener@example.com
            when:  2012/01/03 17:09:57.235 +0900
         comment:  Remove last good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033

        revision:  8:f873c7fc81183e134c5315c53ed520cf8c2eccb3
          branch:  mytrial
             who:  zuisener@example.com
            when:  2012/01/03 17:06:51.889 +0900
         comment:  Remove first good message.
          parent:  7:51cff053125105ebbd478c2c6b7e171eee21e033

        revision:  7:51cff053125105ebbd478c2c6b7e171eee21e033
             who:  zuisener@example.com
            when:  2012/01/03 16:12:45.337 +0900
         comment:  Add messages.
          parent:  6:4e793fb855956b49d21770c77eb9ea52634624b6
(※ 1-6は省略します)

C:\work\myproject\src>vv diff -b mytrial  ※ mytrial側にはmasterでの変更が反映されていないのでGoodGoodGoodメッセージが残っている。
=== ================
===   Modified: File @/src/Good.java
--- @/src/Good.java     e85ed0f66371bf6ec837b2c2f8205b3b148ad6e4
+++ @/src/Good.java     2012/01/03 08:19:15.624 +0000
@@ -1,6 +1,5 @@
 public class Good {
     public static void main(String[] args) {
         System.out.println("Try!Try!Try!");
-        System.out.println("Good!Good!Good!");
     }
 }

マージコマンドはデフォルトでは自動的にマージされるようになっています。自動マージしないようにするには--no-auto-mergeオプションを付けます。
マージコマンドを実行しただけではリポジトリに反映されていません。次のコミットで反映されます。

Veracityの基礎練習は以上です。お疲れ様。

この文書に書かなかったこと

Veracityの全貌を把握できていませんがこんな特徴があります。

  • ロック/アンロック
  • clone/pull/push
  • tag/stamp
  • サーバーモード
  • 無名ブランチ(Mercurialのようなものだと思う)

関連リンク


楽しいVeracityライフを!