# Git 応用編(学習日 9/9) ## ブランチ 1. ブランチとは 同一ファイルを複数名が同時に編集できるよう、保存する履歴を分岐して記録する仕組み。作業者固有のブランチ(トピックブランチ)を作成し、終了時にメインのブランチ(統合ブランチ)に保存・マージを行う。 2. ブランチの種類 * 統合ブランチ  トピックブランチが統合され、いつでもリリースが可能なブランチ。トピックブランチの内容が逐一統合ブランチに保存される。 デフォルトで作成される統合ブランチはmasterブランチと呼ぶ。 * トピックブランチ 開発担当者が個別に作成する作業用のブランチ。統合ブランチから分岐して新たに作成するため、トピックブランチの変更内容は、直ちには統合ブランチに影響を与えない。 作業が完了して統合ブランチに取り込みマージする作業を経て、初めて統合ブランチに反映される。 3. ブランチの切り替え a. チェックアウトを行う。(git checkout ブランチ名) チェックアウトを行うと、切替先のブランチ内の最後にコミットした内容がワークツリーに展開される。以降は切替先のブランチでコミットを行う。 b. HEAD 現在使用しているブランチの先頭を表す。(デフォルトではmaster) 頻繁に移動し、使用するブランチはHEADを使い管理する。 c.stash 未コミットや新規ファイルがワークツリーに残ったままチェックアウトを行うと、 変更内容が一時退避領域のstash領域に移動し、破棄を防ぐ仕組み。 但し、切替先のブランチで同じファイルが既に何らかの変更が行われている場合はチェックアウトに失敗する。 4. ブランチの統合 a. マージ(merge)を利用する場合(git merge トピックブランチ名) (1)統合ブランチの内容が、分岐前から変更無い場合 統合したいトピックブランチのコミット内容をそのまま反映する。(fast-fowardマージ) (2)統合ブランチの内容が、分岐前から変更されている場合 トピックブランチ内でコミットされた変更処理全てを一つにまとめ、統合ブランチの先頭にコミットする。(non fast-fowardマージ) 変更内容の履歴はそのまま残るが、履歴が複雑になる。 b. リベース(rebase)を利用する場合(git rebase 統合ブランチ名) 統合ブランチの先頭から、トピックブランチでの変更内容を反映する。 履歴が単純になる一方、内容が元のコミットから変更されてしまい、競合が発生する可能性がある。 5. ブランチとファイル移動 * pull ローカルリポジトリにプルを行う場合も、自動的にマージコミットが実行される。 * fetch リモートリポジトリ内の内容のみを取得したい場合(マージ不要)の際に利用する。 * push pushしたブランチがfast-fowardマージできるようにしなければならない。(競合は拒否される) また、pushは明示的に行ったときにのみ実行される。 6. タグ * git tag タグ名 :タグをつける。 * git tag -a(m) タグ名 :注釈付き(コメント付き)タグをつける。 * git tag -n :タグ内容の表示 * git tag -d タグ名 :タグを削除する。 7. その他の応用 * git commit --amend :直前のコミットを修正する。 * git revert HEAD :過去のコミットを打ち消す。 * git reset --hard HEAD :過去のコミットを捨てる。 * git cherry-pick コミット名 :他ブランチからコミットを抜き取る。 * git rebase -i :コミットの履歴を書き換える。 * git merge --squash :ブランチ上のコミットを一つにまとめた上でマージを行う。 8. プルリクエストとは ローカルリポジトリでの変更内容を、他の開発者(主にレビュー・マージ担当)に通知する機能である。 ソースコードの変更箇所を明示し、レビューを行いやすくする。また、コメントのやり取りも行え、レビューの伝達・反映が素早く行える。 GitHubのCompare&Pullrequestの項目から伝達を行える。 ###### tags: `Git`