チャプター ▾ 第2版

3.3 Git ブランチ - ブランチ管理

ブランチ管理

いくつかのブランチを作成、マージ、削除したので、常にブランチを使用し始めるときに役立ついくつかのブランチ管理ツールを見てみましょう。

git branch コマンドは、ブランチの作成と削除以上のことを行います。引数なしで実行すると、現在のブランチの簡単なリストが表示されます。

$ git branch
  iss53
* master
  testing

master ブランチの前に付いている * 文字に注目してください。これは、現在チェックアウトしているブランチ(つまり、HEAD が指しているブランチ)を示します。これは、この時点でコミットすると、master ブランチが新しい作業で進むことを意味します。各ブランチの最後のコミットを表示するには、git branch -v を実行できます。

$ git branch -v
  iss53   93b412c Fix javascript issue
* master  7a98805 Merge branch 'iss53'
  testing 782fd34 Add scott to the author list in the readme

便利な --merged オプションと --no-merged オプションを使用すると、このリストを、現在いるブランチにマージされている、またはまだマージされていないブランチにフィルタリングできます。現在いるブランチにすでにマージされているブランチを表示するには、git branch --merged を実行できます。

$ git branch --merged
  iss53
* master

以前に iss53 をマージしたため、リストに表示されます。このリストで * が付いていないブランチは、通常 git branch -d で削除しても問題ありません。それらの作業はすでに別のブランチに組み込まれているため、何も失うことはありません。

まだマージされていない作業を含むすべてのブランチを表示するには、git branch --no-merged を実行できます。

$ git branch --no-merged
  testing

これはあなたの他のブランチを示しています。まだマージされていない作業が含まれているため、git branch -d で削除しようとすると失敗します。

$ git branch -d testing
error: The branch 'testing' is not fully merged.
If you are sure you want to delete it, run 'git branch -D testing'.

本当にブランチを削除してその作業を失いたい場合は、役立つメッセージが指摘しているように、-D を付けて強制できます。

ヒント

上記で説明した --merged--no-merged オプションは、引数としてコミットまたはブランチ名が指定されていない場合、それぞれ、現在のブランチにマージされているかマージされていないかを表示します。

追加の引数を指定して、そのブランチを最初にチェックアウトすることなく、他のブランチとのマージ状態について尋ねることができます。たとえば、master ブランチにマージされていないものは何ですか?

$ git checkout testing
$ git branch --no-merged master
  topicA
  featureB

ブランチ名の変更

注意

他の協力者がまだ使用しているブランチの名前は変更しないでください。master/main/mainlineのようなブランチの名前は、「マスターブランチ名の変更」のセクションを読んでからでないと変更しないでください。

bad-branch-name という名前のブランチがあり、履歴をすべて保持したまま corrected-branch-name に変更したいとします。また、リモート(GitHub、GitLab、その他のサーバー)上のブランチ名も変更したいとします。どうすればよいでしょうか?

git branch --move コマンドでブランチをローカルでリネームします。

$ git branch --move bad-branch-name corrected-branch-name

これにより、bad-branch-namecorrected-branch-name に置き換えられますが、この変更は今のところローカルのみです。他のユーザーにリモートで修正されたブランチを表示させるには、プッシュします。

$ git push --set-upstream origin corrected-branch-name

それでは、現在の状況を簡単に見てみましょう。

$ git branch --all
* corrected-branch-name
  main
  remotes/origin/bad-branch-name
  remotes/origin/corrected-branch-name
  remotes/origin/main

corrected-branch-name ブランチにいて、それがリモートで利用可能になっていることに注意してください。ただし、間違った名前のブランチもまだそこにあるので、以下のコマンドを実行して削除できます。

$ git push origin --delete bad-branch-name

これで、間違ったブランチ名が修正されたブランチ名に完全に置き換えられました。

マスターブランチ名の変更

警告

master/main/mainline/defaultのようなブランチの名前を変更すると、リポジトリが使用する統合、サービス、ヘルパーユーティリティ、ビルド/リリーススクリプトが破損します。これを行う前に、共同作業者と相談してください。また、リポジトリを徹底的に検索し、コードとスクリプト内の古いブランチへの参照をすべて更新してください。

以下のコマンドで、ローカルの master ブランチを main にリネームします。

$ git branch --move master main

ローカルの master ブランチは main ブランチにリネームされたため、もう存在しません。

他のユーザーに新しい main ブランチを表示させるには、それをリモートにプッシュする必要があります。これにより、リネームされたブランチがリモートで利用可能になります。

$ git push --set-upstream origin main

その結果、以下の状態になります。

$ git branch --all
* main
  remotes/origin/HEAD -> origin/master
  remotes/origin/main
  remotes/origin/master

ローカルの master ブランチは main ブランチに置き換えられ、なくなりました。main ブランチはリモートに存在します。しかし、古い master ブランチはまだリモートに存在します。さらなる変更を加えるまで、他の協力者は master ブランチを作業のベースとして使い続けるでしょう。

これで、移行を完了するためにいくつかのタスクが残っています。

  • これに依存するプロジェクトは、コードや設定を更新する必要があります。

  • テストランナーの設定ファイルを更新します。

  • ビルドおよびリリーススクリプトを調整します。

  • リポジトリのデフォルトブランチ、マージルール、およびブランチ名に一致するその他の項目など、リポジトリホストの設定をリダイレクトします。

  • ドキュメント内の古いブランチへの参照を更新します。

  • 古いブランチを対象とするプルリクエストを閉じたりマージしたりします。

これらすべてのタスクを完了し、main ブランチが master ブランチと同じように機能することを確認したら、master ブランチを削除できます。

$ git push origin --delete master
scroll-to-top