The Pragmatic Ball boy

iOSを中心にやってる万年球拾いの老害エンジニアメモ

Git道場に参加してきた

Git道場に参加してきました Gitを使うにあたっての心技体を体で覚えるというまさに道場スタイル。

最初にGitの心得についての講演があり、その後はほぼずっと実習でした。

Gitの使い方とかの説明はほとんどなかったので初心者の方にはつらかったかも。

実習は2段階。

まず最初の実習では10行のテキストを4〜5人で各自1commitしてはpushするといったものでした。
少ない行数のテキストを編集するのでもちろんコンフリクトの嵐で、誰かがpushしてはpullしてきてコンフリクトが発生して うがー と言いつつコンフリクトを直してcommitしなおすという作業を延々と行いました。

その結果こちらのネットワーク図の前半部分のようにカオスなネットワークができあがりました。
https://github.com/git-dojo/team06/network

これはコンフリクトを解消するたびにマージを繰り返しているのでどんどんぐちゃぐちゃになってしまっています。

これをもっとまっすぐにしたいですよね?

というのが2つ目の実習。

内容はまったく1つ目と同じことをするのですが、pullする際に、単にpullするのではなく、pull --rebaseします。そしてコンフリクトが発生したら修正してaddし、その後これまでのようにcommitするのではなく、rebase --continueすることでマージせずにリベースすることができるのできれいなネットワーク図ができあがるのです。

これまではずっと一人で使っていたのでコンフリクトとかほとんどきにすることがなかったので、こういうことが起こることを全く考えていなかったのでとても役に立ちましたし、嫌になるほどpull --rebaseとrebase --continueしたので体にしみつきました!




以下メモ

git reflogで作業履歴がみれる(ただし90日以内かつgit GCされていないこと)
git GCをとめるには git config --global gc.auto 0
git log --graph --pretty=oneline でネットワーク図が出せる
git commit -> git pull --rebase -> conflict発生 -> 直す -> git add -> git rebase --continue
git rebase --continueせずにcommitしてしまった場合はrebase --skip する
mergeとrebaseはどちらも利点、欠点があるので使い分ける
mergeはどこでミスったかわかりやすい
基本rebaseでブランチはmergeというのがいいかも