章 ▾ 第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のようなブランチの名前を変更する前に、「masterブランチ名の変更」セクションを読んでください。

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ブランチ名の変更

警告

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