11.1 Gitのブランチ
Gitのブランチ(branches)操作は、バージョン管理の鍵となるアスペクトの一つで、一つのリポジトリで複数の開発ラインを並行して進めることができるようにしてくれるんだ。ブランチ化は、Gitを共同作業や実験、プロジェクトのさまざまなバージョン管理において強力なツールにしてくれるんだよ。
Gitのブランチをフォルダのように考えることもできるんだよ。Gitはプロジェクトをコピーするんだ。プロジェクトのメインフォルダが ローカルリポジトリ内に masterとして存在するんだけど、Gitはそれのコピーを作ってくれる。だからそこで実験しても、 メインのちゃんと動くコードを壊すことなく進めることができるんだ。こういうコピーしたフォルダをブランチ—branchesって呼ぶんだ。
ブランチっていうのは、コードの別の選択肢みたいなものだよ。例えば、大きなプロジェクトで何かを変えてみたい、あるいは 実験したいけど、それに自信がないとき、どうやってGitを使わずにやってみる?
プロジェクトを新しいフォルダにコピーして、そこで全部を試してみるのもいいさ。結果が気に入ったら、 それをメインフォルダにコピーすればいいし、気に入らなければ、そのまま忘れるか、削除しちゃえばいいよ。
日常生活から例をとってみよう。例えば、本を書くことね:
- 本の原稿がある(メインブランチ)。
- 結末を変えてみたい(新しいブランチを作成)。
- 新しい結末を別のドキュメントに書く(新しいブランチで作業)。
- 新しい結末の方が良かったら、原稿の古い結末を置き換える(ブランチのマージ)。
- 新しい結末のドキュメントを削除する(ブランチを削除)。
11.2 ブランチの作成
IntelliJ IDEAでブランチを作成するのは本当に簡単だよ:
ブランチの名前を入力してね:
IntelliJ IDEAはすぐに現在のブランチの名前をメニュー上に表示するよ:
それまでそこには何があったと思う?
そこには最初のメインブランチ—masterの名前が表示されてたんだ。
今はそこにtestと表示されているね。つまりGit(IntelliJ IDEAを通して)が新しいブランチを作成しただけでなく、すぐにそのブランチに切り替えたってことさ。
さあ、今のブランチ(test)でmain.htmlに何かコードを書いてコミットしようか:
11.3 ブランチ間の切り替え
ステップ1. ブランチを選択。
さて、今度は古いブランチに切り替えてみよう。メニューをクリックしてみると、何が見える?
心配しないで—これはシンプルだよ:
Local — これはローカルgitリポジトリのブランチリストだよ。ここには2つあるね:
- test
- master
Remote — これはGitHub上にあるリモートリポジトリなんだ。ここに変更をプッシュしているけど、新しい ブランチはないね。リモートリポジトリの名前はoriginで、そこにはmasterブランチだけがあるよ。
Recent — これは最近作業したブランチ名のリストだよ:IntelliJ IDEAが便利でスピードを求めるユーザーのために追加してくれるんだ。
ローカルリポジトリの名前の右側のorigin/master — 現在同期しているリモートリポジトリの名前で、そこに変更がプッシュされるんだ。
ステップ2. ブランチコードを現在のフォルダにダウンロード。
ステップ3. 確認。
今見えているブランチは「master」で、古いコードがあるね:
11.4 ブランチをマージする
では、今度は2つのブランチのコードを統合してみよう。
ステップ1. まず、プロジェクトにもう一つファイルを追加しよう—index.htmlを作って、そこに何かコードを書こう:
- ファイルindex.htmlを作成
- そこにコード <h1>Hello</h1> と書く
- ファイルをコミット
私のmasterブランチの2つのファイルはこんな感じ:
ステップ2. ブランチをマージする。
現在のブランチ(master)にtestブランチで行われた変更を取り込もう。
これを行うには、メニューを使って「Merge ‘test’ into ‘master’」コマンドを選ぶんだ:
ステップ3. 結果を確認する。
確認しよう:
- メニュー上にはまだmasterブランチが表示されているね
- 2つのファイルがある:index.htmlとmain.html
- main.htmlはtestブランチで追加されたコードを含んでいる
11.5 マージ時のコンフリクト
ブランチをマージする時に、コンフリクトが発生することがあるんだ。
異なるブランチで同じファイルを変更した場合、それを統合しようとするとコンフリクトが起こるかも。
テキストファイルのコンフリクト
Gitはとても賢いシステムで、ファイルの種類を理解するんだよ。異なる場所でテキストファイルを変更した場合は、 Gitは変更をそのファイルの適切な位置に配置してくれる(まるで人間がやるように)。
バイナリファイルのコンフリクト
でも、画像やドキュメントをどこかで修正した場合、Gitはそれらの部分を統合しようとはしないんだ:どのバージョンのファイルを残したいか選択させてくれるだけなんだよ。
手動でのコンフリクト解決
テキストファイルの同じ場所を変更した場合、Gitは正しい統合ができなくて、君にそれをやらせようとする:
こんな風に見えるよ:
何が見えるかな:
- 左にはmain.htmlのmasterブランチの内容がある
- 右にはmain.htmlのtestブランチの内容がある
- 中央にはIntelliJ IDEAが最終バージョンのコードを書くよう勧めてくれている(「>>」と「<<」ボタンをクリックして、どのファイルかからの変更を自動的に挿入できるよ)
私はmasterの方を採用して、手でコードを書き加えたんだ。こんな風になったよ:
11.6 変更履歴
他にも便利で面白いのが、どのファイルの変更履歴も「Show History」ボタンをクリックすることで見ることができるんだ。 それがどこにあるか見つけてみてね。
私のmain.htmlの変更履歴はこんな感じ:
説明:
-
左には特定のファイルの変更履歴があるよ:
- 新しい変更ほど上にあるし、古い変更ほど下にあるんだ
- また、ブランチのマージ履歴も表示されているよ
- 右には特定のコミットで行われた変更が表示されるんだ
GO TO FULL VERSION