ブランチの運用

ブランチの運用

 Gitは、自由にブランチを作成可能。

しかしあらかじめ運用ルールを設ける必要がある。

●統合ブランチ

リリース版が何時でも作成可能。トピックブランチの分岐元。

安定した状

 

態を保つ必要がある。通常materブランチを統合ブランチとして使用。

●トピックブランチ

機能追加やバグ修正といった作業を行うために作成するブランチ。

複数の課題がある場合は、その数だけトピックブランチが作成する。

 

ブランチの切り替え

 作業するブランチを切り替えるにはチェックアウトという操作を行う。

 

HEAD

 HEADとは、現在使用しているブランチの先頭を表す名前。

デフォルトではmasterの先頭を表す。

 

stash

 まだコミットしていない変更内容や新しく追加したファイルが、インデックスやワークツリーに残ったままで、他のブランチへのチェックアウトを行うと、その変更内容は元のブランチから、移動先のブランチへ移動。

しかし移動先のブランチで、同じファイルが既に何かの変更が行われている場合はチェックアウトに失敗する。この場合は、変更内容を一度コミットするか、またはstashを使って一時的に変更内容を退避させてからチェックアウトいないといけない。
stashとは、ファイルの変更内容を一時的に記録しておく事です。ワークツリーとインデックス中でまだコミットされていない変更を一時的に退避が可能。退避させた変更は後から取り出して、元のブランチや別のブランチに反映すること可能。
 
ブランチの統合

 作業完了したトピックブランチは、最終的に統合ブランチに統合する。

統合方法は二つ。

merge、rebaseの2種類。

図のようにmasterブランチから分岐するabcブランチがある。

 

merge

 

f:id:mkyosuke:20191220210151p:plain

abcブランチをmasterブランチにマージ。

masterブランチの状態が以前から変更ないなら、簡単にマージ可。

ファストフォワードができる。

ファストフォワードとは、違うブランチと、競合防ぐためマージをする直前に最新のdevelopからプルをする事

実行後

f:id:mkyosuke:20191220210645p:plain

しかし、masterの履歴がabcを分岐したときより進んでしまった場合。

これは、masterの変更内容とabcの変更内容を1つにまとめる必要アリ。

f:id:mkyosuke:20191220211343p:plain

 そのため、両方の変更を合算したマージコミットが作成する。

 

f:id:mkyosuke:20191220211535p:plain



rebase

 merge例と同時にmasterから分岐するabcブランチがある。

f:id:mkyosuke:20191220211343p:plain

rebaseを使うと下の図に

f:id:mkyosuke:20191220212804p:plain

rebaseすると、abcの履歴が一本化する。

この時、移動するコミットXとYでは競合が発生する場合は、それぞれのコミットで発生した競合箇所を修正する必要あり。

rebaseしただけだと、masterの先頭の位置はそのまま。そのため、masterからabcをマージして、abcの先頭まで移動させる。

  

f:id:mkyosuke:20191220212913p:plain


・merge
変更内容の履歴はそのまま残るが、履歴が複雑になる。
・rebase
履歴は単純になるが、元のコミットから変更内容が変更される。そのため、元のコミットを動かない状態にしてしまうことがある。

  • トピックブランチに統合ブランチの最新のコードを取り込む場合はrebaseを使う
  • 統合ブランチにトピックブランチを取り込む場合は、まずrebaseしてからmerge