SVNとgitの違いは?

GITでできることをSVNだけでやろうとするとこんなイメージになる

作業1 SVNだけでできること

  • SVNのリポジトリを自分用と公開用の2つを持つのに近い
  • 1つはローカルHDDに造った自分専用のリポジトリ1
  • もう1つはサーバーにリポジトリ2をつくる
  • ローカルの作業の更新はSVNリポジトリ1に行い自分のみ使う(コミット)

作業2 ここからgitの作業相当

  • ローカルで満足のいったリビジョンをエクスポートする
  • エクスポートしたファイルをリポジトリ2に上書きする
  • リポジトリ2を最新の状態に更新する(プル)
  • リポジトリ2の競合を解決する
  • リポジトリ2をコミットする(プッシュ)
  • 競合を解決したプロジェクト2をリポジトリ1に展開する
     

試してみる

通常の使い方

userAが1,2,3をコミット&プッシュ
userBがPullして4,5,6
userAがPullして7,8,9,10でコミット
userBがPullして7,8,9,Aでコミット

衝突&マージ結果

userAがプッシュ
userBがプッシュ → 衝突
userBがプルしてマージ、8,9,Aでコミット、プッシュ

ブランチ

userAがローカルでブランチ、8,9,10,11,12,13,14,15,16,17,18,18,20でコミット
userBが8,9,A,B,C,D,E,F,10でコミット&プッシュ

合流

userAがプルして衝突、マージしてコミット&プッシュ
userBがプル

どうなるのか?

メリット / デメリット

所感です。

  • ローカルでのバージョン管理だけならSVNで充分
  • 作業2の運用に不便を感じるならGITに移行すると便利
  • SVNでのサーバー公開はサーバーの用意とアクセス権の設定がめんどう
  • GITではそれに対応したbitBucketとかgitHubといったサービスが提供されている
  • 競合した時にめんどくさい、ただこれはSVNも同様
    • 使いこなせてないせいか、まだうまく差分を吸収できない

gitでコミットしてプッシュする

#ref(): File not found: "gitImage1.png" at page "git"

  • ローカルでとりあえず保存しておきたいリビジョンは好きなタイミングでコミットできる
    • SVNではコミットしてしまうとプロジェクトに正式に提出してしまうことになる
    • そのためローカルで大きな変更をともなうテスト中の(途中セーブ的な)コミットが許容されにくい。
    • あとで元に戻したいので「とりあえず」保存しておきたい場合のコミットもプロジェクトに影響がでる
  • gitではローカルのコミットとサーバーへのコミット(プッシュ)の2段階が存在している
  • うまくプロジェクトに参加させたいリビジョンができたらプッシュ(サーバーにコミット)する
  • 途中セーブした結果、うまくいったリビジョンを、プッシュするイメージ
  • その前に、サーバーから最新のソースを持ってきて競合を解決しておく必要がある
  • ローカルでの作業が長引くと、それだけ強豪が発生しやすくなってマージの難易度が上がる
  • あまり海底に潜りすぎると浦島太郎的にみたこともないソースコ-ドだらけになって困る

プルしてコミットする

#ref(): File not found: "gitImage2.png" at page "git"

  • サーバーの最新状態をプルして持ってくる
  • そのあとで自分のソースをコミット、この辺りはSVNと一緒
  • サーバーの最新状態をすべて持ってきて上書きするのを「クローン」するという
    • ローカルの状態がおかしくなったりしたらとりあえずクローンして最新にする方法もある

簡単な手順

ローカルリポジトリの設定

  • 登録したいソースコード一式を用意する
  • 適当な場所に(ローカルの)リポジトリを作成する
  • SourceTreeで「リポジトリの作成」を行いリポジトリの場所を設定する
  • そのリポジトリに「ソースコード一式」を放り込む
  • コミットする
    • これでローカルのリポジトリによるファイル管理は完成

リモートを設定する

  • BitBucketにブラウザでログインする
  • 新規リポジトリを作成する
    • これでサーバー上にリポジトリができる
  • SourceTreeでリモートの設定を行う
    • さっき作ったリモートリポジトリのURLを設定する
      • https://ユーザー名@bitbucket.org/ユーザー名/リポジトリ名.git
  • プッシュする
  • ここまでできたらいつローカルのPCが壊れても安心できる状態になる

git使ってみてどうなのか

GITを使ってみてというよりSourceTreeを使ってみてどうかという評価。GITそのものはとても便利であることは全く否定出来ない(サーバー連動という観点で)。そういう意味では使い慣れたTortoiseSVNと較べてSource Treeはどうか、ということになっている感じ。

  • CVSを考えるとSource Treeは圧倒的に使いやすい
  • まだ慣れていないせいかTortoise SVNに戻りたい
  • SVNクライアントであるTortoiseSVNのエクスプローラー連動がわかりやすすぎた
  • SourceTreeがイマイチなじまない
  • TortoiseGitは評判が良くないのでまだ試していない
  • mac環境だとWindows環境と同じインターフェースのSourceTreeが使えるのが便利
    • Windows環境ではコミット時にメッセージが日本語で書けない
  • SourceTreeを使っているが、日本語でコミットメッセージできない
  • mac用では日本語環境に特に問題ない
    • 2016/07/25時点で修正されてました
  • サーバー側にリポジトリを作る手間がなく、アカウントを作るだけで圧倒的にラク
  • お客さんや遠隔地のヒトとリポジトリを簡単に共有できる
  • SVNの場合はセキュアなしくみが欲しければ自前で構築する必要がある
    • そうでなければお客さんのソースとかリソース情報が駄々漏れ
  • BitBucketなどのAtlasianのサービスを使うことで容量の制限はあるもののとりあえずリポジトリの共有に問題がない

GITの留意点、覚書など

git留意点

userファイルが追加されない

vcのプロジェクトの設定ファイルの1つ「*.user」がどうしてもsourceTreeで追加の対象にならならない
http://tech.nitoyon.com/ja/blog/2013/04/05/sourcetree/によると、グローバルな無視リストに含まれてしまっているとのこと。ホントだ「*.user」が入ってる。他にもこれらが入ってるので注意。

*.obj
*.exe
*.pdb
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.user
*.suo
*.tlb
*.tlh
*.bak
*.cache
*.ilk
*.log
*.dll
*.lib
*.sbr