みの雑多ブログ

勉強したことをアウトプットしたり、しなかったり

Gitの基礎の基礎を学んだのでそれをアウトプット④ ~ブランチとマージ(時々リベース)

今回もGitの基礎の基礎をクイズ形式でアウトプット
コマンドとかではなくて、中ってどうなっているの?がメイン。

ブランチって何?

ブランチはコミットファイルを指しているポインタ。
ブランチの中身を見ると、ただのハッシュIDが記載されている。
このハッシュIDの正体がコミットファイル名。(.git/配下見てみるといろいろわかる)

HEADって何?

ワークツリーでブランチを指しているポインタ。
どのブランチを指しているの?ってのが書かれている。

ブランチの切り替え(master -> feature)

$ git checkout feature

ブランチの切り替え

ブランチを新規作成して、切り替え(master -> feature2)

$ git checkout -b feature2

ブランチの新規作成と切り替え

マージって何?

二つのコミットファイルを統合する処理。
FastForword、AutoMerge、Conflictの3種類があって、基本はAutoMergeなので下に示すはAutoMerge。  
masterにfeatureをマージ

$ git merge feature

マージ処理
普通のコミットと違って、マージコミットは二つのコミット情報を持つ。

マージとリベースって何が違うの?

リベース(rebase)はbaseをreする(=親コミットを書き換える)んだよ。
masterにリベース

$ git rebase master

リベース処理
この後、masterにfeatureをマージすれば、マージと同じような結果になる。
ただ履歴や内部的には異なっており、コミット3は消えてしまう。
また、マージもAutoMergeではなく、FastForwordになってしまう。(※ポインタがfeatureが指しているコミットファイルに変わるだけなので、マージコミットが残らない。。)
ちなみに設定次第で、FastForwordされないようにはできる!!

マージとリベースどっちを使ってもいいの?

GitHubにpushしたブランチをリベースするのは、やめておいたほうが良い!!
GitHubは親コミットが変わっちゃってるよぉ~、となってpushを受け付けてくれなくなる。
git push -f、で強制的にpushもできるが、複数人で開発しているときは本当に嫌がられるかも。(そういう運用にしているならいいのかもしれないが)
pushしていないときに、履歴を整理するためくらいで使うのはいいのかな、と個人的に思う。
あとconflictの解消もマージの方が易しい。(詳細は気が向いたら)