Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
バージョン管理システムチュートリアル
バージョン管理システムチュートリアル
CMSI ハンズオン
2015-09-07
ソースコード: https://github.com/cmsi/vcs-tutorial
資料作成: https://github.com/cmsi/vcs-tutorial/graphs/contributors
1 / 46
バージョン管理システムチュートリアル
Outline
1 準備作業
2 バージョン管理システムとは?
3 git の基礎
4 ブランチとマージ
5 リモートリポジトリとの連携
6 GitHub を用いたオープンソース・ソフトウェアの開発・公開
7 その他
2 / 46
バージョン管理システムチュートリアル
準備作業
ネットワーク設定・MateriApps LIVE! 設定
LAN 接続 (無線 or 有線)
GitHub アカウント登録 (まだアカウントを持っていない人
のみ)
▶ https://github.com にアクセス
▶ “Sign up for GitHub” をクリック, 必要事項を記入した後,
“Create an account”
▶ (オプション) SSH 公開鍵の登録 (“Account settings” ⇒ “SSH
Keys”)
MateriApps LIVE! の設定
▶ 「MateriApps LIVE! の設定」に従い、VirtualBox、
MateriApps LIVE! をインストール・設定
3 / 46
バージョン管理システムチュートリアル
準備作業
Windows や Mac 上で直接 git を使いたい場合
Windows & Mac OS X
▶ http://git-scm.com/downloads からインストーラーをダ
ウンロード
▶ https://www.sourcetreeapp.com/ から SourceTree をイン
ストール
▶ Mac の場合は MacPorts からインストールすることも可
$ sudo port install git
Linux
▶ Redhat 系
$ sudo yum install git
▶ Debian 系
$ sudo apt -get install git
4 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
バージョン管理システムの必要性
広く行われている「ファイル管理」
▶ ファイル名・ディレクトリ名による管理
(日付、人名、バージョン番号など)
▶ 手書きのログファイルによる記録
問題点
▶ 記録を付け忘れる、記録を間違う、不完全な記録
▶ 人により命名規則がばらばら
▶ コンピュータ間でコピーを繰り返すと、どれを修正したか、
どれが新しいか分からなくなる
▶ 同じバージョンを元に、別の人が独立に修正を行ってしまう
(バージョンの分岐)
5 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
ありがちなパターン
University of Tokyo
25/45
1)
B
3)
A
2)
B
4)
A
6 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
バージョン管理システム (Version Control System) とは?
ファイルの履歴をデータベース (リポジトリ) で一括管理する
システム
▶ 全ての修正履歴 (差分) を保存
▶ 更新毎に一意なバージョン番号 (リビジョン) を付与
▶ 任意のバージョン間の比較が可能
▶ もともとはプログラムのソースコードのためのシステム
▶ それ以外のファイル (例えば TeX ファイル) 管理にも使える
チーム・分散環境での作業をサポート
▶ ネットワーク経由でファイルを check out/check in
▶ 複数箇所から同時に更新した場合に衝突を回避するしくみ
▶ ブランチ・マージ・タグの管理
▶ 一人で使っても複数人で使っても超便利
▶ 超優秀な (かつ超まじめな) 秘書のようなもの (しかもタダ)
7 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
バージョン・ブランチ・マージ
8 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
バージョン管理システムを使うと
University of Tokyo
26/45
1) 2)
A
3)
A 4)B
5)
6)
C
7) ( )
9 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
diff と patch
diff: 2 つのテキストファイルの差分を出力するコマンド
▶ ファイル全体を保存するよりコンパクト
▶ 変更点を確認しやすい
$ diff -u file1.txt file2.txt > file.diff
patch: diff コマンドが生成した差分をファイルに適用する
ユーティリティー
▶ もとのファイルと差分から変更後のファイルを生成できる
$ patch < file.diff
10 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
実習: diff & patch (1)
単一ファイルの例
$ cp /somewhere/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 /somewhere/diff/prologue.txt prologue.txt
$ patch < prologue.diff
$ less prologue.txt # prologue. t x t の 中 身 を 確 認
11 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
実習: diff & patch (2)
ディレクトリ全体を扱う例
$ cp -r /somewhere/shake 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 /somewhere/shake shake
$ patch -p0 < shake.diff
# s h a k e の 中 身 を 確 認
diff と patch で差分の管理は可能になるが, 履歴は別に管理
しておかなければならない
12 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
主なバージョン管理システム
BitKeeper - かつて Linux のカーネルのソース管理に使われ
ていた
CVS (Concurrent Versions System) - ネットワークでの利用
を考慮とした初めてのバージョン管理システム. 以前はよく
使われていた
Git - 現在 Linux の開発に使われている. 分散型リポジトリ
Mercurial - Git のライバル. 分散型リポジトリ
SCCS (Source Code Control System) - 70 年代にベル研で開発
された世界初のバージョン管理システム. 現在は使われない
Subversion - CVS の改良版として開発された. 現在最もポ
ピュラー? Mac OS X や多くの Linux には最初からインス
トールされている
13 / 46
バージョン管理システムチュートリアル
バージョン管理システムとは?
バージョン管理システムの欠点 (面倒な点)
修正前に最新の状態にアップデートしなければならない
⇒ 慣れると習慣になります
全ての修正を「コミット」しなければならない
⇒ 慣れると習慣になります
衝突 (コンフリクト) が発生した時に対処しなければならない
⇒ 衝突に気づかずに修正してしまうほうが怖いです
サーバのセットアップが面倒くさい
⇒ まずはホスティングサービス (GitHub, sourceforge,
bitbucket) を試してみましょう
⇒ まわりにいるプロ (?) に相談しましょう
バージョン管理システムを使うと作業効率が倍以上になる
⇒ 使わないと人生を半分損する
14 / 46
バージョン管理システムチュートリアル
git の基礎
git の基礎
「いつやるの? git 入門」
http://www.slideshare.net/matsukaz/git-28304397
▶ Git の全体図: ページ 33–41
▶ Git の内部構造: ページ 61–115
15 / 46
バージョン管理システムチュートリアル
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 を消さな
いように!
16 / 46
バージョン管理システムチュートリアル
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
#
17 / 46
バージョン管理システムチュートリアル
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(の最初の何文字か)
18 / 46
バージョン管理システムチュートリアル
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.
19 / 46
バージョン管理システムチュートリアル
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")
20 / 46
バージョン管理システムチュートリアル
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.
...
21 / 46
バージョン管理システムチュートリアル
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’
ファイルの削除, 移動, コミット間の差分
22 / 46
バージョン管理システムチュートリアル
ブランチとマージ
ブランチとマージ
「いつやるの? git 入門」
http://www.slideshare.net/matsukaz/git-28304397
▶ ブランチとは: ページ 119–136
▶ ブランチを操作してみよう: ページ 144–157
ブランチを統合するには「マージ (merge)」と「リベース
(rebase)」の 2 つの方法がある
▶ merge のみで十分. また, rebase は使い方を誤ると危険なので
本実習では触れない
▶ 参考:「こわくない Git」
http://www.slideshare.net/kotas/git-15276118
23 / 46
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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
24 / 46
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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
25 / 46
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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
26 / 46
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (4)
コミットグラフ (の一部) を表示
$ git log --graph
...
GitHub (後述) を使っている場合には, ブラウザでコミットグ
ラフを見ることができる
27 / 46
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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.
28 / 46
バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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 ’
29 / 46
バージョン管理システムチュートリアル
リモートリポジトリとの連携
リモートリポジトリとの連携
「いつやるの? git 入門」ページ 161–208
http://www.slideshare.net/matsukaz/git-28304397
30 / 46
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (1)
実習で用いる GitHub 上のリモートリポジトリ
git@github.com:cmsi/vcs-hands-on.git
ブラウザでのアクセス
https://github.com/cmsi/vcs-hands-on
リモートリポジトリをローカルに複製
$ git clone git@github.com:cmsitest/vcs -practice.
git
Cloning into ’vcs -practice ’...
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.
31 / 46
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (2)
課題 1: 自分のページの作成
▶ todo.html を自分の名前にコピーして編集
$ cd vcs -hands -on
$ cp todo.html igarashi.html
$ vi igarashi.html
▶ index.html を編集し, 自分のページヘのリンクを作成
▶ ローカルリポジトリにコミット
▶ リモートリポジトリにプッシュ
$ git push origin master
32 / 46
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (3)
課題 2: 他の人のページから自分のページへのリンクの作成
▶ リモートブランチ (origin/master) を最新版に更新し, master
にマージ
$ git fetch
$ git merge origin/master
▶ 誰かのページを編集. 自分のページヘのリンクを作成
▶ ローカルリポジトリにコミット
▶ リモートリポジトリにプッシュ
33 / 46
バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (4)
プッシュが失敗した場合
▶ 誰かがすでにプッシュしている
▶ まずリモートリポジトリの内容をマージしてから再度プッ
シュ
$ git fetch
$ git merge origin/master
$ git push origin master
マージの際にコンフリクトした場合
▶ ファイルを修正しコミットした後, プッシュ
コミットグラフの確認
$ git log --graph
あるいはブラウザで
https://github.com/cmsitest/vcs-practice/network
にアクセス
34 / 46
バージョン管理システムチュートリアル
リモートリポジトリとの連携
git ワークフローのまとめ
remote
repository
local
repository
indexwork space
add
commit
push
checkout <file>
fetch
merge/rebase
checkout <commit>
FETCH_HEAD
Basic git working flow
35 / 46
バージョン管理システムチュートリアル
リモートリポジトリとの連携
バージョン管理システムを使う上での注意点
git が管理している領域からファイルを持ちだして編集して
はいけない
大きなバイナリファイル (pdf, exe, doc, tar.gz, zip など) を
git で管理しない
36 / 46
バージョン管理システムチュートリアル
GitHub を用いたオープンソース・ソフトウェアの開発・公開
「公開ソフト」に必要なもの
マニュアル
チュートリアル
ライセンス
ビルドシステム and/or インストーラー
▶ ソースコード配布
Linux で一般的. ソースと一緒にビルド環境 (Makefile,
CMake, configure スクリプト) を配布
▶ バイナリ配布
Windows で一般的. バイナリインストーラー形式で配布
ユーザフレンドリな操作環境 (GUI など)
ユーザサポート体制
37 / 46
バージョン管理システムチュートリアル
GitHub を用いたオープンソース・ソフトウェアの開発・公開
ビルドシステム: CMake
Makefile を生成するためのユーティリティー (configure スク
リプトに対応)
▶ Windows の Visual C++ 用ソリューションファイル, Mac OS
X の Xcode 用プロジェクトファイルの生成も可能
設定は CMakeLists.txt に記述する
テスト (CTest) やバイナリインストーラ作成 (CPack) の機能
もある
ファイルの依存関係の自動検出
必要なライブラリ (MPI, LAPACK 等) の検索機能
38 / 46
バージョン管理システムチュートリアル
GitHub を用いたオープンソース・ソフトウェアの開発・公開
オープンソース・ソフトウェア開発の流れ (例)
GitHub にリポジトリを作成
開発
▶ ソースコード
▶ ビルドシステム
▶ ドキュメント類
▶ テスト
バージョン番号を割り当て
公開
▶ 配布物の作成 (tar.gz, インストーラー)
▶ 配布物のアップロード
▶ アナウンス
次期バージョンの開発へ
39 / 46
バージョン管理システムチュートリアル
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 # Fortranの 場 合
$ vi hello.cpp # C++ の 場 合
ソースコードの例: https://github.com/cmsi/
vcs-tutorial/tree/develop/opensource
40 / 46
バージョン管理システムチュートリアル
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)
41 / 46
バージョン管理システムチュートリアル
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 をローカルリポジトリにコミット, リモート
リポジトリにプッシュ
42 / 46
バージョン管理システムチュートリアル
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
さらにドキュメント, ライセンスファイルなどを追加
43 / 46
バージョン管理システムチュートリアル
GitHub を用いたオープンソース・ソフトウェアの開発・公開
実習: GitHub を用いたオープンソース・ソフトウェアの
開発・公開 (5)
リリース作業
▶ 必要なファイル, 修正を全てコミット
▶ タグをつけ, リモートにプッシュ
$ git tag -a 1.0
$ git tag # タ グ の 確 認
$ git push origin 1.0
GitHub では、タグをつけると「リリース」として一覧に現
れる
▶ 「releases」タブをクリックするとリリース一覧が表示される
▶ ソースコード (tar.gz 形式、zip 形式) へのリンクが自動的に作
成される
44 / 46
バージョン管理システムチュートリアル
GitHub を用いたオープンソース・ソフトウェアの開発・公開
実習: GitHub を用いたオープンソース・ソフトウェアの
開発・公開 (6)
配布物にソースコード以外 (バイナリ、マニュアル PDF な
ど) を含めたい場合
▶ いったんアーカイブを作成
$ 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
▶ 必要なファイルを追加したのち、「リリース」の編集ページで
ファイルを追加する
リリースノートの更新, アナウンス
▶ MateriApps, github.io, twitter などを活用
45 / 46
バージョン管理システムチュートリアル
その他
その他の話題
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
46 / 46

More Related Content

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