萩野・服部研
GITHUBワークショップ
  入門編 Githubを始めよう

慶應義塾大学 政策・メディア研究科
      矢萩寛人
初めまして


• 矢萩寛人   (Githubではhiroto-y) です

• ソフト工学を研究しています

• 普段はW3Cで働いているHTML5な人です

• 私個人としてもHTML5にハマりました
どうしてGIT/GITHUBなの?
     TO/GA ProjectとGit
今回のねらい

• 多くの人にGithubを使ってもらおう


• 多くの人にソースを公開してもらおう


• TO/GAのノウハウを共有します


 • 前半:基本的なGit, Githubの使いかたを学ぶ


 • 後半:OSSでのGithubの使い方(TO/GAの例を元に)
そもそもGIT,GITHUBって何?
GITとは

• VCSの一種です


• リーナス・トーバルズが開発者


• 同じ分野ではDarcs, BitKeeper, Mercurial, SVK, Bazaar,

 Monotone

• 高速(特に大プロジェクト)、高機能
VCSとは


• ファイルの変更履歴を管理するためのシステム


• 対象はコード、ドキュメント、バイナリなど様々


• 修論・博論をTeXで書いてVCS管理する人も。。。
VCSでできること


• 過去の状態や変更内容を確認


• 変更前の状態を復元


• 複数人での編集を統合
過去の状態を保存

One             復元!      One
 One                     Two
 Two
   One
   Two
         One Uno
   Three
         Two Dos
         Three Tres   • 失敗しても大丈夫!
複数人での変更の例
                  Aさんの編集
          Uno
元ファイル     Two
One
Two
          One     Bさんの編集
          Two
          Three
複数人での変更の例
         ①Aさんが先に保存
         ②続いてBさんが保存

VCSを使わないと            VCSを使うと
           Aさんの編集が
 One                 Uno
 Two        上書き!
                     Two
 Three               Three
TIME MACHINEとの違い

          VCS     Time machine

 目的     複数人での共有    障害復旧

タイミング     任意         自動

コメント      付ける      付けない

差分の統合     出来る      できない
GITHUBとは

• Gitのホスティングサービス


• Gmail→メールサーバのホスティングサービス


• Dropbox→ファイルサーバのホスティングサービス


• 一箇所にデータが集まるから面白いことも
GITHUBでできること

• サーバ管理からの開放


• 世界中のコーダとのコミュニケーション


• レポジトリをウォッチ


• いろんなソースをフォーク
ネットワーキング
ウォッチとフォロー
CODERWALL
TO/GAのご紹介
開発環境セットアップ


                 ...
• めんどくさくありませんか


• ダウンロードとか


• セットアップとか
WEBで一瞬です
もちろんどのマシンでも
OSSプロジェクトです


       • 誰でも無料で使えま

       す

       • みんなで作っていき

       ます
メンバー募集中

• いろんな参加方法があります


• コーディング


• デザイン


• イベント運営


• コミュニティー活動
TO/GAとGITHUB

• 昨年10月の開発開始時はDropbox


 • コードを共同編集していなかったから


• コードが出来てきたら自前サーバでGitを用意


• 今年5月からGithubに移行
GITHUBに移行したわけ

• OSSで公開が正式に決まった


• 自前サーバの管理の手間


• 設備点検停電(+停電を伴う大規模工事が予定)


• マージの権限を開発者とメンテナに設定したかった。
GITの構造を知る
GITの内部構造

リポジトリ(広義)   リポジトリ(狭義)
 作業ツリー
               master
               branch1
               branch2
ステージング
  エリア             .
                  .
                  .
レポジトリ


• ソースを保管しているデータベースそのもの


• 銀行の貸し金庫+出納簿


• これがどこにあるのか?1つか複数か?がソフトに

よって異なる
作業ツリー


• 今、そこに見えるファイルです


• レポジトリの中から「ある一時点」のものを取り出し

たもの

• 取り出す作業をCheckoutと言います
ブランチ
A,B,Cを作成                 Aを削除
                         Dを作成

     branch
                                B,C,Dが作成済み
               master (trunk)
                          A,B,C,X,Yが作成済み
           branch


       Xを作成               Yを作成
ブランチ

                 リポジトリ(狭義)
branch
                    master
                    branch1
master (trunk)      branch2
    branch             .
                       .
                       .
GITの保管するもの

• それが無なくてもソフトは動くか?→Noなら保管する


• 保管しないもの


• キャッシュ、ログ、実行バイナリ


• IDEの管理フォルダ、エディタのキャッシュ(***~)
リモートレポジトリ
                                                             リポジトリ(狭義)
リポジトリ(広義)   リポジトリ(狭義)            リポジトリ(広義)       リポジトリ(狭義)

作業ツリー                            作業ツリー




ステージング
  エリア           .
                .
                .
                                 ステージング
                                   エリア               .
                                                     .
                                                     .
                                                                 .
                                                                 .
                                                                 .       .......



 Remote

    Local               リポジトリ(広義)     リポジトリ(狭義)

                        作業ツリー




                        ステージング
                          エリア                .
                                             .
                                             .
(参考)C/S型VCSの構造

               リポジトリ(狭義)

 作業ツリー                master
                      branch1
                      branch2
                         .
                         .
                         .

     Local   Remote
GITの操作を知る
ADD

リポジトリ(広義)   リポジトリ(狭義)
 作業ツリー
               master
               branch1
  ADD
               branch2
ステージング
  エリア             .
                  .
                  .
COMMIT

リポジトリ(広義)     リポジトリ(狭義)
 作業ツリー
                  master
                  branch1
                  branch2
ステージング
  エリア                .
                     .
         COMMIT      .
CHECKOUT

リポジトリ(広義)        リポジトリ(狭義)
 作業ツリー
                      master
 master    CHECKOUT
                      branch1
                      branch2
ステージング
  エリア                    .
                         .
                         .
PULL
                                                                    リポジトリ(狭義)
リポジトリ(広義)   リポジトリ(狭義)                   リポジトリ(広義)       リポジトリ(狭義)

作業ツリー                                   作業ツリー




ステージング
  エリア           .
                .
                .
                                        ステージング
                                          エリア               .
                                                            .
                                                            .
                                                                        .
                                                                        .
                                                                        .       .......


                        Pull
 Remote

    Local                      リポジトリ(広義)     リポジトリ(狭義)

                               作業ツリー




                               ステージング
                                 エリア                .
                                                    .
                                                    .
PUSH
                                                                    リポジトリ(狭義)
リポジトリ(広義)   リポジトリ(狭義)                   リポジトリ(広義)       リポジトリ(狭義)

作業ツリー                                   作業ツリー




ステージング
  エリア           .
                .
                .
                                        ステージング
                                          エリア               .
                                                            .
                                                            .
                                                                        .
                                                                        .
                                                                        .       .......


                        Push
 Remote

    Local                      リポジトリ(広義)     リポジトリ(狭義)

                               作業ツリー




                               ステージング
                                 エリア                .
                                                    .
                                                    .
CLONE
         リポジトリ(広義)   リポジトリ(狭義)

         作業ツリー




         ステージング
           エリア              .
                            .
                            .




                       Clone
Remote

 Local

                        .
                        .
                        .
マージ
                Aを削除
                Dを作成
A,B,Cを作成
                       X,Yは成功!
                       よって採用
    A,B,C,X,Yが作成済み


                 マージ

      Xを作成      Yを作成
マージ

• いずれ全てマージするの? →NO!


• マージしない例


• 失敗した時


• リリースブランチ
GITHUBを試す
アカウントの作成
• https://github.comにアクセス




                            クリック
アカウントの作成


 入力後、クリック
アカウントの作成




    入力後、クリック
の作成

•   自分のホームディレクトリ配下の./sshにいることを確認
    し、ssh-keygenコマンド。 

    % cd ~/.ssh #もしフォルダがなかったら作成してください
    .% ssh-keygen -t rsa -C "自分のメールアドレス" 




•   パスワードを求められるので、パスワードを決めて入力

•   id_rsa(秘密   ) と id_rsa.pub(公開   )が作成される
の登録
• githubのログインしたページを開き

右上のセッティングアイコンをクリック。
の登録
• 次に左のメニューの中から、「SSH   Keys」を選択。
の登録
• 「Add   SSH Key」をクリックしてTitleとKeyを入力。
 (キーはコピー&ペースト)
の登録
• パスワードを入力し、   登録完了
レポジトリの作成

   クリック
レポジトリの作成
         入力




チェック

       クリック
CLONEする

SSHをクリックしてから ここをコピー
CLONEする


•   端末上で実行
    %mkdir gitreps (←フォルダを作成)
    % cd gitreps (←フォルダに移動)
    %git clone https://github.com/xxxxxxx/xxxxxx.git

•   アドレスにはコピーしたアドレスをペースト
CLONEする

• Cloninginto ws20120606...
 The authenticity of host 'github.com (207.97.227.239)' can't
 be established.
 RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:
 56:4d:eb:df:a6:48.
 Are you sure you want to continue connecting (yes/no)? yes
 Warning: Permanently added 'github.com,
 207.97.227.239' (RSA) to the list of known hosts.
 Enter passphrase for key '/home/xxx/.ssh/id_rsa': のパス
 ワード
ユーザ情報を登録する



•   端末上で実行
    % git config --global user.name ユーザ名
    % git config --global user.email メールアドレス
ファイルを追加する


•   端末上で実行
    % cd xxxx(←レポジトリ名のフォルダに移動)
    % touch hello.txt (←空ファイルを作成)
    % echo “Hello” > hello.txt (←ファイルの中身を作成)

•   もちろんエディタを使ってもOKです。
今の状態

リポジトリ(広義)     リポジトリ(狭義)
  作業ツリー
                   master
hello.txt
                 branch1
                 branch2
 ステージング
   エリア              .
                    .
                    .
ADDする



•   端末上で実行
    % git add .
今の状態

リポジトリ(広義)     リポジトリ(狭義)
  作業ツリー
                   master
hello.txt
                 branch1
                 branch2
 ステージング
   エリア              .
                    .
                    .
hello.txt
コミットする

•   端末上で実行
    % git commit

•   エディタ画面になります

    •   Viの場合、iで入力モード,Esc→ZZで保存。

    •   emacs の場合、Ctrl+x→ Ctrl+s→ Ctrl+x→ Ctrl+cで保存

    •   nano の場合、Ctrl+x→ Y→ Enter で保存
PUSHする


•   端末上で実行
    % git push origin master

•   パスワードを聞かれたら                のパスワードを入力
PUSHする
リポジトリ(広義)   リポジトリ(狭義)

作業ツリー




ステージング
                         Github上のレポジトリ
  エリア           .
                .
                .




                        Push
 Remote

    Local                      リポジトリ(広義)   リポジトリ(狭義)

                               作業ツリー




                               ステージング
                                 エリア           .
                                               .
                                               .
PUSHする




ファイルが追加された
FORKする
FORKする



• 他のレポジトリをもとに自分のレポジトリを作ります


• 「クラウド型」のGithubの醍醐味!
FORKする
• https://github.com/2ga/2gaにアクセス




                       クリック
FORKする


TO/GAを元にあなたのレポジトリが
     できました!
FORKする

• Rails https://github.com/rails/rails


• jquery   https://github.com/jquery/jquery

• Symfony2    https://github.com/symfony/symfony

• その他いろいろ

 (面白いのがあれば教えて下さい!)
次はOSSでの利用方法をご紹
    介します
今回カバーできなかったこと

• pull

• 移動とコピー


• diff

• status

• 各コマンドの詳細
参考資料(1)

   • 入門git

   • Travis
      Swicegood/著
    でびあんぐる/監訳
   • Gitに関して網羅的に解説

   • 大変いい本です

   • Githubに関する記述は薄
    いです
参考資料(2)


   • TO/GA   Document center
   • http://doc.2ga.net
   • TO/GA開発コミュニ
    ティー資料

   • 実際の開発に使えるTips

TO/GA GITHUB workshop(1)