問題
mainブランチからブランチを切り忘れたままコミットして git push
したことないでしょうか...
$ git switch main
$ git commit -m xxx
$ git commit -m yyy
$ git commit -m zzz
$ git push
誤ってmainブランチをpushしてしまうことを未然に防ぐための対策をご紹介します。
(ブランチ保護は必ず設定しておいた方が良いですが、やらないに越したことはありません。)
Gitシリーズ記事まとめ
環境
Git: 2.37.2
対策
ローカルのmainブランチを削除する方法をご紹介します。
ローカルにmainブランチがないのでコミットもプッシュもできません。
ローカルリポジトリのmainブランチを削除する
$ git branch -a
* main
remotes/origin/main
$ git switch -d origin/main
$ git branch -D main
-
git switch -d
detachedオプション -
git branch -D
ブランチ強制削除オプション
$ git branch -a
* (HEAD detached at origin/main)
remotes/origin/main
これでローカルのmainブランチが削除されました。
ブランチの作成〜プッシュまで
ブランチを切る
新しく topic-123
というブランチを origin/main
から切り出します。
$ git switch -c topic-123 origin/main
$ git branch -a
* topic-123
remotes/origin/main
この後は普通にcommitしていきます。
補足: pushするリモートブランチ名を省略する
$ git config --global push.default current
事前に上の設定をしておくと同じブランチ名でリモートリポジトリへpushしてくれます。
プッシュする
$ git push
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a pull request for 'topic-123' on GitHub by visiting:
remote: https://github.com/xxx/yyy/pull/new/topic-123
remote:
To github.com:xxx/yyy.git
* [new branch] topic-123 -> topic-123
※ブランチ名を指定しなくても同名のリモートブランチが作成されます。
リモートブランチの最新取得〜プッシュまで
origin/main
はどんどん進んでいくので適宜、最新状態を取り込みます。
フェッチする
リモートリポジトリの最新情報を取得します。
$ git fetch
ローカルの main
ブランチはないので、 git pull
は不要です。
作業ブランチに最新のコミットを反映する
リモートブランチの最新コミットからrebaseしてあげればokです。
よくある流れとしては下記の流れでしょうか。
# 作業ブランチへ切り替える(元々いるはず)
$ git switch topic-123
# リモートリポジトリの最新情報を取得
$ git fetch
# 差分を確認する
$ git diff origin/main
# 作業途中のファイルがあればstashしておく
$ git stash -u
# 最新コミットを作業ブランチに取り込む
$ git rebase origin/main
# stashしたファイルを戻す
$ git stash pop
# 結果にコミットする
# git add XXX
# git commit XXX
# コミットを整理する
$ git rebase -i origin/main
補足: origin/main の状態に切り替えたい
origin/main
の状態を確認したい場合もあるかと思います。
$ git switch -d origin/main
--detach
オプションでdetached HEADな状態に切り替えできます。
コミットIDを直接指してる状態です。
リモートのmainブランチが更新された場合、最新の状態に切り替えるには次のコマンドを実行します。
$ git fetch
$ git switch -d origin/main
また、この状態でもcommitは可能ですがpushすると次のエラーが発生します。
$ git push
fatal: You are not currently on a branch.
To push the history leading to the current (detached HEAD)
state now, use
git push origin HEAD:<name-of-remote-branch>
この状態でpushしてもブランチ上にいないのでエラーとなります。
この状態からリモートブランチへpushしたい場合は次のコマンドでpushできます。
$ git push origin HEAD:topic-xxx
ということもできますが、通常通りローカルのブランチを作ってからpushしましょう。
$ git switch -c topic-xxx
$ git push
やってみた感想
誤って、ローカルのmainブランチでコミットしてしまうというミスがなくなりました。
ないものはコミットできないので...
2022.07.15 追記
1年以上この運用でしたが特に不便なことはなかったです。
おすすめです!