LoginSignup
45
47

Git ローカルのmainブランチを使わない運用

Last updated at Posted at 2021-04-25

問題

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年以上この運用でしたが特に不便なことはなかったです。
おすすめです!

参考

45
47
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
47