Gitでブランチを切ってマージするまでを通しでやってみよう(総合演習)
ここまでの Git レッスンで学んだコマンドをひとつの流れにつないで、実務そのままの手順を最後までやり切ります。
やることは「ブランチを切る → 作業をコミットする → mainに戻ってマージする」。チーム開発で毎日繰り返される、いちばん基本の型です。この流れが手に馴染んでいるかどうかで、仕事の入り方がまるで変わります。
ページの一番下に本物の疑似ターミナルがあります。読むだけで終わらせず、必ず自分で打ってみてください。状態はコマンドをまたいで続くので、上から順に打てばそのまま完走できます。
完成イメージ
最後まで進むと、こう表示されるところまで作ります。下の実行結果は、このページを作るときに実際にコードを走らせて得たものです。
$ git log --oneline a860414 プロフィール欄を追加 $ git branch * main $ git status On branch main nothing to commit, working tree clean
STEP 1リポジトリを用意して状態を見る
🎯 このステップのゴール: git init で管理を始め、git status で今の状態を読む
まずgit initです。そのフォルダを「Gitが見張る場所」に変えるコマンドで、.gitという隠しフォルダが作られます。ここに履歴がすべて入ります。
次がgit status。Gitを使ううえで最も打つことになるコマンドです。迷ったらこれを打つ、というくらい基本で、「いまどのブランチにいて、何が変更されていて、何がコミット待ちか」を教えてくれます。
結果を見ると、index.html・style.css・app.jsの3つがmodified(変更済み)になっています。この演習では、あなたがエディタでこの3つを編集し終えた直後、という想定で始まります(疑似ターミナルにはエディタが無いため、最初から変更済みの状態にしてあります)。
大事なのはGitはまだ何も記録していないということです。変更を見つけてはいるものの、履歴に残すかどうかはこれからあなたが決めます。
git init git status
$ git init Initialized empty Git repository in /home/user/project/.git/ $ git status On branch main Changes not staged for commit: modified: index.html modified: style.css modified: app.js
STEP 2作業用のブランチを切る
🎯 このステップのゴール: mainを汚さずに作業する場所を作り、そこへ移動する
ここがこの演習の肝です。変更をいきなりmainにコミットしてもGitとしては動きますが、実務ではまずやりません。
理由はmainが「いつでも動く状態」であるべきだからです。作りかけのものを直接入れてしまうと、他の人がそれを取り込んだ瞬間に壊れます。だから作業ごとに別のブランチを切って、完成してから合流させます。
git branch feature/profileで枝を作り、git checkout feature/profileでそこへ移動します。作っただけでは移動しません——ここは最初によく間違えるところです。git checkout -b feature/profileと書けば作成と移動を一度にできます。
ブランチ名のfeature/は慣習です。feature/は新機能、fix/は不具合修正、というように頭に種類を付けておくと一覧が読みやすくなります。
git branchで確認すると、*が付いているのが今いるブランチです。
git branch feature/profile git checkout feature/profile git branch
$ git branch feature/profile $ git checkout feature/profile Switched to branch 'feature/profile' $ git branch main * feature/profile
STEP 3変更をステージに乗せる
🎯 このステップのゴール: git add で「これをコミットする」と選ぶ
ブランチを移っても変更はついてきます。git statusを打つと、さっきと同じ3ファイルが変更済みのまま見えるはずです。
ここでgit add .を打ちます。.は「今のフォルダ以下すべて」の意味です。
Gitに独特なのがステージ(索引)という考え方です。他の多くのツールは「変更したもの=記録するもの」ですが、Gitは間に一段はさみます。「変更したもの」の中から「今回コミットするもの」を選べるのです。
これのおかげで、5ファイル直したけれど関連する2つだけを先にコミットするといったことができます。コミットを意味のある単位に保てるので、後から履歴を読む人が助かります。
git addのあとgit statusを打つと、表示が「Changes to be committed(コミット予定)」に変わります。ここまで来て初めて、コミットの準備が整った状態です。
git status git add . git status
$ git status On branch feature/profile Changes not staged for commit: modified: index.html modified: style.css modified: app.js $ git add . $ git status On branch feature/profile Changes to be committed: new file: index.html new file: style.css new file: app.js
STEP 4コミットして履歴に刻む
🎯 このステップのゴール: メッセージを付けて記録し、git log で確かめる
git commit -m "プロフィール欄を追加"で記録します。ここで初めて履歴に残ります。
-mはメッセージです。省略するとエディタが開くので、短いものは-mで付けるのが普通です。
メッセージの書き方は、後で効いてきます。「修正」「更新」とだけ書かれた履歴が並んでいても、半年後の自分には何も伝わりません。「何をしたか」が一目で分かる粒度——たとえば「プロフィール欄を追加」——にしておくと、git logがそのまま作業の記録になります。
git log --onelineで履歴を1行ずつ見られます。先頭に出ている7桁の英数字がコミットIDで、この変更のかたまりを指す名前です。あとで「この時点に戻したい」というとき、このIDを使います。
コミットIDは毎回変わります。このページに載っているIDと、あなたが打ったときのIDは一致しません。内容と時刻から作られるものなので、それで正常です。
git commit -m "プロフィール欄を追加" git log --oneline
$ git commit -m "プロフィール欄を追加" [feature/profile a860414] プロフィール欄を追加 3 file(s) changed $ git log --oneline a860414 プロフィール欄を追加
STEP 5mainに戻して合流させる
🎯 このステップのゴール: git merge で、作業ブランチの成果をmainに取り込む
作業が終わったのでmainに合流させます。ここで順番が大事です。
まずgit checkout mainで受け入れる側へ移動し、それからgit merge feature/profileを打ちます。マージは「今いるブランチに、指定したブランチを取り込む」動きをするので、移動を忘れると逆向きに取り込んでしまいます。ここはGitで最も間違えやすいところのひとつで、「どっちに取り込むんだっけ」と迷ったら「今いる場所が受け皿」と覚えてください。
マージが済んだらgit log --onelineを打ってみてください。さっきfeature/profileで作ったコミットが、mainの履歴にも現れています。これが合流できたということです。
実務ではこのあとgit pushでリモートに送り、GitHubなどでプルリクエストを出してレビューを受けます。そこまで含めて1本の流れです。
git checkout main git merge feature/profile git log --oneline
$ git checkout main Switched to branch 'main' $ git merge feature/profile Merge made by the 'ort' strategy. feature/profile -> main に統合しました $ git log --oneline a860414 プロフィール欄を追加
STEP 6後片付けをして完了
🎯 このステップのゴール: 役目を終えたブランチを削除し、きれいな状態で終える
マージが済んだfeature/profileは、もう役目を終えています。残しておくとブランチ一覧が増えていくだけなので消します。
git branch -d feature/profileの-dは delete です。小文字の-dは「マージ済みなら消す」という安全な削除で、まだ合流していないブランチを消そうとするとGitが止めてくれます。大文字の-Dは強制削除で、これは確認なしに消えるので普段は使いません。
最後にgit statusとgit branchで締めます。「working tree clean(変更なし)」で、ブランチがmainだけ——これが1つの作業を終えたときのあるべき姿です。
これで完走です。ブランチを切る → コミット → マージ → 片付け。この4つが回せれば、チーム開発の入口は越えています。
ページ下の疑似ターミナルで、ここまでを最初から自分の手で通してみてください。読んで分かるのと打てるのは、別物です。
git branch -d feature/profile git branch git status
$ git branch -d feature/profile Deleted branch feature/profile $ git branch * main $ git status On branch main nothing to commit, working tree clean
仕上げ自分で最初から打ってみよう
🎯 このステップのゴール: ここまでの流れを、自分の手で最後まで通す
下は本物の疑似ターミナルです。まっさらな状態から始まるので、STEP1のコマンドから順に打って、マージまで辿り着いてください。読んで分かった気になるのと、自分で打てるのとは別物です。
詰まったら上のステップに戻って構いません。resetと打てば最初からやり直せます。
よくある質問
コンフリクト(競合)が起きたらどうするんですか?
同じ行を2人が別々に直していると、Gitはどちらを採用すべきか判断できずコンフリクトになります。ファイルに両方の変更が印付きで書き込まれるので、人間が正しい形に直してからgit addしてgit commitします。
怖がられがちですが、やることは「どちらを残すか決める」だけです。こまめにマージしておくほど、競合は小さくなります。
mainに直接コミットしてはいけないんですか?
ひとりで書き捨てのものを作るなら構いません。ただチームで開発するなら避けます。作りかけのものがmainに入ると、それを取り込んだ全員の手元が壊れるからです。
多くの現場ではmainへの直接コミットを設定で禁止し、プルリクエスト経由でしか入れられないようにしています。この演習の流れは、そのまま実務の型です。
コミットIDがページと違います
それで正常です。コミットIDは内容と時刻から計算されるので、打つたびに別のものになります。このページに載っているIDは、生成時に実際に実行して得たものをそのまま載せているだけで、あなたの手元と一致する必要はありません。
🚩 次はこのカテゴリへ
Gitが扱えるようになったら、次はその下にあるコマンドラインです。ファイルを探す、ログを読む、権限を直す——Gitを使う場面では必ず同じ黒い画面を触ることになります。Linuxカテゴリでは、その基本の操作を疑似ターミナルで練習できます。
Linux/シェルのレッスンへ進む