はじめに
実務でGitHubを使った開発業務に携わる機会がありそうなので、改めて基本的な知識をおさらいしたいと思い学習しました。
ここでは実務でGitHubを使う機会がある方が最低限使うであろう内容をまとめています。
また、具体的なLinuxコマンドの説明等は省略していますので、ご了承ください。
前回の続きから始めます。
今回やりたいこと
・ブランチの作成と切り替え
・コミットの整理
・コンフリクトの解消方法
環境
・Mac OS Sequoia(15.7.7)
・Git(2.39.5)
実装
1. 前準備
まずは、今回学ぶブランチについて確認していきます。
ブランチとは、コミットを指すポインタ(目印)です。
Gitでは、ブランチごとに変更履歴を管理できるため、複数人で本番環境や開発環境などを分けながら並行して開発を進められます。
また、機能追加やバグ修正ごとにブランチを作成し、他の開発へ影響を与えずに作業を進められるのがメリットです。
まずは、作業用のフォルダを新規に作成して、ブランチを作成してみます。
・作業用フォルダの作成から、Gitの初期化をしていきます。
$ mkdir study_branch
$ cd study_branch
$ git init
Initialized empty Git repository in /Users/tsuburayatakumi/Qiita/study_branch/.git/
・ファイルを作成し、コミットしていきます。
$ echo "this is test1" >> test1.txt
$ echo "this is test2" >> test2.txt
$ git add .
$ git commit -m "first commit"
[main (root-commit) 14b87f0] first commit
2 files changed, 2 insertions(+)
create mode 100644 test1.txt
create mode 100644 test2.txt
・今いるブランチを確認します。
$ git branch
* main
2. ブランチの作成
・「test」ブランチを作成してみます
# test ブランチを作成
$ git branch test
# testブランチが表示されること
$ git branch
* main
test
"git branch" の出力の main の頭に「*」がついているのを確認できます。これは実際に今いるブランチを指し示しており、今は mainブランチにいることを示しています。
・ブランチを切り替えてみます
# test ブランチにスイッチ
$ git switch test
Switched to branch 'test'
# test ブランチにスイッチしていること
$ git branch
main
* test
ここで、testブランチ上でファイルをコミットしたらどうなるでしょうか?やってみます。
・ファイルを作成しコミット
$ echo "this is test3" >> test3.txt
$ git add test3.txt
$ git commit -m "add test3.txt"
・ログの確認
$ git log
commit 3b1c6b31aaa7c8c258b4cbb33223ee090236f313 (HEAD -> test)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jun 25 15:16:58 2026 +0900
add test3.txt
commit 14b87f02f2b5b7faaf27df52cc3810e9b62c68e5 (main)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jun 25 14:30:50 2026 +0900
first commit
上記のように、test3.txt をコミットした時のコミットIDに注視してみてみると
commit 3b1c6b31aaa7c8c258b4cbb33223ee090236f313 (HEAD -> test)
上記のようにHEADがtestを指し示しているのが確認できます。ここで出てきた「HEAD」は、現在チェックアウトしているブランチ(またはコミット)を指すポインタのことです。
・test、mainブランチの差分を見てみます
$ git diff test main
diff --git a/test3.txt b/test3.txt
deleted file mode 100644
index fe11297..0000000
--- a/test3.txt
+++ /dev/null
@@ -1 +0,0 @@
-“this is test3”
git diff test main は、testブランチとmainブランチの差分を表示するコマンドです。
差分は、testブランチの状態からmainブランチの状態へ変更する場合に、どのような変更が必要になるかという向きで表示されます。
今回は、testブランチには test3.txt が存在しますが、mainブランチには存在しません。そのため、testブランチをmainブランチと同じ状態にするには、test3.txt を削除する必要があることが表示されています。
(補足) その他ブランチ操作系のコマンド
・testブランチを作成したのちにtestブランチに切り替え
$ git switch -c test
・ブランチを削除したいとき
# mainブランチにマージ済みである場合
$ git branch -d test
# mainブランチへマージ済みでない場合(強制削除)
$ git branch -D test
3. ブランチ履歴の整理
次に、複数のコミットを1つにまとめて、コミット履歴を整理する方法を学んでいきます。
まず今回やりたい事の簡単なイメージ図です。
今回は、feature(HEAD)とHEAD~1をまとめてみます。
・featureブランチと作業用ファイルを作成します
$ git switch -c feature
Switched to a new branch 'feature'
$ touch feature.txt
・下記のように、コミットをしていく
$ git log
commit aa36add84f8414ef97e9e5e2bce19cfa4c50b605 (HEAD -> feature)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Tue Jun 30 11:23:09 2026 +0900
commit 3
commit 287755237e02a361100d1c99544b7c0a91747581
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Tue Jun 30 11:22:14 2026 +0900
commit 2
commit 47d810aa8b0cd495c8595953fdc9bcf9b1aa1111
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Tue Jun 30 11:15:29 2026 +0900
commit 1
・直近2件のコミットを対象に、変更内容とコミットメッセージを1つにまとめます。
$ git rebase -i HEAD~2
pick 2877552 commit 2
pick aa36add commit 3
(省略)
下記のように編集します。
pick はそのコミットをそのまま残すことを意味します。
squash は直前のコミットへ変更内容とコミットメッセージをまとめることを意味します。
pick 2877552 commit 2
squash aa36add commit 3
(省略)
・ログを確認し、コミット二つ前のコミットメッセージが一つにまとまっていることを確認
$ git log
commit e40d4bdc098e4e991e6faab78d5cf22ee600e3b1 (HEAD -> feature)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Tue Jun 30 11:22:14 2026 +0900
commit 2
commit 3
commit 47d810aa8b0cd495c8595953fdc9bcf9b1aa1111
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Tue Jun 30 11:15:29 2026 +0900
commit 1
また、コミットIDが変更されている点にも注目してください。
rebase はコミットを作り直すため、変更内容は同じでもコミットIDは新しくなります。
4. コンフリクトの解消方法
次は、コンフリクトの解消方法について学んでいきます。
同じファイルの同じ箇所を複数のブランチで変更した場合、Gitがどちらの変更を採用すればよいか判断できず、コンフリクトが発生することがあります。
今回は、実際にコンフリクトを発生させ、競合箇所を確認したうえで解消するまでの流れを確認します。
下記のようにブランチmain、feature-a、feature-bブランチを作成し、実際にコンフリクトを起こしてみます。
その上で、それぞれのブランチでコミットしていき、実際にコンフリクトを解消していきます。
・mainブランチにsample.txtファイルを作成し、コミット。
$ cat sample.txt
Initial sample file
$ git log
commit a7f23e4000ca30b7fee3beb0cfd4ff16ba2e8fc7 (HEAD -> main)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 14:54:06 2026 +0900
first commit
・feature-a、feature-bブランチを作成
$ git branch
feature-a
feature-b
* main
・feature-aにスイッチして、sample.txtを下記のように修正し、コミットを実施
$ cat sample.txt
Initial sample file
Hello, world
$ git log
commit d072dbb550ff41076a0ac73d87d2edc722e57b99 (HEAD -> feature-a)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 15:07:27 2026 +0900
this is feature-a commit
commit a7f23e4000ca30b7fee3beb0cfd4ff16ba2e8fc7 (main, feature-b)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 14:54:06 2026 +0900
first commit
・feature-bにスイッチして、sample.txtを下記のように修正し、コミットを実施
$ cat sample.txt
Initial sample file
Hello, Git
$ git log
commit b94f43f6cc5a147c9c75265b5cff214e82aa88a0 (HEAD -> feature-b)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 15:10:23 2026 +0900
this is feature-b commit
commit a7f23e4000ca30b7fee3beb0cfd4ff16ba2e8fc7 (main)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 14:54:06 2026 +0900
first commit
・mainブランチに切り替え、feature-aブランチの内容をマージ
$ git merge feature-a
Updating a7f23e4..d072dbb
Fast-forward
sample.txt | 1 +
1 file changed, 1 insertion(+)
$ git log
commit d072dbb550ff41076a0ac73d87d2edc722e57b99 (HEAD -> main, feature-a)
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 15:07:27 2026 +0900
this is feature-a commit
commit a7f23e4000ca30b7fee3beb0cfd4ff16ba2e8fc7
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 14:54:06 2026 +0900
first commit
・同じくmainブランチ上でfeature-bブランチの内容をマージし、コンフリクトの発生を確認
$ git merge feature-b
Auto-merging sample.txt
CONFLICT (content): Merge conflict in sample.txt
Automatic merge failed; fix conflicts and then commit the result.
feature-aをマージ後、feature-bをマージした時にコンフリクトがおきました。
実際にどこにコンフリクトが起きているのかみていきましょう。
・sample.txtファイル内を確認
$ cat sample.txt
Initial sample file
<<<<<<< HEAD
Hello, world
=======
Hello, Git
>>>>>>> feature-b
上記のように"Initial sample file"の次の行でコンフリクトが起きています。
"Hello, world" は現在作業している main ブランチ(HEAD)の内容、"Hello, Git" はマージ対象である feature-b ブランチの内容を示しています。
今回はfeature-bの内容を取り込みたいので、不要な部分を削除していきます。
・sample.txtを下記のように修正
$ cat sample.txt
Initial sample file
Hello, Git
・修正した内容をステージングし、コミットを実施
$ git add sample.txt
$ git commit -m "コンフリクトの解消"
$ git log
commit 2c23c7e845b977e4706e8648d3235f6ff6510088 (HEAD -> main)
Merge: d072dbb b94f43f
Author: tsumuraya_takumi <XXXXXXXX@XXXXX>
Date: Thu Jul 9 15:33:24 2026 +0900
コンフリクトの解消
(省略)
学んだこと
・ブランチはコミットを指すポインタであり、並行開発を行うための重要な仕組みであること
・rebase -i を使うことで、複数のコミットを1つにまとめて履歴を整理できること
・同じファイルの同じ箇所を変更するとコンフリクトが発生すること
・コンフリクト発生時は競合箇所を確認し、不要なマーカーを削除したうえで git add、git commit を行うことで解消できること
今後やりたいこと
・リモートリポジトリを使った開発
・プルリクエストの方法
まとめ
今回は、Gitのブランチ操作、コミット履歴の整理、コンフリクトの解消方法について学習しました。
ブランチを利用することで、mainブランチに直接影響を与えずに機能追加や修正作業を進められます。
また、rebase -i を使うことで、作業中に細かく分かれたコミットを整理できます。
今回学習した内容は、Gitを利用したチーム開発では頻繁に利用する基本操作です。
次回はGitHubのリモートリポジトリやPull Requestを利用した、より実践的な開発フローについて学習していきたいと思います。

