gitのローカル
リポジトリで

ドワンゴモバイル @kbigwheel

masterやdevelopは使うな!


予想以上につまらなかったので
急きょやめて別のネタをします

今日は僕が個人的に実践してる
gitの使い方の話

予め予防線を張っておくと、
僕はgitマスターには程遠いので
完全に間違ったことを
言ってる可能性があります

今日のスライドは頭から鵜呑みにせず、
この方針を採用する場合は
自分自身でよく考えてから実践してください

本題入ります

今日言いたいこと
$ git branch
master
develop
features/sugoi-kino
↑よくlocalリポジトリにあるこれ、
masterブランチとdevelopブランチ。


これを、窓から投げ捨てよう
$ git branch -d master
$ git branch -d develop
$ git branch
features/sugoi-kino

Why?

rebase作業で混乱しやすいため

例1. features/sugoi-kinoブランチをoriginリモートリポジトリのdevelopブランチに対してrebaseしたい

$ git checkout features/sugoi-kino
$ git fetch origin
$ git rebase develop

これは間違い。なぜかというとfetchコマンドは
originリモートリポジトリのdevelopブランチ(origin/develop)と
ローカルリポジトリのdevelopブランチを同期しないから
(新人のNさん(仮名)は新人の頃これで一度
投入事故を起こしたことがあります)
これは間違っている
$ git checkout features/sugoi-kino
$ git fetch origin
$ git rebase develop

ではどうするのが正しいか


$ git checkout develop
$ git pull origin develop # このコマンドでorigin/developとdevelopを同期する
$ git checkout features/sugoi-kino
$ git rebase develop

これなら最新状態になったローカルリポジトリのdevelop
ブランチに対してrebaseできる

でもちょっと待て

なんでoriginリモートブランチのdevelopブランチを対象に
rebaseしたいのにわざわざローカルのdevelopブランチを
中継する必要があるんだ?

リモートブランチを直接指定してrebaseする方法が
あるんじゃないの?



→あります

実はブランチを指定する場所では
リモートリポジトリ名/ブランチ名
と書くことでリモート上のブランチを直接指定できる

$ git fetch origin
$ git rebase origin/develop
こんな感じ

mergeでも同様にリモートリポジトリ上のブランチを指定できる

これができるとローカルリポジトリにあるブランチは
変更を直接加えるブランチのみになる


しかしgithubを使ってるためmaster,developへの変更は
現状pull requestがすべて



ローカルリポジトリのmaster, developブランチ(゚⊿゚)イラネ

特にほかのVCSからgitへ移ってきた人は
ローカルのブランチとリモートのブランチが
混同されがち(あるいは自動で同期されると勘違いしがち)


なので、

ローカルのmaster,developブランチは削除して
origin/* 構文を覚えましょう!


gitに慣れてる人でもローカルのブランチが
すべて進行中のブランチのみになるという嬉しい点があります

蛇足1 detached head

 $ git checkout origin/master
このようにcheckoutでもorigin/* 構文は使用可能

ちょっとmasterでテストしたい場合なんかに便利

ただしこれを行うとdetached head状態になる
(自分がどのブランチにいるかわからない状態)

ただgitがワカンネーよって言ってるだけでcheckoutした
自分自身はわかってるはず。問題ないので恐れるな!

蛇足2 なんでgit fetchはブランチを同期しないの?

git fetchコマンドは一見originリポジトリのdevelop

ローカルリポジトリのdevelopを同期してくれそうに見えるが、
実際にはoriginリポジトリのdevelopローカルリポジトリのorigin/developを同期する


逆に言うとgit fetchしない限りローカルリポジトリのorigin/developは同期されない
(origin/developを指定するたびoriginを見に行って
最新状態を取得したりしない)

よって

$ git fetch origin
$ git rebase origin/develop
のfetchを忘れて
$ git rebase origin/develop
だけ実行してしまうと最後にfetchした時のorigin/developへrebaseしてしまう

→ 投入事故につながる!

注意しましょう

スライド



こっからは質問・ツッコミ待ち
Made with Slides.com