Gitのローカルリポジトリの有効活用（メリット）について


アジャイルで開発している現場のプロジェクトがSVNからGitに移行したものの、  
結局SVNの時と同じような使い方をしていて何か違うような気がしています。

集中型から分散型のバージョン管理になってローカルリポジトリができ、  
けれど結局はdevelopをローカルにcloneし、  
各々開発してコミットと同時にプッシュする運用をしていて、  
ローカルリポジトリの必要性というか、そこをうまく使えていない気がしています。

ローカルリポジトリがあることによるメリットであったり、  
ローカルにコミット後プッシュまで貯めておく？ケースや  
ローカルでブランチを切るケース、  
こういう使い方やこういう開発スタイルに合っている、などありましたら教えて頂きたいです。

運用上弊害がある訳ではないですが、Gitのメリットが生かせていない気がしました...。




> こういう使い方やこういう開発スタイルに合っている、などありましたら教えて頂きたいです。

ブランチモデルのことだと思いますが、いろんなモデルが存在していますので、開発スタイルに合わせて検討されると良いと思います。とても書ききれませんので、ブランチモデルで検索してもらっていろいろ調べてみてください。

真っ先に思いつくのは git-flow のブランチモデルを採用した使い方です。  
有名で一般的ですが安全にリリース管理する点が重視されていて やや大げさな印象です。

github flow というのもあります。Pull Request するタスクがあるので Github などを利用するのが前提です。git-flow
よりは簡略で頻繁にリリースすることを重視しているそうです。

もっと単純なものとしては、ブランチを切らないパターン（現状はこれなのかと）、master&developの2つで運用するパターン、feature(機能)ごとにブランチを切るパターン、などがよくあるパターンだと思います。




分散型リポジトリのメリットは、主に

  1. ローカルにpullした時点の全てを持ってこれるので、その範囲での作業であればネットワークはいらない
  2. リモートに反映する部分を選べる
  3. ローカルの反映する部分も選べる（大きなリポジトリでは、操作速度を上げるのに役に立つ）
  4. 修正の競合を防ぐ方法が、ロックではなくマージで解決するので、誰かがロックしたまま放置して困るということがない
  5. パッチ版など本家と差異があっても維持しやすく、マージによって修正の取り込みがしやすい

ということだと思います。

よくありそうなパターンだと、

  1. pushするまではリモートに影響が出ないので、ローカルで好き勝手やっても問題ない 
    * ブランチやタグを作ったり消したり放棄したりや、コミットやコミット取り消しも気楽に行える
    * push済みのコミットでなければ、rebaseなどでコミットを綺麗にしたりも気楽に行える
  2. リモートブランチに納得がいったブランチだけをpushすることができる 
    * よくある「git push origin master」なら、originリモートリポジトリにローカルのmasterブランチのみを反映し、例えばdevelopローカルブランチがあったとしても、リモートには反映されない
    * （SVNは記憶の彼方なので、こういうことができないというのは自信なし）
  3. （話を聞いたことがあるだけで実体験なし）
  4.     1. と同じ
  5. GitHubなどを使っているなら、必要に応じてプルリクエストを発行するまで影響が出ない 
    * 自分のリポジトリが、本家のリポジトリのフォークの場合、ある意味本家に対するgit cloneしたクラウド上にあるローカルリポジトリなので、本家にマージ処理されるまでは変更は反映されないため
    * 独自パッチ版が必要な時便利

というところでしょうか？

