Version Control System Tutorial バージョン管理システムチュートリアル
-
Upload
computational-materials-science-initiative -
Category
Technology
-
view
210 -
download
1
description
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