最近のWeb開発ではバージョン管理にGitを使う事が増えてきています。
分散型バージョン管理ツールであり、GitHubの登場により一気に知名度が上がったのではないでしょうか。
SVNではなくGitを活用することが「今風なWeb開発」って感じがします。
先日、仕事でSVNからGitに移行し、初日は丸一日ハマりながらも使わせてもらいまいした。
今では特に問題なく使うことができていますが、初日の失敗は何かというと
「SVNのイメージのままだとGitの解説だけでは誤解を生みやすい」という点でした。
その反省点を踏まえ、自分がその時欲しかった情報をまとめていきます。
本記事ではSVNからGitに移行しなければならないSVNユーザや、
とりあえずGitのイメージを理解したいという方のためにGitの概念や運用のイメージなんとなーく理解できるような解説をしていきます。
コマンドやツールの使い方などは今後別記事で書いていこうと思います。
GitとSVNの違い
そもそもGitとSVNの違いをざっくり言うと…
- SVN
- 一箇所でソースを管理する、集中型バージョン管理システム
- Git
- 複数箇所でソースを管理する、分散型バージョン管理システム
という違いになります。
SVNの場合は、任意の場所にSVNサーバを立てて、各自のローカルからTortoiseSVNやEclipse,ターミナルなどで接続します。
あくまで一箇所で管理しているので、各自のローカルには作業フォルダ(ワーキングツリー)しか存在しません。
Gitの場合も基本的な運用では任意の場所にGitサーバを立てます。そして各自のローカルのTortoiseGitやEclipse,ターミナルなどで接続します。
ここまではSVNと一緒なのですが、gitの場合はここで各自のローカルにもリポジトリができあがります。当然、作業フォルダ(ワーキングツリー)も存在します。
ここでSVNユーザの方は「は?なにいってんの?」ってなると思います。たぶん。
ですが、このローカルリポジトリがなかなか便利なんです。
ここではまず、「gitにはリモートリポジトリ・ローカルリポジトリ・作業フォルダ(ワーキングツリー)」という3つの状態があることを覚えておいてください。
覚えておくべきGit用語
まず最初にSVN脳からGit脳に切り替えていきます。
同じ用語が出てきますが、意味が変わってくるのでまずSVNと比較しながらGitの用語を覚えていきましょう。
- リモートリポジトリ
- SVNと同様、一箇所に存在するリポジトリ。
- ローカルリポジトリ
- 各自のローカルの中にGitで作成するリポジトリです。SVNにはない仕組みです。フォルダ内に.gitというフォルダが作成されていれば、それらのファイルはgitのローカルリポジトリから管理されていることになります。
- 作業フォルダ(ワーキングツリー)
- 実際にソースをいじったりするフォルダ。SVNと同様。一番上の階層には.gitファイルが置かれていて、gitが管理しているフォルダであることがわかる
- クローン
- リモートリポジトリをローカルリポジトリとしてローカルにコピーします。git cloneコマンドを使います。まず最初はリモートリポジトリのアドレスを使い、クローンすることから始めることになると思います。
- コミット
- 作業フォルダからローカルリポジトリにソースをコミットすること。git commitコマンドでコミットできます。SVNと違い、リモートリポジトリに対するものではありません。
- インデックス(ステージング)
- 作業フォルダからローカルリポジトリにコミットする前の状態。git addコマンドでインデックスに追加できます。ファイルをインデックスに追加することで「このファイルは次のコミットの対象ですよ」という目印をつけることができます。あくまで目印なので使わなくてもコミットはできます。(git commit -a)
- プッシュ
- ローカルリポジトリからリモートリポジトリにソースをコミットすること。git pushコマンドでプッシュできます。つまり、「SVNのコミット≒Gitのコミット+プッシュ」となるわけです。
- フェッチ
- リモートリポジトリからローカルリポジトリへバージョン履歴を更新すること。git fetchコマンドで実行できます。(ただし、プルと違ってマージは行われません)
- プル
- リモートリポジトリからローカルリポジトリのバージョン履歴と作業フォルダを更新すること。git pullコマンドで更新できます。SVNの更新とほぼ同じ。(フェッチと違い、Gitにより自動でマージされます)
- ブランチ
- SVNと同様の意味です。ブランチを切っていくことでバージョンの管理を分岐していくことができます。
- リモートトラッキングブランチ
- リモートリポジトリにあるブランチを監視しているブランチです。このトラッキングブランチとローカルリポジトリのブランチを紐付けし、トラッキングブランチが監視しているリモートリポジトリのデータを引っ張ってくるイメージです。リモートトラッキングブランチで何かをするということはなく、ローカルリポジトリとリモートリポジトリの橋渡しをしています
Gitを扱えるツール
Gitを扱えるツールには様々な種類があります。
最近ではIDEの機能としてそのまま提供されていることが多いです。
- msysgit(Windows用のgit)
- TortoiseGit
- Eclipse EGitプラグイン
- AndroidStudio
などなど…
それぞれ細かい使い方については別記事で解説しようかと思います。
開発を始める – Gitでリモートリポジトリをクローン
殆どの場合、Gitで最初にやるのはクローンになると思います。
クローンは「誰かが作ったリモートリポジトリをローカルリポジトリにコピーする」という作業です。
GitHubでいうと下記の場所にリモートリポジトリのURLが載っています。
URL的には色々種類がありhttpsから始まったり、gitから始まったり、sshプロトコルだったり。
git cloneコマンドにこのURLを流し込んでやることでリモートリポジトリからソースを取ることができます。
細かい設定うんぬんは抜きにして、クローン自体は簡単な作業です。
リモートリポジトリにコミットするまでの流れ
最後に、Gitでコミット(プッシュ)するまでの流れを実際のイメージと絡めてご紹介します。
- 作業フォルダにあるファイルを編集する。
- 編集したファイルをインデックスに追加(git add)していき、ステージング状態にしていく。※後述
- ひと通り編集・インデックスへの追加を行ったら、ステージング状態のファイルの差分を確認する。(バグはないか?インデックス忘れはないか?)
- ステージング状態のファイルをローカルリポジトリにコミット(git commit)する。
- コミットしたことを確認したら、次はリモートリポジトリにプッシュを行う。プッシュ前にリモートリポジトリとローカルリポジトリの差分を表示する(git diff)。これで本当にリモートリポジトリに上げても良い内容かをチェックする。
- git pushでローカルリポジトリの内容をリモートリポジトリにプッシュして反映する。
これでリモートリポジトリのソースを更新することができたので、他のユーザは「プル」または「フェッチ」をすることでソースを取得することができます。
インデックス(ステージング)
Gitにはインデックス(ステージング)という便利な機能があるので出来る限り使っていきたいところです。
インデックスを使わずにコミットすることは可能ですが、インデックスに追加(git add)することで
次のコミット操作でコミットするファイルをステージング状態にできます。
これにより、次にコミットするファイルを「とりあえずまとめておく」ということができ、コミット忘れなどのミスが少なくなります。
以上、いかがでしたか。
Gitの仕組みや用語をザーーーッと解説してしまいましたが、なんとなくイメージは湧いたでしょうか。
この記事ではGitの説明を100%網羅できませんが、理解するための橋渡しになればと幸いです。
コメント