Your SlideShare is downloading. ×
バージョン管理システムチュートリアル
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

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

2,225
views

Published on

2013/08/22 CMSIハンズオン

2013/08/22 CMSIハンズオン

Published in: Technology

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,225
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
6
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. バージョン管理システムチュートリアル バージョン管理システムチュートリアル CMSI 神戸ハンズオン 2013-08-22 本教材の LATEX ソースは https://github.com/cmsi/vcs-tutorial にて公 開中 1 / 47
  • 2. バージョン管理システムチュートリアル Outline 1 チュートリアルの概要 2 準備作業 3 バージョン管理システムの概要 4 git の基礎 5 ブランチとマージ 6 リモートリポジトリとの連携 7 github を用いたオープンソース・ソフトウェアの開発・公開 8 その他 2 / 47
  • 3. バージョン管理システムチュートリアル チュートリアルの概要 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
  • 4. バージョン管理システムチュートリアル チュートリアルの概要 チュートリアルの流れ 準備作業 バージョン管理システムとは? (講義 & 実習) git の基礎 (講義 & 実習) ブランチとマージ (講義 & 実習) リモートリポジトリとの連携 (講義 & 実習) github を用いたオープンソース・ソフトウェアの開発・公開 (講義 & 実習) MateriApps と MateriApps Live の紹介 (optional) A successful Git branching model (講義) (optional) Git をボトムアップから理解する (講義) 4 / 47
  • 5. バージョン管理システムチュートリアル 準備作業 ネットワーク設定 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
  • 6. バージョン管理システムチュートリアル 準備作業 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
  • 7. バージョン管理システムチュートリアル バージョン管理システムの概要 diff と patch によるバージョン管理 diff: 2 つのテキストファイルの差分を出力するコマンド ファイル全体を保存するよりコンパクト 変更点を確認しやすい patch: diff コマンドが生成した差分をファイルに適用するユー ティリティー もとのファイルと差分から変更後のファイルを生成できる 7 / 47
  • 8. バージョン管理システムチュートリアル バージョン管理システムの概要 実習: 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
  • 9. バージョン管理システムチュートリアル バージョン管理システムの概要 実習: 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
  • 10. バージョン管理システムチュートリアル バージョン管理システムの概要 バージョン管理システムとは? ファイルの履歴をデータベース (リポジト リ) で一括管理するシステム もともとはプログラムのソースコードのた めのシステム それ以外のファイル (例えば LATEX ファ イル) 管理にも使える 一人で使っても複数人で使っても超便利 超優秀な秘書のようなもの 10 / 47
  • 11. バージョン管理システムチュートリアル バージョン管理システムの概要 なぜバージョン管理システムが必要なのか? 作業者 and/or 作業場所が複数になると, ファイル名や手書きのログファイルによる バージョン管理はすぐに破綻する ネットワーク経由でファイルを check out/check in 更新毎に一意なバージョン番号 (リビ ジョン) を付与 任意のバージョン間の比較が容易 バックアップの代わりにも 複数箇所から同時に更新した場合に衝突を 回避するしくみを備えている ブランチ・マージ・タグ付けなどが可能 11 / 47
  • 12. バージョン管理システムチュートリアル バージョン管理システムの概要 ありがちなパターン University of Tokyo 25/45 1) B 3) A 2) B 4) A 12 / 47
  • 13. バージョン管理システムチュートリアル バージョン管理システムの概要 バージョン管理している場合 University of Tokyo 26/45 1) 2) A 3) A 4)B 5) 6) C 7) ( ) 13 / 47
  • 14. バージョン管理システムチュートリアル バージョン管理システムの概要 主なバージョン管理システム BitKeeper - かつて Linux のカーネルのソース管理に使われて いた CVS (Concurrent Versions System) - ネットワークでの利用を 考慮とした初めてのバージョン管理システム. 以前はよく使わ れていた Git - 現在 Linux の開発に使われている. 分散型リポジトリ Mercurial - Git のライバル. 分散型リポジトリ SCCS (Source Code Control System) - 70 年代にベル研で開発 された世界初のバージョン管理システム. 現在は使われない Subversion - CVS の改良版として開発された. 現在最もポピュ ラー? Mac OS X や多くの Linux には最初からインストールさ れている 14 / 47
  • 15. バージョン管理システムチュートリアル バージョン管理システムの概要 バージョン管理システムの欠点 (面倒な点) 修正前に最新の状態にアップデートしなければならない ⇒ 慣れると習慣になります 全ての修正を「コミット」しなければならない ⇒ 慣れると習慣になります 衝突 (コンフリクト) が発生した時に対処しなければならない ⇒ 衝突に気づかずに修正してしまうほうが怖いです サーバのセットアップが面倒くさい ⇒ まずはホスティングサービス (github, sourceforge, bitbucket) を試してみましょう ⇒ まわりにいるプロ (?) に相談しましょう バージョン管理システムを使うと作業効率が倍以上になる ⇒ 使わないと人生を半分損する 15 / 47
  • 16. バージョン管理システムチュートリアル git の基礎 git の基礎 「いつやるの? git 入門」ページ 28–34, 55, 58–110 http://www.slideshare.net/matsukaz/git-17499005 16 / 47
  • 17. バージョン管理システムチュートリアル 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
  • 18. バージョン管理システムチュートリアル 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
  • 19. バージョン管理システムチュートリアル 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
  • 20. バージョン管理システムチュートリアル 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
  • 21. バージョン管理システムチュートリアル 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
  • 22. バージョン管理システムチュートリアル 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
  • 23. バージョン管理システムチュートリアル 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
  • 24. バージョン管理システムチュートリアル ブランチとマージ ブランチとマージ 「いつやるの? git 入門」ページ 112–152 http://www.slideshare.net/matsukaz/git-17499005 「こわくない Git」ページ 6–78 http://www.slideshare.net/kotas/git-15276118 24 / 47
  • 25. バージョン管理システムチュートリアル ブランチとマージ 実習: ブランチとマージ (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
  • 26. バージョン管理システムチュートリアル ブランチとマージ 実習: ブランチとマージ (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
  • 27. バージョン管理システムチュートリアル ブランチとマージ 実習: ブランチとマージ (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
  • 28. バージョン管理システムチュートリアル ブランチとマージ 実習: ブランチとマージ (4) コミットグラフ (の一部) を表示 $ git log --graph ... github (後述) を使っている場合には, ブラウザでコミットグラ フを見ることができる 28 / 47
  • 29. バージョン管理システムチュートリアル ブランチとマージ 実習: ブランチとマージ (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
  • 30. バージョン管理システムチュートリアル ブランチとマージ 実習: ブランチとマージ (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
  • 31. バージョン管理システムチュートリアル リモートリポジトリとの連携 リモートリポジトリとの連携 「いつやるの? git 入門」ページ 154–193 http://www.slideshare.net/matsukaz/git-17499005 31 / 47
  • 32. バージョン管理システムチュートリアル リモートリポジトリとの連携 実習: リモートリポジトリとの連携 (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
  • 33. バージョン管理システムチュートリアル リモートリポジトリとの連携 実習: リモートリポジトリとの連携 (2) 課題 1: 自分のページの作成 todo.html を自分の名前にコピーして編集 $ cd vcs -hands -on $ cp todo.html igarashi.html $ vi igarashi.html index.html を編集し, 自分のページヘのリンクを作成 ローカルリポジトリにコミット リモートリポジトリにプッシュ $ git push origin master 33 / 47
  • 34. バージョン管理システムチュートリアル リモートリポジトリとの連携 実習: リモートリポジトリとの連携 (3) 課題 2: 他の人のページから自分のページへのリンクの作成 リモートブランチ (origin/master) を最新版に更新し, master に マージ $ git fetch $ git merge origin/master 誰かのページを編集. 自分のページヘのリンクを作成 ローカルリポジトリにコミット リモートリポジトリにプッシュ 34 / 47
  • 35. バージョン管理システムチュートリアル リモートリポジトリとの連携 実習: リモートリポジトリとの連携 (4) プッシュが失敗した場合 誰かがすでにプッシュしている まずリモートリポジトリの内容をマージしてから再度プッシュ $ git fetch $ git merge origin/master $ git push origin master マージの際にコンフリクトした場合 ファイルを修正しコミットした後, プッシュ コミットグラフの確認 $ git log --graph あるいはブラウザで https://github.com/cmsi/vcs-hands-on/network にア クセス 35 / 47
  • 36. バージョン管理システムチュートリアル リモートリポジトリとの連携 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
  • 37. バージョン管理システムチュートリアル リモートリポジトリとの連携 バージョン管理システムを使う上での注意点 git が管理している領域からファイルを持ちだして編集しては いけない 大きなバイナリファイル (pdf, exe, doc, tar.gz, zip など) を git で管理しない 37 / 47
  • 38. バージョン管理システムチュートリアル github を用いたオープンソース・ソフトウェアの開発・公開 「公開ソフト」に必要なもの マニュアル チュートリアル ライセンス ビルドシステム and/or インストーラー ソースコード配布 Linux で一般的. ソースと一緒にビルド環境 (Makefile, CMake, configure スクリプト) を配布 バイナリ配布 Windows で一般的. バイナリインストーラー形式で配布 ユーザフレンドリな操作環境 (GUI など) ユーザサポート体制 38 / 47
  • 39. バージョン管理システムチュートリアル github を用いたオープンソース・ソフトウェアの開発・公開 ビルドシステム: CMake Makefile を生成するためのユーティリティー (configure スクリ プトに対応) Windows の Visual C++ 用ソリューションファイル, Mac OS X の Xcode 用プロジェクトファイルの生成も可能 設定は CMakeLists.txt に記述する テスト (CTest) やバイナリインストーラ作成 (CPack) の機能 もある ファイルの依存関係の自動検出 必要なライブラリ (MPI, LAPACK 等) の検索機能 39 / 47
  • 40. バージョン管理システムチュートリアル github を用いたオープンソース・ソフトウェアの開発・公開 オープンソース・ソフトウェア開発の流れ (例) github にリポジトリを作成 開発 ソースコード ビルドシステム ドキュメント類 テスト バージョン番号を割り当て 公開 配布物の作成 (tar.gz, インストーラー) 配布物のアップロード (sourceforge) アナウンス 次期バージョンの開発へ 40 / 47
  • 41. バージョン管理システムチュートリアル 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
  • 42. バージョン管理システムチュートリアル 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
  • 43. バージョン管理システムチュートリアル 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
  • 44. バージョン管理システムチュートリアル 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
  • 45. バージョン管理システムチュートリアル 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
  • 46. バージョン管理システムチュートリアル 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
  • 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