Thursday, January 26, 2012

Gitのリモート(bare)リポジトリの扱い

Gitで、リモートにあるbareリポジトリ(repo.gitのようなリポジトリ)の扱いについてメモ。

ここでは以下のようなリポジトリ構成になっているものとします。

  • CENTER.git : チーム外で管理しているリポジトリ
  • MAIN.git : チームの開発者が普段pushするリポジトリ
  • LOCAL : 開発者が利用するリポジトリ

bareリポジトリでのマージ

bareリポジトリ(MAIN.git)上ではマージはできない。これは第一にbareリポジトリにはwork copyがないから。work copyがないと、マージで衝突したときに解決する手段がない。bareリポジトリ上のブランチのマージは、一度開発環境(LOCAL)など別のリポジトリ上にプル/チェックアウトし、そこでマージしたうえでリモートにpushする。

外部リポジトリからの取り込み

CENTER.gitで修正があり、それをMAIN.gitに取り込むにはgit fetchを使う。これだけで取り込みはOKのはずだが、fetchで取り込んだだけではHEADが更新された最新に移動しないので、reset --softする(work copyがないので、softでないとエラーとなる)。

# 以下、MAIN.git上での操作
$ git fetch <CENTER.git>
$ git reset --soft HEAD
この後でgit logすると、最新の変更がログに出力される。

ブランチを指定してpush

たとえばoriginに指定されているリモートリポジトリのdev-remoteブランチに、ローカルのdev-localブランチをpushする場合:

$ git push origin dev-local:dev-remote

リモートのブランチからクローンする

リモートリポジトリ(MAIN.git)のdev-remoteブランチを、ローカルにdev-localブランチとして取得する場合、まずgit cloneした後、リモートのブランチを指定してcheckoutする。

git clone <MAIN.git>
git checkout -b dev-local remotes/origin/dev-remote

リモートにタグを反映する

ローカルで作成したタグをリモートに反映する

$ git push --tags

No comments: