【Git】ブランチ(branch)とは?新規作成や切り替え、merge方法
この記事からわかること
- Gitのブランチ(branch)とは?
- 切り替えと作成方法
- mergeの使い方とコマンドの種類
- コンフリクトの解消方法
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Gitのブランチ(branch)とは?
Gitのブランチ(branch)とはバージョン管理をしながら開発をしていく上での履歴の流れを表した機能です。主軸となるブランチにはあらかじめmasterというブランチ名がつけられており、開発者によって新規のブランチを作成することも可能です。
新規のブランチを作成すると主軸のブランチから枝分かれするようなイメージで繋がりを持っており、主軸と新規のブランチを最終的に併合(merge)させることも可能です。
ブランチは常に1つがアクティブになっており、アクティブになっているブランチ(HEADが指すブランチ)に対してコミットが記録されていきます。
ブランチの使い所
ブランチを枝分かれさせて開発できる使い所は「新規機能を追加したいけどうまくいかなかったらコミット履歴ごと無かったことにしたい」時です。
コミットの履歴はブランチごとに蓄積されていくので、エラー修正したブランチや機能改修したブランチなど目的ごとに分離させることも可能です。
ここからはよく使うブランチを操作するコマンドをまとめていきます。
アクティブになっているブランチを確認する
アクティブになっているgit branch
コマンドを使用します。ブランチには*
が先頭につきます。
$ git branch
* master
-v
でブランチの先端にあるコミットを確認できます。ブランチが複数ある場合でも以下のように全て表示されます。
$ git branch -v
* master 7cm64ga ログイン機能追加
test 7cm64ga ログイン機能追加
リモートブランチも含めて確認する
-a
でリモートブランチを含めた全てのブランチを確認できます。
$ git branch -a
* master
test
remotes/origin/master
ブランチを作成する
ブランチを作成するにはgit branch
の後に追加したいブランチ名を渡します。
$ git branch ブランチ名
ブランチを切り替える
ブランチを切り替えるにはgit checkout
コマンドを使用します。
$ git checkout ブランチ名
これでブランチが切り替わり、切り替わったブランチのHEADのコミットの内容が作業ツリーには表示されます。そのためブランチを切り替える際の注意点として、作業ツリーとステージングが一致している状態(変更がない状態)で行うのが基本です。
ブランチを切り替える時は、コミットしてから切り替えるようにすれば安心かもしれません。
checkoutで新規作成
checkout -b
でブランチを新規作成してそのブランチに切り替えることも可能です。
$ git checkout -b ブランチ名
ブランチを確認する
ブランチが複数に枝分かれしている場合はgit log --all --graph
コマンドを使用することで枝分かれしているコミット履歴をグラフで確認することが可能です。
$ git log --all --graph
* commit 8c2f5d9b77a1dc9baed26a4bf450e90339cdf211 (HEAD -> master)
| Author: USERNAME <USER EMAIL>
| Date: Sat Jul 1 14:24:49 2023 +0900
|
| READMEファイルに見出しの追記
|
| * commit ee546ed284b8cc3f57212c4dde5f05e4719494d0 (test)
|/ Author: USERNAME <USER EMAIL>
| Date: Sat Jul 1 13:58:36 2023 +0900
|
| README2ファイルを追加
|
* commit 19911ef886c93dcd5ba01b0030a5e82c0cc2705c
| Author: USERNAME <USER EMAIL>
| Date: Sat Jul 1 10:12:21 2023 +0900
|
| READMEファイルにタイトルの追記
|
* commit ec7d62b081c28a82768ed36ad26a75cc714c7fda
Author: USERNAME <USER EMAIL>
Date: Thu Jun 29 22:54:06 2023 +0900
READMEファイルの追加
ブランチをmergeする
枝分かれしていくブランチですが、基本的に主軸となるのはmaster
ブランチであり、他のブランチを最終的にmaster
ブランチへと併合(merge)させます。ブランチ同士をマージする際には新しいコミットが作成されます。
マージするには取り込みたいブランチをアクティブにする必要があるので、master
ブランチがアクティブになっていることを確認します。
$ git branch
* master
test
続いて併合したいブランチ名をgit merge
コマンドの後に渡して実行します。すると以下のようにコミットメッセージを入力を求められます。デフォルトで「Merge branch 'ブランチ名'」というコメントが入っているのでそのまま実行します。
$ git merge test
Merge branch 'test'
# Please enter a commit message to explain why this merge is necessary,
# especially if it merges an updated upstream into a topic branch.
#
# Lines starting with '#' will be ignored, and an empty message aborts
# the commit.
これで2つのブランチをマージすることができます。ですがこの際に同じファイルの同じ行同士が、別ブランチのコミットで変更されている場合はコンフリクトが発生してしまいます。
おすすめ記事:【Git】コンフリクトとは?解消/中止方法と発生原因
ブランチを削除する
不要になったブランチは-d
または-D
(強制)で削除することができます。その際には削除対象のブランチにHEAD
が載っていない状態で実行します。
$ git branch -d test
もし削除対象ブランチにマージされていないコミットがある場合は、削除は中止されますが、-D
の場合は強制的に削除されてしまうので注意してください。
BLM運動への配慮
GitHubにデフォルトで設定されているブランチ名「master
」が「Black Lives Matter」(BLM)運動への配慮により、主人と奴隷と意味につながる「master/slave」という言葉を極力使わないようにGitHubも2020年にブランチ名を「main」に変更するように動き出しているようです。以下コマンドでデフォルトのブランチ名を変更できます。
$ git config --global init.defaultBranch main
実際に練習してみる
では実際にブランチを切り替えて開発する流れを実践してみます。今回は「ROCKFES」というプロジェクトを作成し、その中に「ArtistList.txt」で出演アーティストを管理してみたいと思います。(勝手にアーティストの名前使ってすみません。。)またマージの際にコンフリクトが発生するようにしてみます。
- プロジェクトの作成&Gitの初期化
- ArtistList.txtの作成と編集
- ステージング&コミット
- ArtistList.txtに追記〜コミット
- 主ブランチを進める
- ブランチを切り替える
- pendingブランチを進める
- マージしてみる(コンフリクトの発生)
- コンフリクトを解消する
1.プロジェクトの作成&Gitの初期化
まずはプロジェクトを作成しGitの管理下に置きます。
$ mkdir ROCKFES
$ cd ROCKFES
$ git init
Initialized empty Git repository in /Users/username/Desktop/ROCKFES/.git/
2.ArtistList.txtの作成と編集
touch
コマンドで「ArtistList.txt」を作成し、中に内容を記述します。
$ touch ArtistList.txt
●ROCKFES 出演アーティスト
3.ステージング&コミット
ステージングとコミットを行います。
$ git add ArtistList.txt
$ git commit -m "ArtistListの作成"
[main (root-commit) 9e1867b] ArtistListの作成
1 file changed, 1 insertion(+)
create mode 100644 ArtistList.txt
4.ArtistList.txtに追記〜コミット
続いて「ArtistList.txt」を編集し再度、ステージング&コミットしておきます。
●ROCKFES 出演アーティスト
1.ONE OK ROCk
2.My First Story
$ git add ArtistList.txt
$ git commit -m "出演アーティスト2組の追加"
[main 851e662] 出演アーティスト2組の追加
1 file changed, 4 insertions(+), 1 deletion(-)
5.ブランチの作成
ここで新しいブランチを作成しておきます。ブランチ名は「pending」としておきました。ここでの想定はほぼ確定だけどスケジュール調整待ちみたいな感じです。(この想定がブランチを切り分ける意味)
$ git branch pending
$ git branch -v
* main 851e662 出演アーティスト2組の追加
pending 851e662 出演アーティスト2組の追加
この状態では2つのブランチが同じコミットを参照しています。
6.主ブランチを進める
ここでさらに出演が確定したアーティストが出たのでmain
ブランチを進めてみます。「3.Saucy Dog」を追記しました。
●ROCKFES 出演アーティスト
1.ONE OK ROCk
2.My First Story
3.Saucy Dog
ステージング&コミットです。
$ git add ArtistList.txt
$ git commit -m "Saucy Dogの追加"
[main bc5d1ec] Saucy Dogの追加
1 file changed, 2 insertions(+), 1 deletion(-)
これで今こんな感じです。main
は3つのコミット履歴を持つブランチに、pending
は2つのコミット履歴を持った状態です。
7.ブランチを切り替える
ここでブランチを切り替えてみます。
$ git checkout pending
Switched to branch 'pending'
この状態でワークツリーの「ArtistList.txt」を開いてみると2回目のコミット時の中身(以下のよう)になっています。
●ROCKFES 出演アーティスト
1.ONE OK ROCk
2.My First Story
8.pendingブランチを進める
ではこの状態で「ArtistList.txt」を編集していきます。
●ROCKFES 出演アーティスト
1.ONE OK ROCk
2.My First Story
3.Aimer
ステージング&コミットです。
$ git add ArtistList.txt
$ git commit -m "Aimerの追加"
[pending dd4425c] Aimerの追加
1 file changed, 2 insertions(+), 1 deletion(-)
ここで一度ブランチとコミットの状況を確認してみます。pending
ブランチが進んで枝分かれしているのが確認できます。
$ git log --all --graph --oneline
* dd4425c (pending) Aimerの追加
| * bc5d1ec (HEAD -> main) Saucy Dogの追加
|/
* 851e662 出演アーティスト2組の追加
* 9e1867b ArtistListの作成
9.マージしてみる(コンフリクトの発生)
ではmain
とpending
をマージしてみます。(Aimerの出演が確定しました)まずはブランチを主軸に切り替えてマージを実行します。
$ git checkout main
Switched to branch 'main'
$ git merge pending
Auto-merging ArtistList.txt
CONFLICT (content): Merge conflict in ArtistList.txt
Automatic merge failed; fix conflicts and then commit the result.
ここで「ArtistList.txt」を開いてみると以下のようにコンフリクトを起こしている箇所が分かるようになっています。コンフリクトがない場合はここで正常に完了し、2つの変更が併合されます。今回は同じ行部分(2.2.My First Storyの下側)を編集していたためコンフリクトが発生しています。
●ROCKFES 出演アーティスト
1.ONE OK ROCk
2.My First Story
<<<<<<< HEAD
3.Saucy Dog
=======
3.Aimer
>>>>>>> pending
ちなみにこの状態でgit status
をみると以下のような感じです。
$ git status
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: ArtistList.txt
no changes added to commit (use "git add" and/or "git commit -a")
10.コンフリクトを解消する
コンフリクトは手動で「ArtistList.txt」を書き換えて解消します。以下のように正しいファイルに書き換えたら、このファイルをステージングします。
●ROCKFES 出演アーティスト
1.ONE OK ROCk
2.My First Story
3.Saucy Dog
4.Aimer
これでコンフリクトが解消され2つのブランチをマージすることができました。最後に変更をコミットして完了です。
$ git commit -m "pendingのマージ"
[main 817afac] pendingのマージ
おすすめ記事:【Git】ローカルとリモートのブランチ名を変更する方法!
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。