このブログ記事では、Gitにおけるブランチの概念を紹介します。

前回の記事では、変更のステージングとコミットの方法について説明しましたが、コミット間を移動したり、変更を元に戻したりしたい場合が多くあります。 この記事では、コミットを元に戻す方法と、ブランチを使用してコミットを管理する別の方法を紹介します。
コミットを元に戻す
コミットを元に戻す方法は基本的に3つあります:checkout、revert、resetです。checkoutは、コミットを読み取り専用モードで閲覧する場合に実行され、
git checkout <id>
で実行できます。最新バージョンに戻るには、git checkout <branch-name>
を使用します(ブランチについては後述します)。
この方法はコミット履歴を変更しないため、コミット履歴を確認する最も安全な方法です。
revertは、指定されたコミット以降の変更を元に戻す新しいコミットを実行し、その後の変更をコミット履歴に残したまま以前の状態に戻します。
revertはgit revert <id> -m "<message>"
で実行でき、実行の後git log
で変更を元に戻す新しいコミットが作成されたことを確認できます。
最後の方法であるresetは、git reset <id>
を使用して指定されたコミット以降のコミットを削除します。コードの変更はテキストエディタに残りますが
(新しいコミットとしてステージングやコミットが可能)、変更を永続的に削除する危険な方法です。そのため、resetコマンドを使用する際は注意が必要です。
ブランチ
これまではmain
(またはmaster
)ブランチでのみ作業してきましたが、新機能の開発や他の開発者との協力時にメインのコードベースに重要な変更を加えることを避けるため、
複数のブランチを作成することができます。以下の図は、メインブランチで安定した作業用コードベースを維持しながら、機能を開発する方法を示しています。

新機能が正しく実装されたことを確認する前に、新しい機能ブランチを作成してその中で作業することができます。新機能が正常に実装され(テストされ)た後、
機能ブランチをメインブランチにマージすることができます。新しいブランチを作成するには、git branch <branch-name>
を使用します。
ブランチを作成した後、git branch -a
でブランチのリストを確認し、git checkout <branch-name>
で切り替えることができます。
または、git checkout -b <branch-name>
で新しいブランチを作成して移動することもできます。
例として、c.txt
ファイルを追加するためにc-txt
という新しいブランチを作成してみましょう。git checkout -b c-txt
でc-txt
を作成して切り替えた後、
c.txt
を追加、git add .
でステージングを行い、git commit
でコミットを作成できます。これにより、c-txt
ブランチに新しいコミットが正常に作成されるはずです。
git checkout main
でメインブランチを表示することで、変更がc-txt
ブランチ内でのみ適用されていることを確認できます。
ブランチのマージ
c.txt
がエラーや望ましくない動作を引き起こさないことを確認した後、c-txt
ブランチをmain
ブランチにマージすることができます。
そのためには、main
ブランチに切り替えてgit merge c-txt
を呼び出します。その後状態を確認すると、
c.txt
がmain
ブランチに正常に追加されていることを確認できるはずです。新しいファイルを追加したり、このように、
既存のファイルにテキストを追加したりするだけの新しいブランチをマージする場合は問題ありません。しかし、main
で既存のテキストを編集したブランチをマージする場合、
マージコンフリクトが発生します。
例えば、a-txt
という新しいブランチを作成し、a.txt
の最初の行に"Hello World!"を追加するとします。
そして、Gitについての理解が乏しい誰かがmain
ブランチで直接a.txt
の最初の行に"Hi!"を追加したとします。
このような状況でa-txt
をmain
ブランチにマージしようとすると、
Gitはa.txt
の最初の行のコンフリクトをどのように解決すべきか判断できず、マージが失敗します。
マージコンフリクトが発生した場合、それを解決して新しいコミットを作成する必要があります。例えば、"Hi!"を残し、
"Hello World!"を次の行に移動することでコンフリクトを解決できます。これらの変更を加えた後、git add <filepath>
でステージングし、
コミットを作成します(Gitが自動的にMerge branch <branch-name>
をコメントとして追加するため、
メッセージは不要です)。その後、git log
を表示することで、コンフリクトが解決され、ブランチが正常にマージされたことを確認できます。
結論
この記事では、コミットを元に戻す3つの方法、ブランチの概念、およびプロジェクトを適切に管理するためのブランチの使用方法を紹介しました。 これでGitの主要な機能を理解できたので、次の記事ではGitHubについて説明します。
リソース
- Net Ninja. 2018. Git & GitHub Tutorial for Beginners #7 - Undoing Things. YouTube.
- Net Ninja. 2018. Git & GitHub Tutorial for Beginners #8 - Branches. YouTube.
- Net Ninja. 2018. Git & GitHub Tutorial for Beginners #9 - Merging Branches (& conflicts). YouTube.