狠狠撸

狠狠撸Share a Scribd company logo
Git と仲良くするために
秘密結社 分散構成管理の杜
2013/11/18 masato-ka
この勉強会と資料について

目的は、Gitのコマンドをみんなで使って分散構成
管理ツールの使い方を体感することです。
すいません、資料は突貫工事で作っていますので
間違いや不備があるかもしれません。もし気付け
ば教えて下さい。
構成管理どうしてますか?

ヒャッハー = 「フォルダ管理」
統率された社会 = Subversion, CVS, TFS
個を尊重する社会 = Git, Mercurial, Bazaar
統率された社会

集中リポジトリ(Subversion)
リポジトリ

commit

checkout/upd
ate

ワークコピー
分散構成管理とは?

分散構成管理(git)

push

リポジトリ

リポジトリ
pull/clone

ステージング

ワークコピー
Gitを使おう

分散構成管理ツールのデファクトスタンダード
Linuxのカーネルを管理するために開発された
ネットワークが止まっても使えて便利とか行って
るけど、大抵の人がGitHubが停止したら怒る。
おすすめ書籍

Git ポケットリファレンス
WindowsでGitを使うには?

その昔WindowsでGitを使うのは大変でした。
(WinGM, Cygwin などの環境構築から)最近はワ
ンクリックのインストーラがあるようです。
GitのいいGUIツールは?

つべこべ言わずCUI使いやがれ!
EclipseはEGitその他はSourceTreeやTortoiseGitなど
ありますが、いまいち決定打はなさそうです。ま
ずはコマンドラインに馴れてからGUIツールを探し
てみましょう。
使い始める前に

Gitを設定しよう
ユーザ名とメールアドレス
>git config --global user.name “masato-ka”
>git config –global user.email “mail@mail.com”
.gitignore(無視リスト)
*.jar
*~
target/
!lib.jar
手元でGitを使う方法

まずは一人でGitを使う手順です。練習してみま
しょう。
1.
2.
3.
4.
5.

リポジトリの作成(git init)
変更をステージングする(git add)
ステージングの内容を確認する(git status)
変更をコミットする(git commit)
コミット内容を確認する(git log)
リポジトリの作成

Gitで管理したいファイルがあるフォルダに移動し
て「git init」を実行します。
>git init
または
>git init C:/workspace/SampleProject

「C:/workspace/SampleProject」をリポジ
トリとして初期化する。以下のような
メッセージが出ます。
Initialized empty Git repository in
コミットのための2段階

変更点をGitのリポジトリに入れるためにはステー
ジングする必要がある。

新規追加ファイ
ル

編集済みファイ
ル

git add

新規追加ファイ
ル

編集済みファイ
ル
ステージング

git commit

ローカルリポジト
リ
add

ファイルを編集した内容をステージングエリアに
入れる
適当なファイルを編集してくださいその後、次のコ
>git add [変更を記録したいファイルまたはフォ
ルダ]
マンドを実行
指定記法

意味

hogehoge.java

hogehoge.java

*

変更されたすべてのファイ
ル

src

srcフォルダ

*.java
変更されたjavaファイルす
※ *を使うとサブディレクトリも検索される。
べて
※ git resetでステージングエリアから削除できる。
status

ステージングエリアの状態を表示させる。
>git status
sample.txtを新規にステージングエリアに追加した状態が表
示される。
commit

ステージングに変更を登録したあと、ローカルリ
ポジトリに登録する。
>git commit –m “コミットコメント”
ブランチについて

ブランチは作業をするために必要な物です。
Gitリポジトリはmasterというブランチが存在して
います。
通常は他のリポジトリの同期をmasterで行うため、
他のブランチを作成して作業を行います。(master
を汚さずに開発する。)
Issueブランチや開発ブランチ、バグ修正ブランチ
などの種類があります。(実際は同じブランチで
す。)
ブランチを図示してみる

head

master
a

b

e
c

d
branch

merge
git branch

ブランチの一覧を表示させる。
>git branch

* master アスタリスクが現在のブランチ

master a

head
b
git checkout

ブランチを作成する or 切り替える
>git checkout -b topic
>git branch -l
master a

head
b

*topic c
>git checkout master
>git branch -l
*master a

b
topic c
突然ですが総合演習1

masterへコミットしてください。
topicブランチに移動して3回コミットしてください。
それぞれ、ファイルの編集2回、フォルダの追加1回
です。
git merge [ブランチ名]

他のブランチの変更を取り込む
>git checkout master
>git merge topic
*master a

d

b
topic

c

h
e

f

g

もしも競合が発生した場合は競合を解消してコミットし
てほしい
競合

競合が発生した場合は
>git status –s
UU conflict.txt #競合が発生したファイル
競合したファイルを編集してaddする
>git status –s
M conflict.txt #競合が発生したファイル
>git commit #競合解消時は自動でコミットコメント
が入る
Fast-Forwardマージ

mergeされるまでにmasterにコミットが無ければ
masterのヘッドとブランチのヘッドが同じコミッ
トを示す。

master
topic
*master a

g

b
topic

c

e

f

g
git rebase master

分岐元ブランチの最新のコミットにつなぎ変える
。
*master a
b
g
topic

c

e

f

>git rebase master #topic ブランチで実行
*master a

b
topic

g
c

e

f

h

>Fast-Forward マージ!<

i

j
つまりどういうことだってば
よ!
競合解決を行うブランチを決めることができる
普通にmasterでマージ → masterで競合を解決
rebaseしてマージ → topicブランチで競合を解決
ブランチ生存戦略

よく使う(らしい)ブランチ
機能ブランチ
トピックブランチ
開発ブランチ
安定ブランチ
メンテナンスブランチ
共有リポジトリを使ってみる

共有リポジトリの作成(git init)
ローカルリポジトリの作成(git clone)
作業用ブランチの作成 (git branch)
共有リポジトリの変更を取り込む(git pull)
ローカルリポジトリから共有リポジトリへ(git
push)
共有リポジトリの準備

今回は作りません。以下のgithubのリポジトリを使
います。
https://github.com/masato-ka/SampleProject.git
git clone [共有リポジトリのパ
ス]
共有リポジトリからローカルリポジトリを作成す
る
リポジトリ

リポジトリ

>git clone https://github.com/masatoka/SampleProject.git

リポジトリ

リポジトリ
作業用リポジトリを作成する

masterブランチで直接作業すると、自分の変更
点と共有リポジトリにpushされた他人の変更点が
ごっちゃになってしまう。そこで、自分の作業は
作業ブランチで行う。
共有リポジトリ
*master a

b
clone

*master a

b

c

e

f
git pull

共有リポジトリの変更をローカルリポジトリに取
り込む
リポジトリ

リポジトリ

>git pull

リポジトリ

リポジトリ
変更を取り込み後マージする

共有リポジトリから他の人の変更を取り込みマー
ジする
共有リポジトリ
*master a

b

g

clone

*master a

pull
b

work

c

e

f

merge
h

conflict
git push

共有リポジトリからローカルリポジトリを作成す
る
リポジトリ

リポジトリ

>git push

リポジトリ

リポジトリ
共有リポジトリへ反映

共有リポジトリへマージ結果を反映する
共有リポジトリ
*master a

b

g

h
merge

clone

*master a

pull
b

work

c

e

f

push
h

conflict
作業ブランチを使って見やすく

ローカルでコミットをまとめるため、履歴が追跡
しやすい
共有リポジトリ
*master a

b

g

clone

*master a

h

pull
b

work

push
g

c

e

h
f

コミットがま
とめられて履
歴が汚れない

merge --squash
ブランチをpushする。

ローカルリポジトリで作成したブランチはpushし
なくては行けない。

>git push –u origin fix-branch
総合演習2

一つのGitHubリポジトリをみんなで作業しましょ
う。
皆さん自分の名前を作成してコミットしてくださ
い。
5回以上編集を行ってください。
共有リポジトリにpushしてください。
となりの人と同じファイルを編集してコンフリク
トを起こしましょう。
作業ブランチを使ってもかまいません。違いを確
認しましょう。
これまでのあらすじ

ひょんなことからGitリポジトリを作ってしまった
俺たちは、お互いの存在をまだ知らない。

あの日作ったGitHubアカウントに僕たちはまだpushしてい
ない
GitHub

Gitのホスティングサービス
Issueの管理機能(チケット)
他人のリポジトリをForkできる。
Pullリクエストと呼ばれる独特の仕組みがある。
GitHubを活用した開発

Forkとpullリクエストを活用
http://github.com/masato-ka/SampleProject

/[yourname]/SampleProject
fork

リポジトリ

リポジトリ
pull request

push

pull

clone

local

リポジトリ
master
Fix-branch
編集とリベー
ス
作業の流れ

GitHubのWEB画面からfork
フォークしたリポジトリをclone
作業用ブランチを作成し、作成したブランチで編
集
作業用ブランチをpush(git push –u origin fix-branch)
Fork元のリポジトリ(upstream)からmasterに変更を
取り込む
作業ブランチをrebaseし自分のリポジトリにpush
プルリクエスト送信
Fork

Fork
git remote add

clone元の以外のリポジトリを追加する。
>git remote add upstrema
https://github.com/masato-ka/SampleProject

追加されたことを確認する。
>git remote -v
総合演習

http://github.com/masato-ka/SampleProject をforkし
て自分の名前のファイルを編集し、pullリクエスト
を送ってください。
まとめ

Gitを個人で使う
Addしてcommit
branch(ブランチでマージか?マスターでマージか?)

共有リポジトリで使う
基本はマージ
masterを綺麗に使う方法

GitHub
Forkとpullリクエスト

More Related Content

骋颈迟勉强会