もう怖くないGit!チーム開発で必要なGitを完全マスター セクション6復習

セクション6:ブランチとマージを使いこなそう

ブランチって何?

  • 並行して複数機能を開発するためにあるのがブランチ
    • 他の人の変更が自分の開発に影響しない
    • ブランチがないと開発中にマスターに変更があった場合、その変更を都度自分が取り込んで開発をしなければならない

ブランチの仕組みを知ろう

  • コミットファイル

    • ファイル名はファイルの中身を40文字の英数字に変換したもの
    • コミットファイルのparentに1つ前のコミットファイルが書かれているため、 時系列順に辿ることが可能
  • ブランチ

    • コミットIDを指したポインタ、コミットすると最新のコミットに移動する
    • HEAD...自分が作業しているブランチ、ファイルの中身はref:ブランチ名を指している
  • まとめ

    • 変更差分はコミットを切り替えるだけのため、ブランチの作成・切り替えが他のバージョン管理ツールより高速
    • Gitは大規模開発に置いて最も使われるツールになり、普及した

新しいブランチを作成しよう

  • git branch ブランチ名
    • ブランチを作成するだけで切り替えまでは行わない
    • git branch...全てのブランチを表示する(リモートのブランチも表示させない場合はgit branch -a)

ブランチを切り替えよう

  • git checkout 既存ブランチ名
    • git checkout -b 新ブランチ名...ブランチの作成と切り替えが同時に出来る
    • HEADが指し示すブランチを切り替える

変更をマージしよう

  • マージ...他の人の変更内容を取り込む作業のこと
  • git merge ブランチ名またはリモート名/ブランチ名
    • 取り込み方は3種類
      • Fast Foward...ブランチが枝分かれしてなかった時はブランチのポインタを前に進めるだけ
      • Auto Merge...枝分かれしてして開発していた場合、マージコミットという新しいコミットを作る(複数のコミットIDをparentとして持つ)
      • コンフリクト

コンフリクトを解決しよう

  • コンフリクト
    • 複数人で同じ箇所を別々に修正した場合にどの変更を優先したらいいかわからない状態
  • 解決方法
    • 最終的なファイル内容を記載する
      1. ファイルの内容を書き換える
      2. 「<<」 「>>」 「==」 の記述を削除する
        • <<HEAD ~ ==
          • HEADの変更部分
        • == ~ >>ブランチ名
          • 取り込み元のブランチの変更部分

コンフリクトが起きないようにするには?

  • コンフリクト関連の事故が起きにくい運用ルール
    • 複数人で同じファイルを変更しない
      • コンフリクトは同じファイルの同じ箇所を別々に変更した場合に発生するから
    • pullやmergeする前に変更中の状態を無くしておく(commitやstashをしておく)
      • pullやmergeするファイルと変更中のファイルがダブるとpull,mergeできなくなる
    • pullするときはpullするブランチに移動してからpullする
      • pullすると自分の今いるブランチにpullしてしまい、作業中のファイルとコンフリクトする可能性が高いから
    • コンフリクトしても慌てない

ブランチを変更・削除しよう

  • git branch -m ブランチ名
    • 自分が作業しているブランチの名前を変更する
  • git branch -d ブランチ名
    • 指定したブランチを削除する
    • -Dオプションでmasterにマージされていないブランチを強制削除する

ブランチを利用した開発の流れ

  • maserブランチをリリース用ブランチに、開発はトピックブランチを作成して進める
    • masterブランチを最新の状態と同じ状態に出来るため
    • masterブランチで開発するとリリースがどの状態か分からなくなる
    • 開発は最新のmasterブランチからトピックブランチを作成し進める

リモートブランチって何?

  • リモートブランチ
    • リモートのブランチの状態へのポインタ
      • リモートブランチはリモート/ブランチで参照できる
      • git fetchでリモートブランチの情報を取得できる
        • origin/master
      • git branch -aで取得したリモートブランチを確認できる
        • remotes/origin/master