SlideShare a Scribd company logo
バージョン管理システムチュートリアル
バージョン管理システムチュートリアル
CMSI 神戸ハンズオン
2013-08-22
本教材の LATEX ソースは https://github.com/cmsi/vcs-tutorial にて公
開中
1 / 47
バージョン管理システムチュートリアル
Outline
1 チュートリアルの概要
2 準備作業
3 バージョン管理システムの概要
4 git の基礎
5 ブランチとマージ
6 リモートリポジトリとの連携
7 github を用いたオープンソース・ソフトウェアの開発・公開
8 その他
2 / 47
バージョン管理システムチュートリアル
チュートリアルの概要
VCS チュートリアル スタッフ
講師
藤堂眞治 (東大物性研) wistaria@issp.u-tokyo.ac.jp
五十嵐 亮 (東大物性研) rigarash@issp.u-tokyo.ac.jp
松尾春彦 (RIST) halm@rist.or.jp
本山裕一 (東大院工) yomichi@looper.t.u-tokyo.ac.jp
主催
CMSI: 計算物質科学イニシアティブ
http://cms-initiative.jp/
共催
RIST: 一般財団法人 高度情報科学技術研究機構
http://www.rist.or.jp/
3 / 47
バージョン管理システムチュートリアル
チュートリアルの概要
チュートリアルの流れ
準備作業
バージョン管理システムとは? (講義 & 実習)
git の基礎 (講義 & 実習)
ブランチとマージ (講義 & 実習)
リモートリポジトリとの連携 (講義 & 実習)
github を用いたオープンソース・ソフトウェアの開発・公開
(講義 & 実習)
MateriApps と MateriApps Live の紹介
(optional) A successful Git branching model (講義)
(optional) Git をボトムアップから理解する (講義)
4 / 47
バージョン管理システムチュートリアル
準備作業
ネットワーク設定
LAN 接続 (無線 or 有線)
実習用ワークステーションのアカウント登録
github アカウント登録 (まだアカウントを持っていない人
のみ)
https://github.com にアクセス
“Sign up for GitHub” をクリック, 必要事項を記入した後,
“Create an account”
SSH 公開鍵の登録 (“Account settings” ⇒ “SSH Keys”)
sourceforge アカウント登録 (まだアカウントを持っていない人
のみ)
http://sourceforge.net/ にアクセス
右上の “Join” をクリック, 必要事項を記入して “Register”
5 / 47
バージョン管理システムチュートリアル
準備作業
PC への git クライアントのインストール
Windows & Mac OS X
http://git-scm.com/downloads からインストーラーをダウ
ンロード
Mac の場合は MacPorts からインストールすることも可
$ sudo port install git
Linux
Redhat 系
$ sudo yum install git
Debian 系
$ sudo apt -get install git
6 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
diff と patch によるバージョン管理
diff: 2 つのテキストファイルの差分を出力するコマンド
ファイル全体を保存するよりコンパクト
変更点を確認しやすい
patch: diff コマンドが生成した差分をファイルに適用するユー
ティリティー
もとのファイルと差分から変更後のファイルを生成できる
7 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
実習: diff & patch (1)
単一ファイルの例
$ cp /home/hands -on/vcs/diff/prologue.txt prologue
.txt
$ cp prologue.txt prologue -orig.txt
$ vi prologue.txt # prologue.txt を 編 集
$ diff -u prologue -orig.txt prologue.txt >
prologue.diff
$ less prologue.diff # prologue.
d i f f の 中 身 を 見 て み る
$ cp /home/hands -on/vcs/diff/prologue.txt prologue
.txt
$ patch < prologue.diff
$ less prologue.txt # prologue. t x t の 中 身 を 確 認
8 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
実習: diff & patch (2)
ディレクトリ全体を扱う例
$ cp -r /home/hands -on/vcs/diff shake
$ cp -r shake shake.orig
# s h a k e の 中 の フ ァ イ ル を 編 集 ( フ ァ イ ル の 削 除 や 追 加 も
可 )
$ diff -urN shake.orig shake > shake.diff
$ less shake.diff # shake. d i f f の 中 身 を 見 て み る
$ rm -rf shake
$ cp -r /home/hands -on/vcs/diff shake
$ patch -p0 < shake.diff
# s h a k e の 中 身 を 確 認
diff と patch で差分の管理は可能になるが, 履歴は別に管理し
ておかなければならない
9 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
バージョン管理システムとは?
ファイルの履歴をデータベース (リポジト
リ) で一括管理するシステム
もともとはプログラムのソースコードのた
めのシステム
それ以外のファイル (例えば LATEX ファ
イル) 管理にも使える
一人で使っても複数人で使っても超便利
超優秀な秘書のようなもの
10 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
なぜバージョン管理システムが必要なのか?
作業者 and/or 作業場所が複数になると,
ファイル名や手書きのログファイルによる
バージョン管理はすぐに破綻する
ネットワーク経由でファイルを check
out/check in
更新毎に一意なバージョン番号 (リビ
ジョン) を付与
任意のバージョン間の比較が容易
バックアップの代わりにも
複数箇所から同時に更新した場合に衝突を
回避するしくみを備えている
ブランチ・マージ・タグ付けなどが可能
11 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
ありがちなパターン
University of Tokyo
25/45
1)
B
3)
A
2)
B
4)
A
12 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
バージョン管理している場合
University of Tokyo
26/45
1) 2)
A
3)
A 4)B
5)
6)
C
7) ( )
13 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
主なバージョン管理システム
BitKeeper - かつて Linux のカーネルのソース管理に使われて
いた
CVS (Concurrent Versions System) - ネットワークでの利用を
考慮とした初めてのバージョン管理システム. 以前はよく使わ
れていた
Git - 現在 Linux の開発に使われている. 分散型リポジトリ
Mercurial - Git のライバル. 分散型リポジトリ
SCCS (Source Code Control System) - 70 年代にベル研で開発
された世界初のバージョン管理システム. 現在は使われない
Subversion - CVS の改良版として開発された. 現在最もポピュ
ラー? Mac OS X や多くの Linux には最初からインストールさ
れている
14 / 47
バージョン管理システムチュートリアル
バージョン管理システムの概要
バージョン管理システムの欠点 (面倒な点)
修正前に最新の状態にアップデートしなければならない
⇒ 慣れると習慣になります
全ての修正を「コミット」しなければならない
⇒ 慣れると習慣になります
衝突 (コンフリクト) が発生した時に対処しなければならない
⇒ 衝突に気づかずに修正してしまうほうが怖いです
サーバのセットアップが面倒くさい
⇒ まずはホスティングサービス (github, sourceforge,
bitbucket) を試してみましょう
⇒ まわりにいるプロ (?) に相談しましょう
バージョン管理システムを使うと作業効率が倍以上になる
⇒ 使わないと人生を半分損する
15 / 47
バージョン管理システムチュートリアル
git の基礎
git の基礎
「いつやるの? git 入門」ページ 28–34, 55, 58–110
http://www.slideshare.net/matsukaz/git-17499005
16 / 47
バージョン管理システムチュートリアル
git の基礎
実習: git の基礎 (1)
ユーザ名などの設定 (ログなどに使用される)
$ git config --global user.name ’XXXX YYYY ’
$ git config --global user.email xxx@yyy.zz
作業用ディレクトリと git リポジトリの作成
$ mkdir myproject
$ cd myproject
$ git init
Initialized empty Git repository in /home/xxx/
myproject /.git/
$ ls -a
. .. .git
全ての履歴情報は .git に保存される. けっして .git を消さない
ように!
17 / 47
バージョン管理システムチュートリアル
git の基礎
実習: git の基礎 (2)
ファイルの作成 & 管理対象に追加 (ステージング)
$ vi readme.txt
$ git add readme.txt
$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file >..." to unstage)
#
# new file: readme.txt
#
18 / 47
バージョン管理システムチュートリアル
git の基礎
実習: git の基礎 (3)
リポジトリに登録 (コミット)
$ git commit -m ’Initial commit ’
[master (root -commit) 5714 b10] Initial commit
0 files changed
create mode 100644 readme.txt
$ git status
# On branch master
nothing to commit (working directory clean)
メッセージ中の “5714b10” がコミット ID(の最初の何文字か)
19 / 47
バージョン管理システムチュートリアル
git の基礎
実習: git の基礎 (4)
ファイルを編集
$ vi readme.txt
差分を見てみる
$ git diff
diff --git a/readme.txt b/readme.txt
index eaf543d .. c337c4e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
Example of readme file.
+Added a new line.
20 / 47
バージョン管理システムチュートリアル
git の基礎
実習: git の基礎 (5)
ステータスを確認
$ git status
# On branch master
# Changes not staged for commit:
# (use "git add <file >..." to update what will
be committed)
# (use "git checkout -- <file >..." to discard
changes in working directory)
#
# modified: readme.txt
#
no changes added to commit (use "git␣add" and/or "
git␣commit␣-a")
21 / 47
バージョン管理システムチュートリアル
git の基礎
実習: git の基礎 (6)
ステージング, コミット
$ git add readme.txt
$ git commit -m ’Added one line.’
[master c498a65] Added one line.
1 file changed , 1 insertion (+)
ログの確認
$ git log
commit c498a65ae0a267c206ab1e89fbdb6cfc31d56f2f
Author: Synge Todo <wistaria@issp.u-tokyo.ac.jp >
Date: Wed Aug 11 22:37:03 2013 +0900
Added one line.
...
22 / 47
バージョン管理システムチュートリアル
git の基礎
実習: git の基礎 (7)
新しいファイルの作成, ステージング, コミット
$ vi hello.txt
$ git add hello.txt
$ git commit -m ’Created hello.txt ’
サブディレクトリの下にファイルを作成
$ mkdir src
$ vi src/myprog.f
$ git add src/myprog.f
$ git commit -m ’Initial version of myprog.f’
ファイルの削除, 移動, コミット間の差分
23 / 47
バージョン管理システムチュートリアル
ブランチとマージ
ブランチとマージ
「いつやるの? git 入門」ページ 112–152
http://www.slideshare.net/matsukaz/git-17499005
「こわくない Git」ページ 6–78
http://www.slideshare.net/kotas/git-15276118
24 / 47
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (1)
develop ブランチの作成
$ git branch develop
$ git checkout develop
Switched to branch ’develop ’
$ git branch
* develop
master
develop ブランチに doc.txt を作成
$ vi doc.txt
$ git add doc.txt
$ git commit -m ’Created documentation ’
[develop 9b5f323] Created documentation
1 file changed , 1 insertion (+)
create mode 100644 doc.txt
25 / 47
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (2)
master ブランチに戻ってみる
$ git checkout master
$ ls
hello.txt readme.txt src
doc.txt がなくなっていることに注��
もう一度, develop ブランチに切り替え
$ git checkout develop
$ ls
doc.txt hello.txt readme.txt src
26 / 47
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (3)
master ブランチでファイルを編集, コミット
$ git checkout master
$ vi hello.txt
$ git add hello.txt
$ git commit -m ’Modified hello.txt ’
この時点で master と develop が枝分かれ!
develop ブランチを master ブランチにマージ
$ git merge develop
Merge made by the ’recursive ’ strategy.
doc.txt | 1 +
1 file changed , 1 insertion (+)
create mode 100644 doc.txt
27 / 47
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (4)
コミットグラフ (の一部) を表示
$ git log --graph
...
github (後述) を使っている場合には, ブラウザでコミットグラ
フを見ることができる
28 / 47
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (5)
今度はコンフリクトが起こるような修正を行ってみる
$ git checkout develop
$ vi hello.txt # 先 程 と 同 じ 場 所 を 違 う 文 字 列 に 修 正
$ git add hello.txt
$ git commit -m ’Modified hello.txt differently ’
マージしようとすると失敗する!
$ git checkout master
Switched to branch ’master ’
$ git merge develop
Auto -merging hello.txt
CONFLICT (content ): Merge conflict in hello.txt
Automatic merge failed; fix conflicts and then
commit the result.
29 / 47
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (6)
hello.txt の中を見るとコンフリクトした箇所がわかる
$ cat hello.txt
<<<<<<< HEAD
hello , CMSI
=======
hello , MateriApps
>>>>>>> develop
’<<<<<<<’ と’>>>>>>>’ の間の領域がコンフリクト
ファイルを編集してコンフリクトを解消, コミット
$ vi hello.txt
$ cat hello.txt
hello , MateriApps
$ git add hello.txt
$ git commit -m ’Merge branch develop ’
30 / 47
バージョン管理システムチュートリアル
リモートリポジトリとの連携
リモートリポジトリとの連携
「いつやるの? git 入門」ページ 154–193
http://www.slideshare.net/matsukaz/git-17499005
31 / 47
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (1)
実習で用いる github 上のリモートリポジトリ
git@github.com:cmsi/vcs-hands-on.git
ブラウザでのアクセス
https://github.com/cmsi/vcs-hands-on
リモートリポジトリをローカルに複製
$ git clone git@github.com:cmsi/vcs -hands -on.git
Cloning into ’vcs -hands -on ’...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4) , done.
remote: Total 4 (delta 0), reused 4 (delta 0)
Receiving objects: 100% (4/4) , done.
32 / 47
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (2)
課題 1: 自分のページの作成
todo.html を自分の名前にコピーして編集
$ cd vcs -hands -on
$ cp todo.html igarashi.html
$ vi igarashi.html
index.html を編集し, 自分のページヘのリンクを作成
ローカルリポジトリにコミット
リモートリポジトリにプッシュ
$ git push origin master
33 / 47
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (3)
課題 2: 他の人のページから自分のページへのリンクの作成
リモートブランチ (origin/master) を最新版に更新し, master に
マージ
$ git fetch
$ git merge origin/master
誰かのページを編集. 自分のページヘのリンクを作成
ローカルリポジトリにコミット
リモートリポジトリにプッシュ
34 / 47
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (4)
プッシュが失敗した場合
誰かがすでにプッシュしている
まずリモートリポジトリの内容をマージしてから再度プッシュ
$ git fetch
$ git merge origin/master
$ git push origin master
マージの際にコンフリクトした場合
ファイルを修正しコミットした後, プッシュ
コミットグラフの確認
$ git log --graph
あるいはブラウザで
https://github.com/cmsi/vcs-hands-on/network にア
クセス
35 / 47
バージョン管理システムチュートリアル
リモートリポジトリとの連携
git ワークフローのまとめ
remote
repository
local
repository
indexwork space
add
commit
push
checkout <file>
fetch
merge/rebase
checkout <commit>
FETCH_HEAD
Basic git working flow
36 / 47
バージョン管理システムチュートリアル
リモートリポジトリとの連携
バージョン管理システムを使う上での注意点
git が管理している領域からファイルを持ちだして編集しては
いけない
大きなバイナリファイル (pdf, exe, doc, tar.gz, zip など) を git
で管理しない
37 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
「公開ソフト」に必要なもの
マニュアル
チュートリアル
ライセンス
ビルドシステム and/or インストーラー
ソースコード配布
Linux で一般的. ソースと一緒にビルド環境 (Makefile, CMake,
configure スクリプト) を配布
バイナリ配布
Windows で一般的. バイナリインストーラー形式で配布
ユーザフレンドリな操作環境 (GUI など)
ユーザサポート体制
38 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
ビルドシステム: CMake
Makefile を生成するためのユーティリティー (configure スクリ
プトに対応)
Windows の Visual C++ 用ソリューションファイル, Mac OS
X の Xcode 用プロジェクトファイルの生成も可能
設定は CMakeLists.txt に記述する
テスト (CTest) やバイナリインストーラ作成 (CPack) の機能
もある
ファイルの依存関係の自動検出
必要なライブラリ (MPI, LAPACK 等) の検索機能
39 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
オープンソース・ソフトウェア開発の流れ (例)
github にリポジトリを作成
開発
ソースコード
ビルドシステム
ドキュメント類
テスト
バージョン番号を割り当て
公開
配布物の作成 (tar.gz, インストーラー)
配布物のアップロード (sourceforge)
アナウンス
次期バージョンの開発へ
40 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
実習: github を用いたオープンソース・ソフトウェアの開
発・公開 (1)
github で新しいリポジトリを作成
https://github.com にログインし, 右上の “Create a new
repo” をクリック
リポジトリの URL は, ページ右下の “SSH clone URL” に表示
されている
github 上のリポジトリをローカルに複製
$ git clone git@github.com:foo/myproject.git # 例
ソースコードを作成
$ cd myproject
$ vi hello.f90 # F o r t r a n の 場 合
$ vi hello.cpp # C++ の 場 合
ソースコードの例: https://github.com/cmsi/
vcs-tutorial/tree/develop/opensource 41 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
実習: github を用いたオープンソース・ソフトウェアの開
発・公開 (2)
ソースコードをローカルリポジトリにコミット
リモートリポジトリにプッシュ
CMakeLists.txt の作成 (例: Fortran の場合)
cmake_minimum_required (VERSION 2.8 FATAL_ERROR)
project(hello NONE) # プ ロ ジ ェ ク ト 名
enable_language (Fortran) # 使 用 す る 言 語
# 作 成 す る バ イ ナ リ 名 と そ れ に 必 要 な ソ ー ス フ ァ イ ル 名
add_executable(hello hello.f90)
42 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
実習: github を用いたオープンソース・ソフトウェアの開
発・公開 (3)
CMakeLists.txt の作成 (例: C++の場合)
cmake_minimum_required (VERSION 2.8 FATAL_ERROR)
project(hello NONE) # プ ロ ジ ェ ク ト 名
enable_language (C++) # 使 用 す る 言 語
# 作 成 す る バ イ ナ リ 名 と そ れ に 必 要 な ソ ー ス フ ァ イ ル 名
add_executable(hello hello.cpp)
ソースファイルが複数ある場合は, それらを列挙すれば良い
CMakeLists.txt をローカルリポジトリにコミット, リモートリ
ポジトリにプッシュ
43 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
実習: github を用いたオープンソース・ソフトウェアの開
発・公開 (4)
ソースコード, CMakeLists.txt のテスト
$ mkdir myproject -build #
g i t で 管 理 し て い る デ ィ レ ク ト リ の 外 で テ ス ト
$ cd myproject -build
$ cmake $HOME/myproject #
g i t で 管 理 し て い る デ ィ レ ク ト リ を 指 定
$ make # h e l l o が ビ ル ド さ れ る
$ ./ hello
hello , world
さらにドキュメント, ライセンスファイルなどを追加
44 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
実習: github を用いたオープンソース・ソフトウェアの開
発・公開 (5)
リリース作業
必要なファイル, 修正を全てコミット
タグをつけ, リモートにプッシュ
$ git tag -a 1.0
$ git tag # タ グ の 確 認
$ git push origin 1.0
配布用アーカイブの作成 (tar.gz あるいは zip 形式)
$ git archive --format tar --prefix=myproject -1.0/
1.0 | gzip > myproject -1.0. tar.gz
$ git archive --format zip --prefix=myproject -1.0/
1.0 > myproject -1.0. zip
45 / 47
バージョン管理システムチュートリアル
github を用いたオープンソース・ソフトウェアの開発・公開
実習: github を用いたオープンソース・ソフトウェアの開
発・公開 (6)
アーカイブの中身を確認した上で, sourceforge にアップロード
github にはバイナリ配布機能はないので, sourceforge を利用
(cf. https://help.github.com/articles/
distributing-large-binaries)
http://sourceforge.net にログイン
“Create a Project” をクリックして, myproject 用のプロジェク
トを作成 (配布用に使うだけなので, Wiki, Git, Forums などは
不要)
Files セクションにフォルダを作成し, 配布用アーカイブをアッ
プロード
リリースノートの更新, アナウンス
MateriApps, github.io などを利用
46 / 47
バージョン管理システムチュートリアル
その他
その他の話題
MateriApps と MateriApps Live の紹介
A successful Git branching model (ブランチの上手な使い方)
http://keijinsonyaban.blogspot.jp/2010/10/
successful-git-branching-model.html
Git をボトムアップから理解する (git の中で何が起こっている
のかを知りたい人向け) http:
//keijinsonyaban.blogspot.jp/2011/05/git.html
47 / 47

More Related Content

バージョン管理システムチュートリアル