Git 勉強会@万葉 #1 にいってきた

万葉さんにお邪魔してきました。
http://atnd.org/events/537

前半戦は id:koichiro さんによる Git についてのいろいろ。
後半戦は id:jugyo さんを中心にみんなで Git を使ってみるという感じでした。

以下、内容メモ晒し。
後半戦のは話題に上ったコマンドをひたすらメモった感じなので、見づらいかもしれません。

Git の歴史 (id:koichiro)

Git とは?

  • 分散 SCM
  • Linus が開発
  • メンテナは日本人の濱野さん => Web + DB vol.50 の特集を嫁!

集中 SCM

  • 単一リポジトリで管理
  • 各作業者はワーキングコピーを持っている
  • コピーをリポジトリに commit する => 変更されるのは 1 つだけ

分散 SCM

  • 複数のリポジトリが扱える
  • 各作業者はマスターを複製したリポジトリを持っている
  • マスターは運用上のルールとして定めるだけ
  • リポジトリは push, pull で状態を管理する

分散になると・・・

メリット
  • オフラインで操作可能
  • 権限が集中しない
  • fork しやすい
デメリット
  • 複雑になる

Git の歴史

誕生
  • BitKeeper (商用 SCM)
    • オープンソースは無償で利用可
    • 分散リポジトリをサポート
    • メールベースで管理
    • 高速・堅牢
    • 多くのブランチを扱うことが可能
    • Linux カーネル開発者が clone 作ってしまって、販売元が怒った

「水道より水道管作るのが好き」 by Linus

SCM の歴史

  • SCCS => BitKeeper => (Git & Mercurial)
  • RCS => cvs => subversion
  • 単一ファイル => プロジェクト => 分散
  • Mercurial は、 Git 開発者の人が別の管理方法を実現するために分離して作成された
  • 開発言語: Python
  • java 関係、 NetBeans でよく利用されている。
RCS
  • 利点: ファイル管理は便利
  • 要求: 単体なので、プロジェクトをまとめて管理したい
cvs
svn
  • 利点: 堅牢なデータ構造、 I/F が多彩
Git
  • 利点: 分散は便利
  • コマンドが多すぎる!

Git の特徴

  • Git Object
  • SHA1 ハッシュ
  • ブランチの扱いが簡単

Github について

  • 「我々は Git を使いたいのではない。 Github を使いたいのだ!」 by 角谷さん
  • コードとコードで語る漢達のための SNS
  • fork が簡単
  • コミッタの特権が消滅した => コミッタ中心ではなく、コード中心
  • 非常によくできた Rails App
機能
  • gist
  • ブラウザでのソース編集
  • issue track
  • gisty で便利に gist を使う

みんなで Git をつっつく (id:jugyo)

Git quickstart

  • git init ~ git commit
  • git log
  • git reset --soft, --hard ==> リポジトリに加わった変更に対して
  • git rm --cached ==> 新しくリポジトリに追加したファイルを取り消す
  • git reset について
    • svn でいう revert は? => reset --hard
    • 1 ファイルだけとかできる? => reset でできるが、オプション指定不可になる。 man を見よう。
    • git reset --hard HEAD~2 => 2 つ前のコミットへ戻る
  • merge 時にコミットを一つにするには??
  • テキスト 1 つだけを checkout したい
    • git checkout BRANCH FILENAME
  • commit しちゃったメールアドレスを変更したい?
  • gitconfig に global を付けない
    • リポジトリごとにアドレスを変えられる
    • ローカル設定は ./.git/config にある
  • git add -p
    • 一部の差分だけ取り込むことが可能
  • git log -u
  • git log --stat
  • git grep
    • color オプションないの?
    • kernel.org の man には記載されてる
    • 2009/04/20 に追加されたようだ
  • git commit --amend

branch について

  • git branch BRANCHNAME BRANCH2
    • 引数 1: 作るブランチ名, 引数 2: 元にするブランチ
  • git merge --no-commit
    • コミットなしでマージする
    • コミットすると、そこまでのログが全部書き込まれる
  • git merge --squash
    • squash との違いは?
    • squash はそこまでのログは全て破棄されるので、コミット 1 回になる
  • git format-patch BRANCHNAME
    • パッチが作成される
  • git apply PATCHNAME
    • パッチファイル適用
  • git stash save
    • テンポラリ領域に保存する
  • git stash apply
  • git stash pop
    • 1 個だけ取り出す
  • git stash drop
    • 1 個だけ消す

結論

いっぱいコマンドあるけど、 20 個くらい使えれば生きていけるよ!

参考書:

Pragmatic Version Control (洋書)
Web + DB vol50


講師の方々、参加者の皆様、お疲れ様でした!