動機
こちらのツイートを見て「確かに…」と思ったので、サクッと実行するためのエイリアスを作ってみた。
Git無意識&&手癖で触ってるから気づかなかったけど実はmasterブランチを手元にチェックアウトする必要ないな。git fetch origin && git checkout -b new-branch origin/masterからのgit push -u origin new-branchで良い。
— Toshiyuki Takahashi (@tototoshi) March 4, 2021
追記(2021-03-04): デフォルトブランチ、追跡ブランチ等の名称を変更しました。
追跡ブランチ(tracking branch)とはリモートサーバの状態をローカルにコピーして追従するためのブランチです。
基本的には追跡ブランチを最新の状態にし(pull)、そのブランチから新しい機能追加・修正用のブランチを作ります。
しかし、最新の状態にし忘れてブランチを作ってしまったり、ローカルで変更したものをうっかり追跡ブランチ上でコミットしてしまったりするとリモートの状態とずれてしまうため事故が起こりやすいのも欠点です。
エイリアスを作るコマンド
デフォルトブランチとは開発時にメインとなるブランチのことで、 master だったり、 develop や development などプロジェクトによってどのブランチがデフォルトなのかは違うため、以下のコマンドを使う前にそれぞれの環境に合わせて読み替えていただきたいです。
origin : リモートサーバーの名前。 git remote -v などで表示される。
master : デフォルトブランチ名。
$ git config --local --add alias.nb '!f(){ [ $# -eq 0 ] && echo "Usage: git nb <branch>" && exit; git fetch --tags --prune origin && git switch -c $1 origin/master; };f'
作成したエイリアスは次のように使う。
$ git nb feature/something
エイリアス名 nb は new branch として適当につけてますが、使いたい人が打ちやすい名前にすれば良いと思います。
解説
コマンドの部分はこんな意味。
-
git config --local: 現在のプロジェクトの設定を表示したり、更新したりする。自分用の全プロジェクト向けの共通設定は--globalなどで定義可能。 -
--add alias.nb:alias設定グループにnbを追加する。alias設定グループに指定した値はgit nbのようにエイリアスとして追加される。
エイリアスに指定した文字列は ! で始まる場合シェルスクリプトとして認識される。
この場合、 f(){ ... } で関数 f を定義して、最後に f で実行しているので、引数を含めて実際には f feature/something として実行される形となる。
f の内容は次のような構成になっている。
-
[ $# -eq 0 ] && echo "Usage: git nb <branch>" && exit;: 引数がなかったらUsageを表示して終了する。 -
git fetch --tags --prune origin: タグと削除されたブランチを含め、リモートの最新状態を取得する -
git switch -c $1 origin/master: リモートブランチorigin/masterを基準として、新しいブランチを作成しブランチへ移動する