git勉強会
TRANSCRIPT
![Page 1: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/1.jpg)
Git と仲良くするために 秘密結社 分散構成管理の杜
2013/11/18 masato-ka
![Page 2: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/2.jpg)
目的は、 Git のコマンドをみんなで使って分散構成管理ツールの使い方を体感することです。
すいません、資料は突貫工事で作っていますので間違いや不備があるかもしれません。もし気付けば教えて下さい。
この勉強会と資料について
![Page 3: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/3.jpg)
ヒャッハー = 「フォルダ管理」
統率された社会 = Subversion, CVS, TFS
個を尊重する社会 = Git, Mercurial, Bazaar
構成管理どうしてますか?
![Page 4: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/4.jpg)
集中リポジトリ (Subversion)
統率された社会
リポジトリ
commit
checkout/update
ワークコピー
![Page 5: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/5.jpg)
分散構成管理 (git)
分散構成管理とは?
リポジトリ リポジトリ
ワークコピー
ステージング
push
pull/clone
![Page 6: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/6.jpg)
分散構成管理ツールのデファクトスタンダード
Linux のカーネルを管理するために開発された
ネットワークが止まっても使えて便利とか行ってるけど、大抵の人が GitHub が停止したら怒る。
Git を使おう
![Page 7: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/7.jpg)
Git ポケットリファレンス
おすすめ書籍
![Page 8: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/8.jpg)
その昔 Windows で Git を使うのは大変でした。( WinGM, Cygwin などの環境構築から)最近はワンクリックのインストーラがあるようです。
Windows で Git を使うには?
![Page 9: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/9.jpg)
つべこべ言わず CUI 使いやがれ!
Eclipse は EGit その他は SourceTree やTortoiseGit などありますが、いまいち決定打はなさそうです。まずはコマンドラインに馴れてからGUI ツールを探してみましょう。
Git のいい GUI ツールは?
![Page 10: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/10.jpg)
Git を設定しよう
使い始める前に
>git config --global user.name “masato-ka”>git config –global user.email “[email protected]”
ユーザ名とメールアドレス
.gitignore( 無視リスト )
*.jar*~target/!lib.jar
![Page 11: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/11.jpg)
まずは一人で Git を使う手順です。練習してみましょう。
1. リポジトリの作成 (git init)2. 変更をステージングする (git add)3. ステージングの内容を確認する (git status)4. 変更をコミットする (git commit)5. コミット内容を確認する (git log)
手元で Git を使う方法
![Page 12: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/12.jpg)
Git で管理したいファイルがあるフォルダに移動して「 git init 」を実行します。
リポジトリの作成
>git init
>git init C:/workspace/SampleProject
または
「 C:/workspace/SampleProject 」をリポジトリとして初期化する。以下のようなメッセージが出ます。Initialized empty Git repository in
![Page 13: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/13.jpg)
変更点を Git のリポジトリに入れるためにはステージングする必要がある。
コミットのための2段階
ステージング
ローカルリポジトリ
新規追加ファイル
編集済みファイル
新規追加ファイル
編集済みファイル
git add
git commit
![Page 14: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/14.jpg)
ファイルを編集した内容をステージングエリアに入れる
適当なファイルを編集してくださいその後、次のコマンドを実行
add
>git add [ 変更を記録したいファイルまたはフォルダ ]
指定記法 意味hogehoge.java hogehoge.java
* 変更されたすべてのファイル
src src フォルダ*.java 変更された java ファイル
すべて※ * を使うとサブディレクトリも検索される。※ git reset でステージングエリアから削除できる。
![Page 15: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/15.jpg)
ステージングエリアの状態を表示させる。
status
>git status
sample.txt を新規にステージングエリアに追加した状態が表示される。
![Page 16: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/16.jpg)
ステージングに変更を登録したあと、ローカルリポジトリに登録する。
commit
>git commit –m “ コミットコメント”
![Page 17: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/17.jpg)
ブランチは作業をするために必要な物です。 Git リポジトリは master というブランチが存在し
ています。 通常は他のリポジトリの同期を master で行うた
め、他のブランチを作成して作業を行います。(master を汚さずに開発する。 )
Issue ブランチや開発ブランチ、バグ修正ブランチなどの種類があります。(実際は同じブランチです。)
ブランチについて
![Page 18: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/18.jpg)
ブランチを図示してみる
a b e
head
dc
master
branch
merge
![Page 19: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/19.jpg)
ブランチの一覧を表示させる。
git branch
>git branch
* master アスタリスクが現在のブランチ
a bmaster
head
![Page 20: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/20.jpg)
ブランチを作成する or 切り替える
git checkout
>git checkout -b topic>git branch -l
a bmaster
head
c*topic
>git checkout master>git branch -l
a b*master
ctopic
![Page 21: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/21.jpg)
master へコミットしてください。 topic ブランチに移動して 3 回コミットしてくださ
い。 それぞれ、ファイルの編集 2 回、フォルダの追加1
回です。
突然ですが総合演習1
![Page 22: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/22.jpg)
他のブランチの変更を取り込む
git merge [ ブランチ名 ]
>git checkout master>git merge topic
a b*master
ctopic
d
e f g
h
もしも競合が発生した場合は競合を解消してコミットしてほしい
![Page 23: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/23.jpg)
競合が発生した場合は
競合
>git status –sUU conflict.txt #競合が発生したファイル
競合したファイルを編集して add する
>git status –sM conflict.txt #競合が発生したファイル>git commit #競合解消時は自動でコミットコメントが入る
![Page 24: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/24.jpg)
merge されるまでに master にコミットが無ければ master のヘッドとブランチのヘッドが同じコミットを示す。
Fast-Forward マージ
a b*master
ctopic e f g
g
master
topic
![Page 25: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/25.jpg)
分岐元ブランチの最新のコミットにつなぎ変える。
git rebase master
a b*master
ctopic e f
g
>git rebase master #topic ブランチで実行
a b*master
ctopic e f
g
h i j
>Fast-Forward マージ! <
![Page 26: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/26.jpg)
競合解決を行うブランチを決めることができる
普通に master でマージ → master で競合を解決 rebase してマージ → topic ブランチで競合を解決
つまりどういうことだってばよ!
![Page 27: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/27.jpg)
よく使う(らしい)ブランチ 機能ブランチ トピックブランチ 開発ブランチ 安定ブランチ メンテナンスブランチ
ブランチ生存戦略
![Page 28: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/28.jpg)
共有リポジトリの作成 (git init) ローカルリポジトリの作成 (git clone) 作業用ブランチの作成 (git branch) 共有リポジトリの変更を取り込む (git pull) ローカルリポジトリから共有リポジトリへ (git
push)
共有リポジトリを使ってみる
![Page 29: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/29.jpg)
今回は作りません。以下の github のリポジトリを使います。
https://github.com/masato-ka/SampleProject.git
共有リポジトリの準備
![Page 30: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/30.jpg)
共有リポジトリからローカルリポジトリを作成する
git clone [共有リポジトリのパス ]
>git clone https://github.com/masato-ka/SampleProject.git
リポジトリ リポジトリ
リポジトリ リポジトリ
![Page 31: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/31.jpg)
共有リポジトリ
master ブランチで直接作業すると、自分の変更点と共有リポジトリに push された他人の変更点がごっちゃになってしまう。そこで、自分の作業は作業ブランチで行う。
作業用リポジトリを作成する
a b*master
c e f
a b*master
clone
![Page 32: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/32.jpg)
共有リポジトリの変更をローカルリポジトリに取り込む
git pull
>git pull
リポジトリ リポジトリ
リポジトリ リポジトリ
![Page 33: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/33.jpg)
共有リポジトリ
共有リポジトリから他の人の変更を取り込みマージする
変更を取り込み後マージする
a b*master
c
work
e f
a b*master
g
clonepull
h
merge
conflict
![Page 34: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/34.jpg)
共有リポジトリからローカルリポジトリを作成する
git push
>git push
リポジトリ リポジトリ
リポジトリ リポジトリ
![Page 35: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/35.jpg)
共有リポジトリへマージ結果を反映する
共有リポジトリへ反映
共有リポジトリ
a b*master
c
work
e f
a b*master
g
clonepull
h
merge
conflict
h
push
![Page 36: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/36.jpg)
共有リポジトリ
ローカルでコミットをまとめるため、履歴が追跡しやすい
作業ブランチを使って見やすく
a b*master
cwork e f
g
a b*master
g
clone pull
h
merge --squash
h
pushコミットがまとめられて履歴が汚れない
![Page 37: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/37.jpg)
ローカルリポジトリで作成したブランチは pushしなくては行けない。
ブランチを push する。
>git push –u origin fix-branch
![Page 38: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/38.jpg)
一つの GitHub リポジトリをみんなで作業しましょう。
皆さん自分の名前を作成してコミットしてください。
5回以上編集を行ってください。 共有リポジトリに push してください。 となりの人と同じファイルを編集してコンフリク
トを起こしましょう。 作業ブランチを使ってもかまいません。違いを確
認しましょう。
総合演習2
![Page 39: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/39.jpg)
ひょんなことから Git リポジトリを作ってしまった俺たちは、お互いの存在をまだ知らない。
これまでのあらすじ
あの日作った GitHub アカウントに僕たちはまだ push していない
![Page 40: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/40.jpg)
Git のホスティングサービス Issue の管理機能 ( チケット ) 他人のリポジトリを Fork できる。 Pull リクエストと呼ばれる独特の仕組みがある。
GitHub
![Page 41: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/41.jpg)
Fork と pull リクエストを活用
GitHub を活用した開発
リポジトリ リポジトリ
fork
pull request
http://github.com/masato-ka/SampleProject
/[yourname]/SampleProject
リポジトリ
clone
編集とリベース
local
pushpull
masterFix-branch
![Page 42: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/42.jpg)
GitHub の WEB画面から fork フォークしたリポジトリを clone 作業用ブランチを作成し、作成したブランチで編集 作業用ブランチを push(git push –u origin fix-
branch) Fork 元のリポジトリ (upstream) から master に変
更を取り込む 作業ブランチを rebase し自分のリポジトリに push プルリクエスト送信
作業の流れ
![Page 43: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/43.jpg)
Fork
Fork
![Page 44: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/44.jpg)
clone 元の以外のリポジトリを追加する。
git remote add
>git remote add upstrema https://github.com/masato-ka/SampleProject
>git remote -v
追加されたことを確認する。
![Page 45: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/45.jpg)
総合演習
http://github.com/masato-ka/SampleProject を fork して自分の名前のファイルを編集し、 pullリクエストを送ってください。
![Page 46: Git勉強会](https://reader036.vdocuments.pub/reader036/viewer/2022081421/559232d21a28ab312f8b475b/html5/thumbnails/46.jpg)
Git を個人で使う Add して commit branch( ブランチでマージか?マスターでマージ
か? ) 共有リポジトリで使う
基本はマージ master を綺麗に使う方法
GitHub Fork と pull リクエスト
まとめ