11. バージョン管理 RCS,Git

books Photo by Taylor Barber on Unsplash

バージョン管理

われわれは一つのファイルを何度も修正することがある.

このファイルが大きかったり内容が複雑だったりする場合, 修正は常に「改善」であるとは限らず,「改悪」であるかもしれない. 修正作業そのもののミスにより,意図しない修正を施してしまうこともある. また,修正によって大事な情報を削除しないといけないというケースも存在するだろう.
こうしたとき,以前の状態のファイルを全てバックアップして保存しておけば, こうした問題は解決できる.
つまり,「ファイルのバージョン違い版を管理する」ことが適切に行えれば良いのだ.

こうした,ファイルのバージョン変更にまつわる情報を管理するツールを 「バージョン管理ソフト」と呼び,これらを使うと以下のようなことができる.

  バージョン管理を導入すると…
           ※ 管理用のデータ(ファイル)を保存しておけば

  1. どんなに古いバージョンのファイルも取り出せる.

  2. 元のファイルを消しても復活させることが可能.

  3. ファイルにバージョン番号などの情報を自動で埋め込める.

  4. 同時に複数の更新方針に従ってファイルを更新できる.バージョンの「枝分かれ」が出来るというやつだ.

  5. 複数人や複数のマシンでお互いに矛盾する更新作業をするトラブルが無い(というか無くす). 競合(conflict)の回避 もしくは 競合の解決 と呼ばれる機能1で,実はかなり重要な機能だ.

RCS

本講義では,バージョン管理ソフトとして, まずは入門として RCS を学ぼう.

この RCS は個人ユーザが使うのに適しており,比較的使いやすく,かつ,unix の歴史上も由緒正しいものであり,最初に学ぶには最適である. また,単純な分だけ,単独のファイルを管理するには後述のものより適しているとも言える.
また,より進化したバージョン管理ソフトとして他に GIT, CVS やSubversion などがある. これらは複数の人間で同じファイルを扱う場合や,ネットワーク越しにファイル管理を統合したいという場合にも対応できる優れたツールであるが,その分,使い始めるにはやや敷居が高いかな. 逆に,ローカル環境で個人で使う分には逆に RCS とそう変わらないとも言える.

そこで,本講義では個人が単独でファイルをローカルに扱うケースで RCS を解説する. 複数の人間で編集するとかネットワーク越しに統合したいという場合は 今だと Git (CVS や Subversionでも良いが) がより適しているので,それらを使うのが良かろう.



RCS 参考資料

RCS は 1982 年には既に姿を見せていたバージョン管理ソフトであり, 古くからよく知られている. 概念はシンプルで,使うコマンドもそう複雑ではないが, 参考となる資料があればより理解も深まるだろう.

資料名 解説
Official RCS Homepage RCS の公式 web.
Windows でも使えるバイナリが置いてあるのは大変助かる.
ちなみに、Windows 用としては rcs57pc1.zip だけ取得すれば良い.
これを解凍して実行ファイルをパスの通ったディレクトリに置けば良い.
GNU RCS 業界標準とも言える GNU の RCS. まあ,ここを情報の起点としておけば間違いない.
2022年 2月公開の最新バージョン 5.10.1 もソースファイルが置いてある.
Online Manual GNU RCS のマニュアルだ.細かいことはここを読もう.
「Unix 流プログラミング 36--42」 今泉氏 in "Unix Magazine", 1993.10 -- 1994.04, ASCII社.
man rcs
もしくは
man rcsintro
と入力して unix 上で入門マニュアルを読む.
簡潔で良くできた入門マニュアルである.
Revision Control System RCS 渡部氏 の web.
ここの RCS FAQ は RCS を使っていて困ったときに役立つだろう.
昔あった資料. ネットワークからは消えているが、wayback machine を使おう.
RCS: Revision Control System (http://www.swlab.csce.kyushu-u.ac.jp/Info/services/rcs.html)
RCS 超入門,RCS 初級講座,等々(http://www.dais.is.tohoku.ac.jp/~kabe/vsd/rcs/rcs.html).
RCS を使おう講座 (http://www.proc.org.tohoku.ac.jp/~minatsu/guide/rcs0.html)
The RCS Mini-Howto (http://www.linux.or.jp/JF/JFdocs/RCS.html)

それぞれの学習環境での状況

今回用いる RCS のインストール状況は各環境で以下のような状態だ.
ちなみに,古い RCS では rcs -V とするとバージョン番号が表示され,
新しめの RCS では rcs --version とするとバージョン番号が表示される.

環境 状況
阪大情報教育システム
Windows 10
dos/windows 用はインストールされていないため,cygwin の rcs が呼び出される.今回の学習にはこの環境を用いても良い.
阪大情報教育システム
cygwin
最新の rcs 5.10.1 がインストール済み.今回の学習にはこれを使っても良い.
阪大情報教育システム
CentOS7
rcs 5.9.0 がインストール済み.
今回の学習にはこれを用いても良い.
各自PC CentOS7
obtained at OSBoxes
rcs 5.9.0 がインストール済み.
今回の学習にはこれを用いても良い.
各自PC Ubuntu22
obtained at OSBoxes
デフォルトでは rcs は入っていないので,この表の下の手順でインストールしよう.rcs 5.10.1 がインストールされるだろう.
今回の学習にはこれを用いても良い.
各自PC Windows 上にあるように,dos 用 バイナリ からダウンロードして rcs 5.7 をインストールできる.今回はこれを使っても良い.
各自PC cygwin 未インストールならばインストールしておくと良い.package としてインストールできる.rcs 5.10.0 がインストールされるだろう.今回はこれを用いても良い.
各自PC Mac OS X 通常は未インストールの様子.インストールしよう.
"homebrew install rcs" などで良いのではないか.今回はこれを用いても良い.


(上の表の補足) Ubuntu 22.04 に RCS をインストールする手順:
下記のように,普通に apt コマンドでインストールすれば新しい版 ver. 5.10.1 がインストールされるのでそうすれば良い.

1
2
3
4
5
6
7
sudo apt udate
sudo apt upgrade
sudo apt autoremove
#
# …できればいったんリブート (sudo reboot)後に以下のコマンドを…
#
sudo apt install rcs



  RCS を用いるのであれば,今回の授業実習のあとに

  • 環境変数 TZJST-9
  • 環境変数 RCSINIT-zLT -x,v

設定しておくと楽ができるぞ.
具体的には,たとえばシェルとして fish を使っている人は ~/.config/fish/config.fish

1
2
set -x TZ JST-9
set -x RCSINIT "-zLT -x,v"

と書き足しておけば良い.



RCS の概念

RCS を理解するには,おおざっぱに言って バージョン, バージョン管理ファイル,チェックイン,チェックアウト,ロック という概念が分かれば良い. それらについて説明しよう.

概念, 単語 解説
バージョン(Version), リビジョン(Revision) 日本語で言うと「バージョン = 版」,「リビジョン = 改版」.
ファイルを更新して「新しい版になる=バージョンが上がる」
と考えれば良い.
バージョン管理ファイル 管理対象ファイルの情報全てが詰まったファイル.
管理対象ファイル名が dummy.tex だとすると,
通常は dummy.tex,v という名前になる.
つまり,元のファイル名の末尾に ",v"
をつけたファイルと思えば良い.
なお,バージョン管理ファイルは,初めてチェックインするときに自動的に作られる.
通常は,管理ファイルがあるディレクトリ(仮に dirA とする)の下に
RCS
という名前のディレクトリがあればその中(dirA/RCS)に,
無ければそのディレクトリ(dirA)に, バージョン管理ファイルが作られる.
どうするか尋ねてくることもある.その時は好きな方を答えれば良い.
ロック バージョン管理ファイルに「鍵」をかけること.
「ただいま私が編集中なので,他の人はいじれません」という意味.
ファイルをロックすると,他の人は新しいバージョンのファイルを登録できない.
この場合でも,他人はそのファイルを読み出すことはできる.
この機構によって,RCS は複数の人間による単一ファイルのバージョン管理を行っている.
これを「ロッキングによるファイル衝突の防止」とよぶ.
チェックイン 「このファイルが最新バージョンです」とファイルを登録する作業.

  ロックしてあるファイルしか登録できない!
ロックしていないファイルはチェックインできない.

こういう時は
rcs -l ファイル名
とするとファイルがロックされ,チェックインできるようになる.
詳しくは後述の rcs コマンドを参照すること.

初めて登録する時には,「そのファイルがどんなファイルなのか」を尋ねてくる.
また、登録時に「そのファイルのどこをどのように変更したのか」を尋ねてくるので,
これも後々のために丁寧に記述しておく.
チェックアウト バージョン管理ファイルからファイルを取り出す作業.

  ロックして取り出すと編集可能に,
ロックしないで取り出すと編集不可になる.

一人だけで使う場合は,常にロック状態で作業するか,
ロック機構を無効にするかすればよい.
詳しくは後述の rcs コマンドを参照すること.

RCS でのファイル管理,編集の流れ


a


RCS を個人一人で用いる時は,通常は上の図にあるように 「ロックつき」でチェックイン&チェックアウトしていればまず問題はないだろう(ちょっと邪道だが).

流れをもう少し詳しく書くと,RCS では

  1. 管理したいファイルを「バージョン管理ファイル」に チェックインする.
    バージョン管理ファイルは,初めてチェックインするときに自動的に作られる.

  2. バージョン管理ファイルから,使いたいファイルを ロックつきでチェックアウト して取り出す.

  3. ファイルを編集する.

    1. へ戻る.

という繰り返しで用いるのが普通である.
何か特別なことをしたい時だけ,別のことをすればよい.

  RCS で使うコマンドは実質的に一つだけ

実は,下で示す ci -l -zLT というコマンドだけ覚えておけばだいたいなんとかなる.

  実習
以下の手順に従い,rcs を試してみながら理解せよ.
なお、以下の手順は コマンドプロンプト, cygwin, (CentOS などの)端末エミュレータといった CUI での操作を想定している.

1.RCS の練習用に適当なディレクトリに移動する.

2.そのディレクトリの下に,バージョン管理ファイルを置く特別なディレクトリ RCS を作っておく.
具体的には、そのディレクトリで

1
mkdir RCS

とする.

3.次のような内容のサンプルファイルを,ファイル名 dummy.txt で作る.

1
2
3
4
5
Sample File
My name is hogehoge.
なんでもいいから書け.
$Id$
$Date$

なお、最後の2行だけは必ずそっくりに書き入れること.

4.初めてのチェックインを, 「ロック付きでチェックイン & チェックアウト」という動作で行ってみる.

具体的な操作としては

1
ci -l dummy.txt

とするだけでよい.

  ci -l は「チェックインした後,自動的にロック付きでチェックアウト」する便利なコマンドである.

さて,上記の作業を行うと,最初は次のようにメッセージが出る.

1
2
3
4
dummy.txt,v  <--  dummy.txt
enter description, terminated with single '.' or end of file:
NOTE: This is NOT the log message!
>>

この >> の部分に「このファイルの内容を記述せよ」と言われているので,後々のためにも(なるべく英語で?)きちんと記入する.

なお,記入し終わったら, . (ピリオド)のみの行 を記入すれば「記入終わり」となる.

記入が終わると,

1
2
initial revision: 1.1
done

という表示が出て,バージョン 1.1 という真新しいバージョンでこのファイルが登録されたことが分かる.

5.ディレクトリ RCS の中にバージョン管理ファイルができているか確認する.

操作としては

1
ls RCS

とすればよいだろう.

6.ci -l の自動チェックアウトがうまくいったかを確認する.

つまり,チェックアウトされたファイル dummy.txt が存在するか確認する. 操作としては

1
ls dummy.txt

とすればよいだろう.

7.チェックアウトされたファイルがどう変わったか見てみる.

これは

1
less dummy.txt

とすればよいだろう. どこがどう変わったかよく見てみよう.
また,時間がどう記述されているか,自分の腕時計などと比べてみよ.

8.サンプルファイルの中身の無難な場所を編集して変えてみよう.

実際は Emacs などのエディタを起動しての作業になる.
なお、$Id:…, $Date:… の部分はいじらないようにしよう.

9.そして、再びチェックイン & チェックアウトを行ってみる.

ただし今度は,-zLT という特別なオプションをつけて、

1
ci -l -zLT dummy.txt

としてみよう.

  -zLT は,「ローカル時間を用いて時間表示を記述する」というオプションである. われわれの場合、「日本時間」で時間が表示される.

こうすると,

1
2
3
4
RCS/dummy.txt,v  <--  dummy.txt
new revision: 1.2; previous revision: 1.1
enter log message, terminated with single '.' or end of file:
>>

という表示が出るだろう.

ここでは 「このファイルをどう変更したか記述せよ」と言われているので, 後々のためにもこれも(なるべく英語で?)きちんと記入する.

なお,記入し終わったら,やはり . (ピリオド)のみの行 を記入すれば「記入終わり」となる.

今度の終了は単に

1
done

と表示されるだけだろう.

10.チェックアウトされたファイルがどう変わったか再び見てみる.

1
less dummy.txt

とすればよいだろう. どこがどう変わったかよく見ておこう.
とくに時間の記述がどう変わったか,よく比べてみよう.

11.dummy.txt を消去してみる!

バージョン管理のありがたさを実感するための作業の一つとして、対象ファイルを一回消してみよう.

1
rm dummy.txt

としてみれば良いだろう.

12.dummy.txt を復活!

上の作業で、情報の詰まったバージョン管理ファイルは消えていないので, そこからチェックアウトすればファイルを復活できる. やってみよう.

具体的には,

1
co -l -zLT dummy.txt

とすればよい.

  チェックアウトコマンド co は(特に指定しなければ)最新バージョンのファイルを取り出す.

13.最新バージョンのファイルと、古いバージョンのファイルの違いを調べてみよう.

それには、具体的には

1
rcsdiff -zLT -r1.1 dummy.txt

とすればよい. これは,「今ある dummy.txt とそのバージョン 1.1 の内容を比べよ」というコマンドになる.

14.これまで dummy.txt に加えた編集の履歴を見る.

具体的には,

1
rlog -zLT dummy.txt

とすればよい. こうすると,今までのチェックインの際に記述した変更内容などがリストアップされる.

15.dummy.txt に埋め込んであるキーワード(Id, Date)を取り出してみる.

具体的には,

1
ident dummy.txt

とすればよい. こうすると,$Id:…$Date:… と書き込んだ部分が出力される.

  この機能はバイナリファイルに対しても有効であるので,本格的なプログラミングにも適用できる.
例えば,バイナリであるコマンド rcs 自身にはどのようなキーワードが埋め込まれているのか、調べてみよう.

RCS: キーワードの埋め込み

上にも出てきたように, $Id$$Date$ のように、ファイルのなかに決まったキーワードを $ で囲んで埋め込んでおくことで, RCS の様々な情報を自動的に記述することができる. 以下に,どのようなキーワードがあるのかを示そう.

キーワード 意味
Id ファイルの名前,バージョン,日時,作成者,状態,ロックした者
という情報.大体はこれで十分だろう.
Header Id とほぼ同じ情報になるが,ファイル名が「フルパス」で記述される.
情報が無駄に長くなるだけなので一般にあまり使われないが,使いたい場面もあるかも知れない.
Date そのバージョンがチェックインされた日時.
Revision バージョン.
Author そのバージョンをチェックインしたユーザ名.
Locker 現在そのファイルをロックしているユーザ名.
RCSfile ファイル名.
Source ファイル名.ただし,フルパス.
State そのバージョンの「状態」.通常は Exp になっているだろう.
Log そのチェックインの際の「変更点記述」を表示する.
ファイルが大きくなってしまうのと,rlog で同じことができるということから,あまり使われない.

  実習
上のキーワードを全て書き込んだファイルを作成し,チェックイン & チェックアウトして,キーワードがどう作用しているか確認せよ.



RCS の コマンド

以下に,RCS のコマンドについて簡単な一覧を載せよう. 通常はこれぐらい知っていれば十分なはずである(詳しくは man コマンドで調べれば良い).

コマンド 解説
ci オプション ファイル名 チェックインコマンド.
何もオプションをつけないと,ファイルが登録 & 吸収
されてしまって,手元に元のファイルが無くなる.
こういう時は慌てずにチェックアウトしよう.

オプションは以下の通り.
-l
チェックイン後,自動的に「ロック付きで」チェックアウトする.
-u
チェックイン後,自動的に「ロックなしで」チェックアウトする.
-zLT
時間表記を「ローカル時間」で行う.
これが無いときは,グリニッジ標準時で時間表記される.
-rリビジョン番号
指定したリビジョン番号でチェックインする.
リビジョンを大きくあげたい,というときなどに用いる.
-f
ファイルが変更されていなくても強制的にチェックインする.
co オプション ファイル名 チェックアウトコマンド.

オプションは以下の通り.
-l
「ロック付きで」チェックアウトする.
-u
「ロックなしで」チェックアウトする.
-zLT
時間表記を「ローカル時間」で行う.
これが無いときは,グリニッジ標準時で時間表記される.
-rリビジョン番号
指定したリビジョン番号のバージョンのファイルをチェックアウトする.
-f
既にファイルが存在していても,チェックアウトして強制的に上書きする.
ident オプション ファイル名 ファイル内のキーワードを読み出すコマンド.

大きく動作が変わるオプションは無い.
rlog オプション ファイル名 バージョン管理ファイルの履歴記録や関連情報を出力する.

オプションは以下の通り.
-L
ロックされているファイルだけを対象とする.
-R
バージョン管理ファイル名を表示する.
-h
関連情報を表示する.
-t
関連情報を表示する.-h オプションよりも少しだけ情報が多い.
-rリビジョン番号
指定されたリビジョン番号のファイルの情報のみを表示する.
rcsdiff オプション -r番号1 -r番号2 ファイル名 バージョン管理されているファイルのバージョン違いを比べる.
二個の番号は省略が可能で,番号の個数によって次のように動作する.
番号1 と番号2 が与えられている
各々の二つのバージョンのファイルを比較する.
番号1 のみが与えられている
番号1 のバージョンのファイルと,現在存在するファイルとを比較する.
番号は一つも与えられていない
登録済みの最新バージョンと,現在存在するファイルとを比較する.
rcs オプション ファイル名 バージョン管理ファイルの様々な性質を変更する.

オプション(省略できないかも)は以下の通り.
-l
ファイルをロックする.
-u
ファイルをロック解除する.
-L
ロックを厳密に行うモードにする(普通はデフォルト).
-U
ロック機構をほぼ無効にする.
このモードでは,ロックされていないファイルでもチェックインできる.
ロックが役に立つこともあるので,ロック機構を無効にすることは
あまりお勧めしない.

Git

次に,やはりローカルで個人で使うという同じ想定のもとで,バージョン管理ソフトとして現在,おそらくベストなソフトウェアの筆頭であろう Git について学ぼう. この想定下であれば行うことはほぼ同じだが,大きな違いが一つあってそれは

  Git は,基本的にはディレクトリ丸ごとを管理対象とする

という点だ. であるのでそのつもりで以下の内容を学ぼう.

  なお,Git は GitHub と呼ばれるサーバなどを用いてネットワークを使ってファイルを管理できる機能が特に優れているソフトなのだ. であるので,実際に使い込むのであればそうしたサーバとの連携について調べて使おう. ただし,阪大情報教育計算機システムのネットワークは Git の外部との通信を遮断するので他の環境で使おう.

さて,資料が少し長くなりすぎたので,簡単に紹介しておこう.

それぞれの学習環境での状況

今回用いる git のインストール状況は各環境で以下のような状態だ.

環境 状況
阪大情報教育システム
Windows 10, cygwin
(cygwinの) git 2.35.1 がインストールされているようだ.
今回はこれを用いても良い.
阪大情報教育システム
CentOS7
git 1.8.3.1 がインストール済み.
今回はこれを用いても良いがさすがに古いかなあ.
各自PC CentOS7
obtained at OSBoxes
そのままだと上と同じだが,この表の下のような update 作業をすることで git 2.36.1 などにできる.
今回はこれを用いても良い.
各自PC Ubuntu22.04
obtained at OSBoxes
デフォルトで git 2.34.1 あたりが入っていると思うが,もしも入っていない場合は表の下の記述のようにしてインストールすれば良い.今回の授業にはこれを用いても良い.
各自PC Windows Git for Windows からダウンロードして今だと Git 2.36.1 をインストールできる.今回はこれを使っても良い.
各自PC cygwin 未インストールならばインストールしておくと良い.package としてインストールできる.今だと Git 2.36.1 がインストールされるだろう.今回はこれを用いても良い.
各自PC Mac OS X インストールされていれば良し,そうでなければ コマンドライン・デベロッパ・ツールをインストールすれば良い.すると Git が使えるようになるはずだ.今回はこれを用いても良い.

  CentOS 7 で git を update するには今現在だと以下のようにすれば良い.

sudo yum remove git
sudo yum install https://repo.ius.io/ius-release-el7.rpm https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
sudo yum install pcre2 (念の為.おそらく皆は不要だろう)
sudo yum install git --enablerepo=ius --disablerepo=base,epel,extras,updates

  Ubuntu 22.04 で(万が一) git が入っていない場合にインストールするには以下のようにすれば良い.

sudo apt update
sudo apt upgrade
reboot (念の為)
sudo apt install git

  Git を一回も使ったことがない場合は設定が必要になるだろう. とりあえず,以下の 2つのコマンドを実行しておこう.
なお,GitHub と連携させる場合はそちらで先に設定してそれを手元にコピーしてくる格好なので,下の2行の操作は不要だ.

git config --global user.email "namae@mailaddress.ac.jp"  ← 自分のメールアドレス
git config --global user.name "Taro Yamada"  ← 自分の名前

なお,git の設定については,git config -l とすると設定が出力されるので,上の設定を行った場合はその後に確かめておこう.なにも設定してないときはなにも出力されない.



Git の概念

(ローカルで使う場合) Git を理解するには,おおざっぱに言って リポジトリ,ステージング,コミット という概念が分かれば良い. それらについて説明しよう.

概念, 単語 解説
リポジトリ 管理対象ディレクトリの情報が詰まったディレクトリ.

  上にも書いたように,Git では,管理対象はディレクトリだと思っておこう(本当はディレクトリ中のファイルだが).

ローカル管理のデフォルトでは,管理対象のディレクトリの下に .git という名前でディレクトリが作られ,そこに入っている.
作成には git init を使う.
ステージング (後述の)コミットの対象にすること.
git add を使う.
コミット ファイルの変化をリポジトリに登録すること.RCS でいう チェックイン だと思えば良い.
git commit を使う.

Git でのファイル管理,編集の流れ



Git を個人一人でローカルで用いる時は,通常は上の図にあるように ステージングとコミットだけしていればまず問題はないだろう(ちょっと邪道だが).

流れをもう少し詳しく書くと,RCS では

  1. ファイルやリポジトリを他からコピーしてきた場合でなければ, 最初に対象ディレクトリで git init というコマンドでリポジトリを作成する. これは一回だけやれば良い.

  2. 管理したいファイルをリポジトリに ステージング & コミットする.
    git addgit commit を使う.

  3. ファイルを編集する.

    1. へ戻る.

という繰り返しで用いるのが普通である.
何か特別なことをしたい時だけ,別のことをすればよい.

  Git で使うコマンドは通常はこれだけ

実は,下で示す
git add *
git commit -m "メッセージ"
git tag -a "タグ名" -m "メッセージ"
というコマンドだけ覚えておけばだいたいなんとかなる.

  実習
以下の手順に従い,Git を試してみながら理解せよ.
なお、以下の手順は コマンドプロンプト, cygwin, (CentOS などの)端末エミュレータといった CUI での操作を想定している.

  1. Git の練習用に適当なディレクトリに移動する.

  2. そのディレクトリに以下のようにしてリポジトリを作成する.
1
git init
  1. 次のような内容(実はなんでもいい)のサンプルファイルを,ファイル名 dummy.txt で作る.
1
2
3
Sample File
My name is hogehoge.
なんでもいいから書け.
  1. 以下のようにしてステージング & コミットをする.
1
2
git add *
git commit -m "なにかメッセージを書く"
  1. サンプルファイル dummy.txt の中身を編集して変えてみる.後のためにわかりやすく変えておくと良い.

  2. 以下のように,再びステージング & コミットをする.
1
2
git add *
git commit -m "なにかメッセージを書く"
  1. 異なる内容(実はなんでもいい)で,他のサンプルファイルをファイル名 dummy2.txt などで作る.
1
2
Sample File No.2.
なんでもいいから書いたよ.
  1. 以下のように,再びステージング & コミットをする.
1
2
git add *
git commit -m "なにかメッセージを書く"
  1. これまでの情報の登録がどうなっているか,次のようにして記録を見てみる. これまでのファイルの追加や変更などが記録されているのがわかるだろう.
1
git log -p
  1. Git にはバージョンという概念がなく,代わりにハッシュ値と呼ばれる長ーい文字列(git log で "commit" のあとに表示されているやつ)が用いられる. ただこれは見てわかりやすいものではないので,わかりやすくするために重要なコミットには「タグ」をつけることがオススメだ. それには git tag -a "タグ名" -m "メッセージ" とする(最後のコミットにタグをつける).
    ここでは例として以下のようにやってみよう.
1
git tag -a "v1.1" -m "I tagged a version number."
  1. タグがどうなったか,以下のように確認してみよう.
1
2
git log
git show v1.1
  1. サンプルファイル dummy2.txt の中身を編集して変えてみる.後のためにわかりやすく変えておくと良い.

  2. 以下のように,再びステージング & コミット & タグづけ をする.
1
2
3
git add *
git commit -m "なにかメッセージを書く"
git tag -a "v1.2" -m "I changed the dummy2.txt."
  1. タグがどうなったか,さらに確認してみよう.
1
2
git log
git show v1.2
  1. 古いファイルを取り出してみよう. それには git checkout コミット指定(ハッシュ値やブランチ,タグで) -- ファイル名 とすれば良い. ここでは例えば以下のようにやってみよう.
1
git checkout v1.1 -- dummy2.txt

そして, dummy2.txt の中身が古いものに戻ったことを確かめておこう.

レポート

以下の課題について能う限り賢明な調査と考察を行い,
2022-AppliedMath7-Report-11
という題名をつけて e-mail にて教官宛にレポートとして提出せよ. なお,レポートを e-mail の代わりに TeX で作成した書面にて提出してもよい.

  注意
  近年はセキュリティ上の懸念から,実行形式のプログラムなどをメールに添付するとそのメールそのものの受信を受信側サーバが拒絶したりする. そういうことを避けるため,レポートをメールで提出するときは添付ファイルにそういった懸念のあるファイルが無いようにしよう.

課題

  1. この授業でこれまでに作成したファイルの全てに RCS もしくは Git でのバージョン管理を試みてみよ.

    (RCS の場合)その際,$Log$ を盛り込んでみて支障がないかどうかチェックせよ. もし支障があるならば,どうやって解決すれば良いかマニュアルを調べるなどして考えよ.

  2. RCS や Git の GUI(グラフィカルユーザーインターフェース)版というべきソフトウェアが無いか探してみよ. 見つけたならば,使ってみてレビューせよ.

  3. Git における「競合(conflict)の解決」がどのようなものか,調べてみよう.

  4. Emacs や Visual Studio などのエディタは RCS や Git などのソフトを使ってバージョンコントロールが出来る. Emacs 使いは,C-x v v だけ知っていればだいたい使えるし,Visual Studio には Git メニューが有るはずだ.試してみよう.
    ※ Emacs では RCS の名称は「大文字での RCS」だ.rcs は認識されないので気をつけよう.

  5. 余裕があるならば,GitHub に登録して,たとえばシェルの設定ファイルなどを試しに管理してみよう.

  1. 競合の回避は「ロックによる編集権の排他制御」などで行われ,競合の解決は「矛盾しそうな更新の登録時にその登録者に解決を依頼する」などの方法で行われる.RCS などの古いソフトは回避で,Git のような新しめのソフトは解決で,ということが多いよ. ↩︎