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

47
バージョン管理システムチュートリアル バージョン管理システムチュートリアル CMSI 神戸ハンズオン 2013-08-22 本教材の L A T E X ソースは https://github.com/cmsi/vcs-tutorial にて公 開中 1 / 47

description

CMSI神戸ハンズオン(2013-08-22)資料

Transcript of Version Control System Tutorial バージョン管理システムチュートリアル

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

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

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チュートリアル スタッフ

講師藤堂眞治 (東大物性研) [email protected]五十嵐 亮 (東大物性研) [email protected]松尾春彦 (RIST) [email protected]本山裕一 (東大院工) [email protected]

主催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 作業場所が複数になると,ファイル名や手書きのログファイルによるバージョン管理はすぐに破綻する

ネットワーク経由でファイルを checkout/check in更新毎に一意なバージョン番号 (リビジョン) を付与任意のバージョン間の比較が容易バックアップの代わりにも

複数箇所から同時に更新した場合に衝突を回避するしくみを備えている

ブランチ・マージ・タグ付けなどが可能

11 / 47

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

バージョン管理システムの概要

ありがちなパターン

University of Tokyo

25/45�

ȉȽț�

1)ƘĖnjǔȉȽțǹȏȢȉȺǦ�

ȉȽț�

ȸȽȃȶ� ȏȢȉȺ�

ƾǴDŽǖǞȢȓȽȺ

ȉȽțB�

3)ȏȢȉȺǛ�ŕ�ƹAǡ*ïǹǎǵ�ȉȽțA�

2)MǃǞǃǗǔǡǛŔKnjǚ*ïǎǵ�

ȉȽțB�

4)*ïnjǔȉȽțǹȏȢȉȺǦ�

ƾǗƹȉȽțAǹ�ÔDžnjǖǯǗǔȾ�

12 / 47

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

バージョン管理システムの概要

バージョン管理している場合

University of Tokyo

26/45�ȡȽȎȳȺijċnjǚƿǵv`

ȸȽȃȶ� ȏȢȉȺ�ȵȪȎȚȵ�

ȉȽț�

1)ƘĖnjǔȉȽțǹ ȵȪȎȚȵǦ�

ȉȽț� ȉȽț�

2)ȵȪȎȚȵǃdzȏȢȉȺǦȕȀȖȆǼǿȚ�

ȉȽțA�

3)MǃǞǃǗǔǡǛŔKnjǚ*ïǎǵ�

ȉȽțA� 4)*ïǹȉȬȖȚ�ȉȽțB�

5)ȏȢȉȺǡ*ïǹ§ǶǚAǡ*ï�

ŗĬ�

6)*ïǹȉȬȖȚnjDzǀǜnjǚƹŗĬǟôǙdž�

ȉȽțC�

7)ȏȢȉȺcLjǡ*ïǜÊnjƿ*ïǹŀ` (ȫȽȎ)�

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–110http://www.slideshare.net/matsukaz/git-17499005

16 / 47

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

gitの基礎

実習: gitの基礎 (1)

ユーザ名などの設定 (ログなどに使用される)

$ git config --global user.name ’XXXX YYYY ’

$ git config --global user.email [email protected]

作業用ディレクトリと 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 <[email protected]>

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–152http://www.slideshare.net/matsukaz/git-17499005

「こわくない Git」ページ 6–78http://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–193http://www.slideshare.net/matsukaz/git-17499005

31 / 47

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

リモートリポジトリとの連携

実習: リモートリポジトリとの連携 (1)

実習で用いる github上のリモートリポジトリ[email protected]:cmsi/vcs-hands-on.git

ブラウザでのアクセスhttps://github.com/cmsi/vcs-hands-on

リモートリポジトリをローカルに複製

$ git clone [email protected]: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 repositoryindexwork space

add

commit

push

checkout <file>

fetchmerge/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 OSX の 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 newrepo”をクリックリポジトリの URLは, ページ右下の “SSH clone URL”に表示されている

github上のリポジトリをローカルに複製

$ git clone [email protected]: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