More Related Content Similar to Version Control System Tutorial バージョン管理システムチュートリアル
Similar to Version Control System Tutorial バージョン管理システムチュートリアル (20) More from Computational Materials Science Initiative
More from Computational Materials Science Initiative (20) Version Control System Tutorial バージョン管理システムチュートリアル3. バージョン管理システムチュートリアル
準備作業
ネットワーク設定・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
4. バージョン管理システムチュートリアル
準備作業
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
7. バージョン管理システムチュートリアル
バージョン管理システムとは?
バージョン管理システム (Version Control System) とは?
ファイルの履歴をデータベース (リポジトリ) で一括管理する
システム
▶ 全ての修正履歴 (差分) を保存
▶ 更新毎に一意なバージョン番号 (リビジョン) を付与
▶ 任意のバージョン間の比較が可能
▶ もともとはプログラムのソースコードのためのシステム
▶ それ以外のファイル (例えば TeX ファイル) 管理にも使える
チーム・分散環境での作業をサポート
▶ ネットワーク経由でファイルを check out/check in
▶ 複数箇所から同時に更新した場合に衝突を回避するしくみ
▶ ブランチ・マージ・タグの管理
▶ 一人で使っても複数人で使っても超便利
▶ 超優秀な (かつ超まじめな) 秘書のようなもの (しかもタダ)
7 / 46
10. バージョン管理システムチュートリアル
バージョン管理システムとは?
diff と patch
diff: 2 つのテキストファイルの差分を出力するコマンド
▶ ファイル全体を保存するよりコンパクト
▶ 変更点を確認しやすい
$ diff -u file1.txt file2.txt > file.diff
patch: diff コマンドが生成した差分をファイルに適用する
ユーティリティー
▶ もとのファイルと差分から変更後のファイルを生成できる
$ patch < file.diff
10 / 46
11. バージョン管理システムチュートリアル
バージョン管理システムとは?
実習: 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
12. バージョン管理システムチュートリアル
バージョン管理システムとは?
実習: 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
13. バージョン管理システムチュートリアル
バージョン管理システムとは?
主なバージョン管理システム
BitKeeper - かつて Linux のカーネルのソース管理に使われ
ていた
CVS (Concurrent Versions System) - ネットワークでの利用
を考慮とした初めてのバージョン管理システム. 以前はよく
使われていた
Git - 現在 Linux の開発に使われている. 分散型リポジトリ
Mercurial - Git のライバル. 分散型リポジトリ
SCCS (Source Code Control System) - 70 年代にベル研で開発
された世界初のバージョン管理システム. 現在は使われない
Subversion - CVS の改良版として開発された. 現在最もポ
ピュラー? Mac OS X や多くの Linux には最初からインス
トールされている
13 / 46
16. バージョン管理システムチュートリアル
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
17. バージョン管理システムチュートリアル
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
18. バージョン管理システムチュートリアル
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
19. バージョン管理システムチュートリアル
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
20. バージョン管理システムチュートリアル
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
21. バージョン管理システムチュートリアル
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
22. バージョン管理システムチュートリアル
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
24. バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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
26. バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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
28. バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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
29. バージョン管理システムチュートリアル
ブランチとマージ
実習: ブランチとマージ (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
31. バージョン管理システムチュートリアル
リモートリポジトリとの連携
実習: リモートリポジトリとの連携 (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
40. バージョン管理システムチュートリアル
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
41. バージョン管理システムチュートリアル
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
42. バージョン管理システムチュートリアル
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
43. バージョン管理システムチュートリアル
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
44. バージョン管理システムチュートリアル
GitHub を用いたオープンソース・ソフトウェアの開発・公開
実習: GitHub を用いたオープンソース・ソフトウェアの
開発・公開 (5)
リリース作業
▶ 必要なファイル, 修正を全てコミット
▶ タグをつけ, リモートにプッシュ
$ git tag -a 1.0
$ git tag # タ グ の 確 認
$ git push origin 1.0
GitHub では、タグをつけると「リリース」として一覧に現
れる
▶ 「releases」タブをクリックするとリリース一覧が表示される
▶ ソースコード (tar.gz 形式、zip 形式) へのリンクが自動的に作
成される
44 / 46
45. バージョン管理システムチュートリアル
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
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