GitHubの基本-7 ブランチの作り方と使い方・プルリクエスト ~ウェブサイトを4つのパーツに分割・マージするプロジェクトを例にして~

今回はWEBサイトを4つのパーツに分解して、それぞれのHTMLファイルを各担当者が作成して、最後に統合するという流れを想定して、Gitのブランチの作り方と使い方について解説していきます。

開発環境

エディター:Visual Studio Code

OS:Windows または MAC

プロジェクトの概要

・HTMLの<head>タグ部分は最初に共通のテンプレートを用意します。そして、そのテンプレートを基に、各々のパーツのHTMLを追加していくようにします。

・下記のようにWEBサイトをヘッダー、メイン、サイドバー、フッターの4つのパーツに分割して、それぞれ別の担当者がテンプレートに対して各々のHTMLを追加します。そして、最終的に一つのHTMLファイルに統合することを想定しています。

ブランチのイメージと作業工程

ブランチのイメージとしては、下記の図のようになります。作業工程としては、下記の①-⑥のようになります。

①:mainブランチでテンプレートととなるHTMLファイルを作成します。

②-➄:各パーツ毎にブランチを作成します。

⑥:各ブランチをmainブランチに統合します。

ブランチのイメージ

以降、実際の作業工程に入っていきます。

mainブランチ

フォルダ作成

まずは、今回のプロジェクトのフォルダを作成します。フォルダ名は”gitpractice“とします。

デフォルトブランチの確認

・下記コードでデフォルトに設定されているブランチを確認することができます。

・実行結果がmainであれば、デフォルトのブランチ名はmainであることがわかります。

・現在、Gitではmainをデフォルトブランチとして使用することが推奨されていますが、以前はmasterがデフォルトブランチとして使用されていました。そのため、masterで解説されているコードを参照されている場合、master→mainに変更して使用頂く方がスムーズに進める可能性があるかと考えます。

デフォルトブランチの確認:git config init.defaultbranch
git config init.defaultbranch

# 実行結果
main

# 参考情報
git config init.defaultbranch master # <= デフォルトブランチをmasterに変更する際

git init

ターミナルを開いて、先程作成したフォルダ”gitpractice“に移動します。

そして、git init コマンドを実行します。

giti initコマンド実行後、.gitという隠しフォルダが作成されていれば成功です。.gitフォルダの中は複数のフォルダおよびファイルで構成されていますが、この中身について理解する必要は現段階ではありません。

隠しフォルダは、初期設定の状態では表示されません。こちらの表示方法については過去の記事をご参照下さい。

git init コード実行+実行後のディレクトリ構成
cd ~/gitpractice # ~(チルダ)は、省略を意味します。
git init

# 実行後のディレクトリ構成
gitpractice
    ├── .DS_Store
    └── .git
        ├── HEAD
        ├── config
        ├── objects
        │   ├── info
        │   └── pack
        └── refs
            ├── heads
            └── tags

ファイル作成

index.html“というHTMLファイルを作成します。

index.htmlファイル作成+作成後のディレクトリ構成
(MACの場合)touch index.html
(Windows PowerShellの場合)New-Item index.html

# 実行後のディレクトリ構成
gitpractice
    ├── .DS_Store
    ├── .git
    │   ├── HEAD
    │   ├── config
    │   ├── objects
    │   │   ├── info
    │   │   └── pack
    │   └── refs
    │       ├── heads
    │       └── tags
    └── index.html

ファイル編集

index.htmlを下記のように編集します。

最初に作るHTMLファイルのポイントとして、4つのパーツ(ヘッダー、メイン、サイドバー、フッター)毎に枠を作っておくことです。

そして、各パーツの担当者が、このindex.htmlファイルをテンプレートにして、これらのパーツの詳細部分を作成していきます。

index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>gitプロジェクト練習</title>
</head>
<body>
    <header></header>

    <div class="main">
        <section></section>
    </div>
    
    <div class="sidebar">
        <aside></aside>
    </div>

    <footer></footer>
</body>
</html>

リモートリポジトリへプッシュ

上記まででmainブランチがローカル上で完成しましたので、リモートリポジトリへプッシュします。

以降、github(https://github.com/)上での操作となります。(既にgithubアカウント作成済みとして進めていきます。アカウント未取得の場合、過去記事をご参照下さい。)

新規リモートリポジトリ作成

Create repositoryをクリックして、新規リポジトリ作成画面に遷移します。

githubログイン後のトップページ左上のCreate repositoryをクリック

Repository nameのみ入力(任意の名称で大丈夫です。)して、Create repositoryをクリックします。

新規リポジトリ作成画面で任意のリポジトリ名を入力後、Create repositoryをクリック

無事に新規リポジトリが作成されたら、下記のような画面に遷移します。

新規リポジトリが作成されると、新規リポジトリに対してURLが発行されます。この新規作成したリモートリポジトリへローカルからプッシュする際にこのURLを使用しますのでコピーしておきます。

リポジトリ作成完了後の画面。作成されたリポジトリのURLが発行されるので、コピーしておく。

git add .

ここから再度ローカルリポジトリへ戻ります。

まずは、ローカルのステージングエリアにファイルを追加します。

“git add .”コマンドでワーキングディレクトリの全ファイルをステージングエリアに追加します。

“git add ファイル名”コマンドで個別のファイル毎にステージングさせることも可能です。

git add . コマンドでワーキングディレクトリの全ファイルをステージングエリアに追加する。
# ~/gitpractice(ワーキングディレクトリ)
git add .

git commit -m “コミット名”

ステージングエリアに移行した内容をローカルリポジトリに移行させます。

git commit -m “コミット名”のコマンドを使用します。

コマンド名は任意の名称で大丈夫です。

git commit -m “first commit”でステージングエリアに移行した内容をローカルリポジトリに移行
# ~/gitpractice(ワーキングディレクトリ)
git commit -m "first commmit"

git remote add origin リモートリポジトリのURL

このコマンドは、「リモートリポジトリ」に「origin」ブランチを追加するという意味です。

git remote add main リモートリポジトリのURL
# ~/gitpractice(ワーキングディレクトリ)
git remote add origin https://github.com/username/repositoryname.git

git push origin main

最後にリモートリポジトリへプッシュします。

2020/10以降、Githubの仕様変更によりデフォルトのブランチ名が”master”→”main”に変更されました。

git push origin main
# ~/gitpractice(ワーキングディレクトリ)
git push origin main

エラー発生時の対処方法

Githubを複数アカウント運用している場合、”remote: Repository not found”のエラーが発生することがあります。(管理人も発生しました。)

その際の解決方法を記述します。(これで解決しない場合も当然あるかと思いますが。)

その他の解決方法として下記もよろしければご参照下さい。

パーソナルトークンの発行

過去記事で発行方法を記載していますのでご参照下さい。

remote: Repository not foundのエラー発生時の対処方法
git remote rm origin #作成済みのブランチを削除します。
git remote add origin https://ユーザ名:トークン@github.com/ユーザ名/リポジトリ名.git

git push -u origin main

下記のようにプッシュが反映されていれば成功です。

ブランチの作成~プッシュ(mainブランチへローカル側で統合)

続いてブランチの作成を進めていきます。

まずは、ブランチ作成用のディレクトリを作成します。

初めに、ヘッダー作成用のディレクトリを作成します。(フォルダ名:~/header)

そして、このディレクトリに、リモートリポジトリにプッシュしたファイルをクローンします。

git clone リモートリポジトリのURL

上記コマンドでエラーが発生する場合、プッシュの時と同様の可能性が考えられます。

remote: Repository not foundのエラー発生時の対処方法
# ~/header
git clone https://ユーザ名:トークン@github.com/ユーザー名/リモートリポジトリ名.git

git inti

クローン後は新たに.gitフォルダを作成する必要がありますので、git initコマンドを実行します。

git init
# ~/header
git init

# 実行後のディレクトリ構成
header
    ├── .DS_Store
    ├── .git
    │   ├── HEAD
    │   ├── config
    │   ├── objects
    │   │   ├── info
    │   │   └── pack
    │   └── refs
    │       ├── heads
    │       └── tags
    └── index.html

ブランチの作成:git branch ブランチ名

ブランチの作成:git branch ブランチ名
# ~/header
git branch header # このコマンドで"hearder"ブランチが作成されます。
git branch # このコマンドでブランチ一覧を表示できます。

# 実行結果
* main
  header
上記のように、headerブランチが新たに作成されていることが分かります。

fatal: not a valid object name: ‘main’:ブランチ作成時のエラー発生時の対応

上記エラーが発生した場合、mainブランチで何かしらコミットをすれば解消されるようです。

下記に対応策を記述します。

fatal: not a valid object name: ‘main’:ブランチ作成時のエラー発生時の対応
# ~/header
git add .
git commit -m "initial commit"
On branch main
nothing to commit, working tree clean

ブランチの切り替え:git checkout 切り替え先のブランチ名

次に現在のブランチをmainブランチからheaderブランチに切り替えます。

ブランチの切り替えには、git checkout 切り替え先のブランチ名を使用します。

ブランチの切り替え
# ~/header
git checkout header
git branch

# 実行結果
* header
  main

ファイル編集

クローンしたHTMLファイルを編集します。

ヘッダー部分を下記のように編集して保存します。

ヘッダー部分編集後のHTMLファイル
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>gitプロジェクト練習</title>
</head>
<body>
    <header>
        <!-- ↓編集部分開始 -->
        <h1><a href="/">gitプロジェクト練習用サイト</a></h1>
        <nav>
            <ul>
                <li><a href="#">about</a></li>
                <li><a href="#">works</a></li>
                <li><a href="#">blog</a></li>
                <li><a href="#">contact</a></li>
            </ul>
        </nav>
        <!-- ↑編集部分終了 -->
    </header>

    <div class="main">
        <section></section>
    </div>
    
    <div class="sidebar">
        <aside></aside>
    </div>

    <footer></footer>
</body>
</html>

ブランチをマージする:git merge 統合元ブランチ

mainブランチにheaderブランチの編集内容を統合(マージ)します。

まずは、ブランチをmainブランチに切り替えます。

mainブランチに切り替え
git checkout main
headerブランチをmainブランチに統合(マージ)
git merge header
Updating bacdf1a..1a62145
Fast-forward
 index.html | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

ブランチを削除する:git branch -d 削除するブランチ名

mainブランチへマージ後は、headerブランチは不要になりますので削除します。

headerブランチを削除
git branch -d header
Deleted branch header (was 1a62145).

git add .

git add. コマンドで編集したファイルをステージングエリアに追加します。

git add .:編集ファイルをステージングエリアに追加
# ~/header
git add .

git commit -m “コミット内容”

git commit -m “コミット内容”コマンドにより、ステージングエリアからローカルリポジトリに移行します。今回は、「コミット内容=hearder部分の編集」とします。

git add .:編集ファイルをステージングエリアに追加
# ~/header
git commit -m "header部分の編集"

git remote add main リモートリポジトリのURL

git push リモートリポジトリのURL main

エラー発生時の対処方法

プッシュ時のエラー
To https://github.com/username/〇〇〇.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/username/〇〇〇.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

リモートリポジトリに存在する作業内容が、ローカルリポジトリに存在しないことでエラーが発生しています。

プッシュ時のエラー解決方法
git checkout -b tempbranch
git pull origin master # これによってローカル環境とリモート環境の差異が打ち消されるはずです。
git add . # 差異が打ち消されたことを確認したうえで、以後のコードで改めてローカルの変更内容をプッシュしていきます。
git commit -m "コミット名"
git push origin tempbranch
git checkout main
git merge tempbranch
git push -u origin main
# origin の部分はリモートリポジトリのURLで指定した方がより確実です。
プッシュ時のエラー2

上記のエラー対策にも関わらず下記のようなエラーが発生することがあります。

fatal: refusing to merge unrelated histories

プルの際のマージが拒否されています。

プッシュ時のエラー2解決方法

git pull --allow-unrelated-histories
プッシュ時のエラー3

上記のエラー対策にも関わらず下記のようなエラーが発生することがあります。

 ! [rejected]        main -> main (non-fast-forward)
error: failed to push some refs to 'https://github.com/gitsample0001/gitpractice.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. Check out this branch and integrate the remote changes
hint: (e.g. 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

これはリモートリポジトリとローカルリポジトリのそれぞれのmainディレクトリの最新状態が異なることによって発生します。

プッシュ時のエラー3解決方法

pull後にも関わらずこのエラーが発生してしまっている場合、強制的にプッシュするほかないと思います。

git push -f origin main # 強制的にプッシュする方法です。

ブランチの作成~プッシュ(mainブランチへリモート側で統合)

今度は、ローカルで作ったブランチをローカルでは統合せずに、そのままリモートリポジトリへプッシュする方法を解説します。

ブランチフォルダ作成→クローン→プッシュ
mkdir mainbar # ブランチフォルダの作成(mainbarという名称で作成しました。)
git clone リモートリポジトリのURL #リモートリポジトリのクローン
git checkout -b mainbar # 「checkout -bオプション」では、ブランチの作成+リポジトリの移動を一つのコードで完了できます。
# ファイル編集+保存
git remote add mainbar リモートリポジトリのURL # mainbarブランチのステージング
git push リモートリポジトリのURL mainbar # mainbarブランチをプッシュ

下記のようにmainbarブランチが作成されていれば成功です。

2 branches の箇所をクリックすると、ブランチ一覧画面に遷移します。

プルリクエスト

派生ブランチの内容を本流ブランチにマージして良いか承認依頼することをプルリクエストと言います。

ブランチ画面のNew pull requestボタンからプルリクエストを行えます。

プルリクエストの作成

下記3点を主に編集します。

Write:コメントを記述します。

Reviewrs:プルリクエストに対してレビューをもらいたい人をここに設定します。

Assignees:承認者をここに設定します。

プルリクエストの承認

プルリクエストが送られたブランチは、下記のようにOpenの状態になります。

自身がAssignee(承認者)であれば、Openの隣の#1ボタンをクリックすると、承認画面から承認を行うことが出来ます。

プルリクエストの承認画面

・Writeの部分で承認依頼者に対して、コメントを返すことが出来ます。

・リクエスト内容に問題が無ければ、Merge pull requestボタンでマージを実行できます。

Merge pull requestボタンクリック後のページ

Confirm mergeをクリックするとマージが完了します。

Confirm mergeをクリック後のページ

・マージ完了のお知らせが表示されます。

・Delete branchをクリックするとmainbarブランチが削除されます。

ここまででかなりのボリュームになってしまいましたのでサイドバーとフッターの部分については省略させて頂きます。(作業内容については、ヘッダー・メインバーと同じです。)

コメント

タイトルとURLをコピーしました