🦁

ローカルデスクトップでgit管理をする

に公開

現場作業でGitHubが使えないので、デスクトップでGit管理することにしました。

フォルダ構成

デスクトップ上に下記のフォルダを作ります

YYYYMM_XXXXX(案件名フォルダ)
├── .git(リモート側)
└── YYYY-MM-DD_hh-mm(ソースコード)

リモート側のgitを設定

リモート側のフォルダで以下のコードを実行

git init --bare --shared

上記コマンドは 「作業ツリーなし」のリポジトリを作るためのオプションです。

ローカル側のgitを設定

ローカル側のフォルダで以下のコードを実行

git init
git remote add origin "リモートフォルダのパス"

リモートフォルダのパスは「パスをコピー」で取得したものをそのまま貼り付けでOKです

pushする

下記のコマンドでpushを実行する

git add .
git commit -m "xxxxxx"
git push origin master

git add.する前にgit statusで状態確認しといたほうがいいかも。。。

上記で完了です。

--bare を付ける理由

通常のリポジトリ(non-bare)には、次の2つが存在します:

  • .git/ ディレクトリ(履歴やブランチの情報)
  • 作業ツリー(実際のファイル群)

この状態で、今そのリポジトリで master が checkout されているときに、外部から master に push されると…

作業ツリーと HEAD がズレる

  • push により master ブランチの履歴が強制的に上書きされる
  • でもリモートでは master が現在 checkout 済みなので、その履歴と作業ツリーが一致しなくなる
  • 結果、矛盾した状態(ツリー ≠ HEAD)になる

Git はこれを検出して、次のようなエラーを出します:

refusing to update checked out branch: refs/heads/master

--bare を付けたら以下のようになる

  • --bare を付けたリポジトリには、作業ツリー(ファイル群)自体が存在しない。
  • したがって、ブランチを checkout することもない。
  • つまり、push されても矛盾が起きない。

そのため、bare リポジトリは 安心して中央リポジトリとして使える というわけです。

Discussion