Git・GitHub・もう一歩先へ

ブランチ——本番をこわさずに試す

「大きく作りかえたいけど、いま動いているものは壊したくない」を叶えるのがブランチです。枝を分けて試し、うまくいったら合流させる——作り方から合体(マージ)、コンフリクトの直し方までまとめました。

「デザインを大きく作りかえたい。でも今の見た目も残しておきたい」——このときに使うのがブランチです。作業の流れを枝分かれさせて、元の状態をこわさずに試せます

ブランチは「作業の枝」

いま作業している枝には、たいていmainという名前がついています。ここから枝を分けると、こうなります。

main       ●──●──●            ← いつでも動く状態を保つ
                └──●──●       ← 新デザインを試す枝

枝の中で何をしてもmain側は無傷です。うまくいったら合流させ、失敗したら枝ごと捨てられます。

枝を作って移る

作ると同時にその枝へ移るには、-c(create=作る)を付けます。

git switch -c new-design

これでnew-designという枝ができ、いまそこにいる状態になりました。確かめてみます。

git branch
* new-design
  main

*が付いているのがいま自分がいる枝です。この状態でファイルを編集してコミットすると、記録はnew-design側にだけ積まれます。

元の枝に戻るときは-cなしです。

git switch main

戻ったとたん、エディタのファイルの中身も元の状態に切り替わります。はじめて見ると驚きますが、これが正しい動きです。枝を移ると、Gitがフォルダの中身をその枝の状態に入れかえてくれます。

合流させる:git merge

枝での作業が固まったら、mainに合流させます。合流させたい側(main)に移ってから実行するのがポイントです。

git switch main
git merge new-design

これでnew-designでの変更がmainに取りこまれました。役目を終えた枝は削除できます。

git branch -d new-design

コンフリクト(衝突)が起きたら

mainと枝の同じ行を両方で変えていると、Gitは「どちらを残すか決められない」と言ってきます。これがコンフリクトです。

該当のファイルを開くと、こんな目印が書きこまれています。

<<<<<<< HEAD
<h1>しまちゃんのページ</h1>
=======
<h1>しまちゃんの自己紹介</h1>
>>>>>>> new-design
  • <<<<<<< HEADから=======まで——いまの枝(main)の内容
  • =======から>>>>>>>まで——合流させようとしている枝の内容

やることは単純です。残したい形に手で書き直して、目印の3行を消す

<h1>しまちゃんの自己紹介</h1>

あとは、いつもどおり記録すれば解決です。

git add index.html
git commit -m "見出しの文言を統合"

GitHubで合流させる:プルリクエスト

チームで開発するときは、枝を手元で合流させず、GitHubに枝ごとpushしてプルリクエスト(合流の申請)を出します。

git push -u origin new-design

pushするとGitHubの画面に「Compare & pull request」というボタンが出ます。押して申請を作ると、変更内容を1行ずつ見比べながら他の人に確認してもらえるようになります。承認されたら、GitHubの画面上のボタンでmainに合流します。

ひとりで作っていても、プルリクエストを使うと「自分の変更を見返す機会」になるので、練習しておく価値はあります。

いつブランチを使う?

  • 大きな作りかえを試すとき——失敗してもmainは無傷
  • 人と分担するとき——同じファイルを同時に触っても、後で合流できる
  • ひとりの小さな修正——枝を作らずmainで作業しても構いません

まずは「大きく変えるときだけ枝を作る」くらいの気持ちで十分です。

このレッスンのまとめ

  1. ブランチは作業の枝分かれgit switch -c 名前で作って移り、git switch mainで戻る
  2. 合流は、合流先に移ってからgit merge 枝の名前
  3. コンフリクトは質問。目印の間を残したい形に書き直してaddとcommitで終わり

よくある質問

ブランチとは何ですか?
作業の枝分かれのことです。今の状態をそのまま残したまま別の枝で自由に試し、うまくいったら元の枝に合流させられます。
git switchとgit checkoutはどちらを使うべき?
ブランチの切りかえならgit switchがおすすめです。checkoutは切りかえ以外にもいろいろな役目を持つ多機能なコマンドで、まちがえやすいため役割ごとに分けたswitchが後から用意されました。
コンフリクト(衝突)が起きたらどうすればいいですか?
同じ行を両方で変えたときに起こります。Gitが目印を書き込んだファイルを開き、残したい形に手で書き直してから、addしてcommitすれば解決です。