Gitを学ぼう!
アジェンダ 
• Git ってなーに? 
• Git 用語説明 
• 実践Git コマンド
Gitってなーに?
Gitとは 
• バージョン管理システム 
o ファイルとその変更履歴などを管理する 
• ソフトウェアのソースコード 
• データベース定義 
• 環境構築用設定ファイルなどなど 
• 他のバージョン管理システムと違う点 
o 分散型バージョン管理 
o CVS, SVNは集中型バージョン管理システム
集中型バージョン管理 
• SVN, CVS
分散型バージョン管理 
• Git, Mercurial, Bazaar
結局何が違うんすか 
集中型分散型 
• 一本の履歴ツリーで複数 
の更新を一括管理 
→ぱっと見で分かり易い 
• 小規模開発・単発開発 
に向いている? 
o リリースバージョン管理が面倒 
• 全作業がネット接続必須 
• 履歴ツリーを分ける事で 
複数の更新を平行管理 
→ 使いこなすと便利 
• 大規模開発・継続開発 
に向いている? 
o リリースバージョンなどの管理に 
優れている 
• ネットに接続せず作業可
Git 用語説明
Gitの用語説明 
• リポジトリ 
o データを保存する場所 
リモートリポジトリ・ローカルリポジトリ 
• コミット 
o ローカルリポジトリに変更を保存 
• クローン 
o リモートリポジトリのファイルを複製 
• プル 
o 他のリポジトリの更新情報をローカルリポジトリに適用 
• プッシュ 
o ローカルリポジトリからリモートリポジトリに変更を適用 
• ブランチ・マージ→ 後述
ブランチ 
• ファイルの保存履歴を枝分かれ 
→他の環境に影響なくファイル保存履歴を追加 
• 開発用ブランチ、本番リリース用ブランチ・・・ 
• 修正を加えたブランチを束ねる事も可能 
→ マージ
ブランチ実例 
• 「master」ブランチ 
o 本番リリース用 
• 「beta」ブランチ 
o ベータテスト用(社内検証用) 
• 「develop」ブランチ 
o 開発用 
• 「package-master」ブランチ 
o パッケージ販売用 
http://www.atmarkit.co.jp/ait/articles/1305/20/news015_3.html
マージ 
• 複数の改修内容を一つのブランチに適用 
o 開発用ブランチの機能をリリースブランチに 
o ベータテスト用ブランチを開発用ブランチに 
o 使い方いろいろ 
• Gitはこの動作がとにかく速い! 
→ ソースの衝突に強く、大規模開発向き 
• ブランチ、マージこそが分散型バージョン管理の強み
他にGitの強みって? 
• 他サービスとの連携 
o プッシュ時にフックという機能でスクリプト実行が可能 
→ Jenkinsで自動ビルド、自動テスト 
• GitHub 
o Gitのリポジトリをホスティングするサービス 
o プルリクエストのメッセージのやり取り
GitHub 
GitHub=gitのリポジトリホスティングサービス 
←つまりこれ
よくある間違い? 
• フォーク・プルリクエスト 
o Gitの機能じゃなくてGitHubの機能 
• Gitはアカウント登録じゃなく、ユーザー情報の設定 
$ git config --global user.name ”oyamatsu" 
$ git config --global user.email oyamatsu@hoge.com 
• GitHubはWebサービスなのでアカウント登録
実践Git コマンド
まずはGitHub登録 
• https://github.com/
リポジトリの作成 
• 右上の「+」アイコンからNew repository
リポジトリの作成 
← 今回の勉強用にREADMEを作成 
Create repositoryで作成完了
ローカルにクローン 
クリックしてURLをコピー 
• git clone 
https://github.com/~UserName~/~RepositoryName~.git 
o 青字はコピペ部分
READMEを書き換えよう 
• cloneに成功したらRepositoryName ディレクトリが追 
加されているのでREADME.md を書き換え 
• サーバに上げるためには 
$ git add README.md 
# コミット対象ファイルを追加 
$ git commit README.md -m “updateREADME” 
# ローカルリポジトリ内でコミット 
# まだリモートリポジトリは書き換わらない 
$ git push 
# リモートリポジトリに反映 
o → GitHub上の表示が変わる!
上がらないパターン 
• 複数人で同じファイルを編集すると 
先の方法だけではリモートリポジトリに上がらない 
• 他の人の修正を取得 
$ git pull 
o 自動で複数の修正が反映されるパターン 
→ 自動マージパターンと呼称 
o 修正箇所が被って失敗するパターン 
→ コンフリクトパターンと呼称
自動マージパターン 
• $ git pull で修正が取得出来ている 
pull の中身は、 
o $ git fetch 
#リモートリポジトリの最新情報を取得 
o $ git merge origin/master 
# fetchした情報とローカルリポジトリの情報をあわせる 
なので、1コマンドでマージまで可能 
• $ git push を叩けばリモートリポジトリに上がる
コンフリクトパターン 
• Aさんの修正 
# Hello, my Git world! 
• Bさんの修正 
# Hello, our Git world! 
• pull をかけると衝突した修正箇所が 
README.mdに追加されている 
<<<<<<< HEAD 
# Hello, our Git world! 
======= 
# Hello, my Git world! 
>>>>>>> 4fdceeb66529b3fbfda… 
自分の修正 
他の人の修正 
←コミットID
コンフリクトパターン 
• 正しい形に修正 
o 赤いところは消してOK 
• 消してプッシュ作業 
o git commit –a 
# -aオプションを指定すると、編集したファイル全てをコミット対象とする 
o git pull 
# 念のためpull 
o git push → 
<<<<<<< HEAD 
# Hello, our Git world! 
======= 
# Hello, my Git world! 
>>>>>>> 4fdceeb66529b3fbfda…
ブランチ作成 
• 開発用ブランチとして「develop」ブランチを作成 
$ git branch develop 
# 「develop」ブランチを作成 
$ git branch # ブランチ情報を確認すると 
develop # ある! 
* master # 「*」が付いているのは今いるブランチ
developにファイルを追加 
$ git checkout develop # ブランチを切り替え 
Switched to branch 'develop’ 
# ファイルを追加してプッシュ 
$ vi new_README.md 
$ git add new_README.md 
$ git commit –m “add new_README” 
$ git push 
• pushしても「develop」ブランチしか変更されない
一方その頃masterは 
• 「develop」ブランチ 
$ git checkout develop 
Switched to branch 'develop’ 
$ ls 
README.md new_README.md 
• 「master」ブランチ 
$ git checkout master 
Switched to branch 'master’ 
$ ls 
README.md 
• 「develop」の変更は「master」には影響無し
ブランチをマージ 
• 現在のブランチに指定のブランチをマージする 
$ git merge develop # 「master」ブランチから 
$ ls 
README.md new_README.md #きた! 
$ git push 
きた!
その他コマンド 
• リポジトリの作成およびメンテナンスに利用するコマンド 
o git init リポジトリを作成する 
o git clone 既存のリポジトリの複製を作る 
o git fsck リポジトリの正当性チェックを行う 
o git gc リポジトリ内の不要なオブジェクトを削除し、最適化を行う 
• 作業ツリーやブランチを操作・管理するコマンド 
o git status 変更が加えられたファイルを表示する 
o git diff ファイルに加えられた変更点をdiff形式で表示する 
o git add コミットするファイルを指定する 
o git commit 変更点をコミットする 
o git log コミットログを閲覧する 
o git reset 直前のコミットを取り消す 
o git revert 作業ツリーを指定したコミット時点の状態にまで戻す 
o git branch ブランチ情報の表示およびブランチの作成 
o git checkout ブランチの切り替え 
o git show-branch ブランチの作成/変更/マージ履歴を表示 
o git merge ローカルブランチのマージを行う 
o git tag コミットにタグを付ける 
o git stash 現在の作業ツリーの状態を一時的に保管する 
o git rebase ブランチの派生元(上流)を変更する 
• ほかのリポジトリとの連携を行うコマンド 
o git pull ほかのリポジトリの変更点をローカルリポジトリにマージする 
o git push 公開リポジトリに自分のリポジトリの内容を送信する 
http://sourceforge.jp/magazine/09/03/16/0831212
まとめ 
• コマンドがいっぱいあって何でも出来る(らしい) 
• 便利なGitを使いこなすとカッコいい(重要) 
• という事でレッツGit!!

Git勉強会

  • 1.
  • 2.
    アジェンダ • Gitってなーに? • Git 用語説明 • 実践Git コマンド
  • 3.
  • 4.
    Gitとは • バージョン管理システム o ファイルとその変更履歴などを管理する • ソフトウェアのソースコード • データベース定義 • 環境構築用設定ファイルなどなど • 他のバージョン管理システムと違う点 o 分散型バージョン管理 o CVS, SVNは集中型バージョン管理システム
  • 5.
  • 6.
  • 7.
    結局何が違うんすか 集中型分散型 •一本の履歴ツリーで複数 の更新を一括管理 →ぱっと見で分かり易い • 小規模開発・単発開発 に向いている? o リリースバージョン管理が面倒 • 全作業がネット接続必須 • 履歴ツリーを分ける事で 複数の更新を平行管理 → 使いこなすと便利 • 大規模開発・継続開発 に向いている? o リリースバージョンなどの管理に 優れている • ネットに接続せず作業可
  • 8.
  • 9.
    Gitの用語説明 • リポジトリ o データを保存する場所 リモートリポジトリ・ローカルリポジトリ • コミット o ローカルリポジトリに変更を保存 • クローン o リモートリポジトリのファイルを複製 • プル o 他のリポジトリの更新情報をローカルリポジトリに適用 • プッシュ o ローカルリポジトリからリモートリポジトリに変更を適用 • ブランチ・マージ→ 後述
  • 10.
    ブランチ • ファイルの保存履歴を枝分かれ →他の環境に影響なくファイル保存履歴を追加 • 開発用ブランチ、本番リリース用ブランチ・・・ • 修正を加えたブランチを束ねる事も可能 → マージ
  • 11.
    ブランチ実例 • 「master」ブランチ o 本番リリース用 • 「beta」ブランチ o ベータテスト用(社内検証用) • 「develop」ブランチ o 開発用 • 「package-master」ブランチ o パッケージ販売用 http://www.atmarkit.co.jp/ait/articles/1305/20/news015_3.html
  • 12.
    マージ • 複数の改修内容を一つのブランチに適用 o 開発用ブランチの機能をリリースブランチに o ベータテスト用ブランチを開発用ブランチに o 使い方いろいろ • Gitはこの動作がとにかく速い! → ソースの衝突に強く、大規模開発向き • ブランチ、マージこそが分散型バージョン管理の強み
  • 13.
    他にGitの強みって? • 他サービスとの連携 o プッシュ時にフックという機能でスクリプト実行が可能 → Jenkinsで自動ビルド、自動テスト • GitHub o Gitのリポジトリをホスティングするサービス o プルリクエストのメッセージのやり取り
  • 14.
  • 15.
    よくある間違い? • フォーク・プルリクエスト o Gitの機能じゃなくてGitHubの機能 • Gitはアカウント登録じゃなく、ユーザー情報の設定 $ git config --global user.name ”oyamatsu" $ git config --global user.email oyamatsu@hoge.com • GitHubはWebサービスなのでアカウント登録
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
    ローカルにクローン クリックしてURLをコピー •git clone https://github.com/~UserName~/~RepositoryName~.git o 青字はコピペ部分
  • 21.
    READMEを書き換えよう • cloneに成功したらRepositoryNameディレクトリが追 加されているのでREADME.md を書き換え • サーバに上げるためには $ git add README.md # コミット対象ファイルを追加 $ git commit README.md -m “updateREADME” # ローカルリポジトリ内でコミット # まだリモートリポジトリは書き換わらない $ git push # リモートリポジトリに反映 o → GitHub上の表示が変わる!
  • 22.
    上がらないパターン • 複数人で同じファイルを編集すると 先の方法だけではリモートリポジトリに上がらない • 他の人の修正を取得 $ git pull o 自動で複数の修正が反映されるパターン → 自動マージパターンと呼称 o 修正箇所が被って失敗するパターン → コンフリクトパターンと呼称
  • 23.
    自動マージパターン • $git pull で修正が取得出来ている pull の中身は、 o $ git fetch #リモートリポジトリの最新情報を取得 o $ git merge origin/master # fetchした情報とローカルリポジトリの情報をあわせる なので、1コマンドでマージまで可能 • $ git push を叩けばリモートリポジトリに上がる
  • 24.
    コンフリクトパターン • Aさんの修正 # Hello, my Git world! • Bさんの修正 # Hello, our Git world! • pull をかけると衝突した修正箇所が README.mdに追加されている <<<<<<< HEAD # Hello, our Git world! ======= # Hello, my Git world! >>>>>>> 4fdceeb66529b3fbfda… 自分の修正 他の人の修正 ←コミットID
  • 25.
    コンフリクトパターン • 正しい形に修正 o 赤いところは消してOK • 消してプッシュ作業 o git commit –a # -aオプションを指定すると、編集したファイル全てをコミット対象とする o git pull # 念のためpull o git push → <<<<<<< HEAD # Hello, our Git world! ======= # Hello, my Git world! >>>>>>> 4fdceeb66529b3fbfda…
  • 26.
    ブランチ作成 • 開発用ブランチとして「develop」ブランチを作成 $ git branch develop # 「develop」ブランチを作成 $ git branch # ブランチ情報を確認すると develop # ある! * master # 「*」が付いているのは今いるブランチ
  • 27.
    developにファイルを追加 $ gitcheckout develop # ブランチを切り替え Switched to branch 'develop’ # ファイルを追加してプッシュ $ vi new_README.md $ git add new_README.md $ git commit –m “add new_README” $ git push • pushしても「develop」ブランチしか変更されない
  • 28.
    一方その頃masterは • 「develop」ブランチ $ git checkout develop Switched to branch 'develop’ $ ls README.md new_README.md • 「master」ブランチ $ git checkout master Switched to branch 'master’ $ ls README.md • 「develop」の変更は「master」には影響無し
  • 29.
    ブランチをマージ • 現在のブランチに指定のブランチをマージする $ git merge develop # 「master」ブランチから $ ls README.md new_README.md #きた! $ git push きた!
  • 30.
    その他コマンド • リポジトリの作成およびメンテナンスに利用するコマンド o git init リポジトリを作成する o git clone 既存のリポジトリの複製を作る o git fsck リポジトリの正当性チェックを行う o git gc リポジトリ内の不要なオブジェクトを削除し、最適化を行う • 作業ツリーやブランチを操作・管理するコマンド o git status 変更が加えられたファイルを表示する o git diff ファイルに加えられた変更点をdiff形式で表示する o git add コミットするファイルを指定する o git commit 変更点をコミットする o git log コミットログを閲覧する o git reset 直前のコミットを取り消す o git revert 作業ツリーを指定したコミット時点の状態にまで戻す o git branch ブランチ情報の表示およびブランチの作成 o git checkout ブランチの切り替え o git show-branch ブランチの作成/変更/マージ履歴を表示 o git merge ローカルブランチのマージを行う o git tag コミットにタグを付ける o git stash 現在の作業ツリーの状態を一時的に保管する o git rebase ブランチの派生元(上流)を変更する • ほかのリポジトリとの連携を行うコマンド o git pull ほかのリポジトリの変更点をローカルリポジトリにマージする o git push 公開リポジトリに自分のリポジトリの内容を送信する http://sourceforge.jp/magazine/09/03/16/0831212
  • 31.
    まとめ • コマンドがいっぱいあって何でも出来る(らしい) • 便利なGitを使いこなすとカッコいい(重要) • という事でレッツGit!!