[Veracity]Veracityの基礎練習
結城浩先生の基礎練習をマネしてVeracityを勉強したいと思います。
コマンドラインでの一通りの操作を行なってみます。
Gitの基礎練習:http://www.hyuki.com/techinfo/gitinit.html
Veracity:http://veracity-scm.com/
ダウンロードとインストール
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: http://veracity-scm.com
- InfoQ: Veracity - 分散データベースを基盤とする新 DVCS http://www.infoq.com/jp/news/2011/07/Veracity
- Gitの基礎練習: http://www.hyuki.com/techinfo/gitinit.html
楽しいVeracityライフを!