今までMain = 開発ブランチ・release = リリースブランチ として運用してきたが、Mainよりdevの方がわかりやすいのでは?と思い、ローカルとリモートのMainブランチをリネームした。
そしたら、Sourcetree で pull しようとすると、「プルするリモートのブランチ」が毎回 main のままになっていて、毎回ドロップダウンを開いて dev に選び直す必要出てきてしまった。めんどーーい。。
git branch -vv を実行すると、ブランチごとの追跡先が表示される。
$ git branch -vv
* dev e0b570a [origin/main: gone] Merge pull request #91 ...
docs/component-structure a1ae698 [origin/docs/component-structure] ref 引数名...
release ee2a48a [origin/release] Merge pull request #88 ... dev の行がおかしい。[origin/main: gone]??
ローカルの dev が origin/main を追跡していて、gone は追跡先に設定されているリモートブランチが、もう存在しないということ。
実際、リモートのMainもリネームしたため、リモートにも main は無いが、 Sourcetree の Pull は、この追跡先の設定を読んでドロップダウンの初期値にしている
$ git branch -r
origin/desgin-renewal
origin/design/feat/make-css-token
origin/dev
origin/docs/component-structure
origin/release
1. リモート側のブランチを dev に切り替える
2. fetch --prune で手元のリモート追跡ブランチを更新(origin/devが現れ、origin/main が消える)
3. ローカルブランチを main → dev にリネームする
までで、「ローカル dev の追跡先を origin/dev に貼り直す」という作業はやってくれないっぽい...。
追跡先は .git/config にremote(どのリモートか)と merge(そのリモートのどのブランチか)の 2 つで記録されている。
# リネーム前
[branch "main"]
remote = origin
merge = refs/heads/main
# リネーム後 ← セクション名は変わるが、merge の値は据え置き
[branch "dev"]
remote = origin
merge = refs/heads/main ★ ここが取り残される以下のコマンドで修正可能
$ git branch -u <リモートのブランチ名> <ローカルのブランチ名>
$ git branch -vv
* dev e0b570a [origin/dev] Merge pull request #91 ...gone が消えて [origin/dev] になった!
.git が見当たらないとき.git はドット始まりの隠しディレクトリなので、VS Code の既定では表示されなので、Finderから隠しファイルの表示
git branch -m <変更前> <変更後> # ローカルをリネーム
git push -u origin <変更後> # -u で追跡先も更新
git push origin --delete <変更前> # リモートの旧ブランチを削除GItをGUIで操作できるのは便利だけど、裏で何が起こってるかわからないから意図しない挙動が起こりやすいなーという知見を得た
あと、Git関連の不可解な挙動の正体が .git/config を一度確認してみるといいっぽい!