Git
目次 ▾ 第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ブランチの名前の変更セクションを読んでいない限り、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ブランチ名の変更

警告

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