【Git】ブランチ(branch)とは?新規作成や切り替え、merge方法

【Git】ブランチ(branch)とは?新規作成や切り替え、merge方法

この記事からわかること

  • Gitブランチ(branch)とは?
  • 切り替え作成方法
  • mergeの使い方とコマンド種類
  • コンフリクト解消方法

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

Gitのブランチ(branch)とは?

Gitのブランチ(branch)とはバージョン管理をしながら開発をしていく上での履歴の流れを表した機能です。主軸となるブランチにはあらかじめmasterというブランチ名がつけられており、開発者によって新規のブランチを作成することも可能です。

新規のブランチを作成すると主軸のブランチから枝分かれするようなイメージで繋がりを持っており、主軸と新規のブランチを最終的に併合(merge)させることも可能です。

【Git】ブランチ(branch)とは?新規作成や切り替え、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)させます。ブランチ同士をマージする際には新しいコミットが作成されます。

【Git】ブランチ(branch)とは?新規作成や切り替え、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つのブランチをマージすることができます。ですがこの際に同じファイルの同じ行同士が、別ブランチのコミットで変更されている場合コンフリクトが発生してしまいます。

ブランチを削除する

不要になったブランチは-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」で出演アーティストを管理してみたいと思います。(勝手にアーティストの名前使ってすみません。。)またマージの際にコンフリクトが発生するようにしてみます。

  1. プロジェクトの作成&Gitの初期化
  2. ArtistList.txtの作成と編集
  3. ステージング&コミット
  4. ArtistList.txtに追記〜コミット
  5. 主ブランチを進める
  6. ブランチを切り替える
  7. pendingブランチを進める
  8. マージしてみる(コンフリクトの発生)
  9. コンフリクトを解消する

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つのコミット履歴を持った状態です。

【Git】ブランチ(branch)とは?新規作成や切り替え、merge方法

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.マージしてみる(コンフリクトの発生)

ではmainpendingをマージしてみます。(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のマージ

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index