その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

いまさら Git のブランチについて勉強したメモ

だいたい開発はひとりだったので、ローカル Git で master だけ使ってて不自由してなかったのですが、最近「ちょっとこれ試してみて」と言われたリポジトリを見てみたら、develop なるブランチを使用している。。


とりあえず git clone してみると、master を取りにいってしまい develop ブランチのデータは取れていない。


じゃあ、ということで develop ブランチを git pull してみたら、なんか怪しい雰囲気に。master に更新が入ってしまったっぽい。


調べてみると、下記の記事が見つかりました。


Git で新しいリモートブランチをローカルに持ってくるときに git pull してはいけない理由


git pull すると、現在のブランチにマージされる。すなわち、master を clone してきたあとで develop ブランチを pull すると、master に develop の内容をマージしてしまう、ということらしいです。危ない。


正しくは、git branch コマンドを使用するとのことです。

単に新しいリモートブランチを自分のローカルに持ってくるのであれば、下記のようにするのが正しいです。

$ git branch new-branch origin/new-branch


「git branch」コマンドに第2引数を与えると、それを起点にしたブランチがつくられます。


ただ何となく腑に落ちないので、git branch を実行せずもう少し調査を実行。下記にもっと詳しくて正確な情報がありました。


Git - ブランチとマージの基本

ブランチの作成と新しいブランチへの切り替えを同時に行うには、git checkout コマンドに -b スイッチをつけて実行します。

$ git checkout -b iss53


これは、次のコマンドのショートカットです。

$ git branch iss53
$ git checkout iss53


なるほど。


納得したので SouceTree で次のように選択してを実行。



ログを見てみると、この操作はこういうコマンドらしい。

git checkout -b develop --track origin/develop 


"--track" オプションは、


git checkout の --track オプションの意味


によると、

git checkout の --track オプションは、リモートリポジトリのブランチ X を起点にブランチ A を作った場合に、引数なしの git pull でブランチ X を fetch してブランチ A にマージできるように設定してくれる。具体的には branch.A.remote と branch.A.merge を設定してくれる。


とは言っても、git checkout のデフォルトの動作は --track オプションをつけたのと同じ。追跡しないようにするには --no-track オプションをつける。


重要な部分を太字にさせていただきました。そういうことらしいです。



また Git について勉強したら随時追記していこうと思います。