SVN、GITの使い方　備忘録

※色々間違ってたので修正

へっぽこエンジニアです。
内容を推敲するあまり削りに削ったら内容が薄くなってどうしようとかなってますが
少しずついい塩梅を見つけれればと思っています。
（最初に書いたら3000行とかになって辞めた）

最近SVN（SubVersion）やGitを使用する機会が出てきたため備忘録として
今回投稿いたします。間違いや突込みがあれば適宜ご指摘ください。

先に結論から書いておくとSVNもGITも**「バージョン管理システム」**です
これは後述しますが、そういうモノなんだなと思っていてください。

###前項　　バージョン管理システムって？
バージョン管理システムが主にどういう用途で使用されるか、というと
日々開発していく中でプログラムは徐々に増えていきます。
しかも、開発現場は一人で行っているわけではなく複数人のチームで行われます。

それぞれがデータの管理（作っているプログラムの保管場所）を
各自のローカル環境（手元のPC）においてしまった場合、
最後に合わせる際に予期せぬ事態が発生することが考えられます。
（変数名がそれぞれ違う、そもそもデータを引っ張るところが違う、等）


そこで、全員がデータを置く場所を共有し随時変更があっても
一定のところにデータを集約しておけば変更があっても
随時変更に応じた対応ができるのでそのために使用するのが
**「バージョン管理システム」**になります。

###1.SVNって？
SubVersionです。
なんでSVNって略すかは知りません（）
ただアプリケーションをインストールするときも公式にSVNって書いてますね。
どうやら正式名称は**「Apache　Subversion」**らしいです
詳細な違いは3.で紹介します。

###2.Gitって？
こちらは文字通りGitです。
こちらも3.で紹介します。

###3.具体的にどう違うの？
結論から。
Subversionは「集約型バージョン管理システム」
Gitは「分散型バージョン管理システム」という表現をされますが
個人的には
Subversionは「一元バージョン管理」
Gitは「多次元配列型バージョン管理」という感じがします。
※個人の感想です

その理由として
SubVersionは例えば
Aフォルダ　hoge.txt　
Bフォルダ  fuga.txt
Cフォルダ  設計書.xlsx
とデータを格納するフォルダとデータがそれぞれあったとして、
SVNのバージョンが「1」だったとします。

hoge.txtに内容を加筆しコミット（SVNにデータを格納することをコミットといいます）
すると、hoge.txtに更新がかかります。
この時**「SVNのバージョン」**は**「2」**に変わります。
更新があるごとにバージョンは増えていきますが、
この時、更新があった内容が例えばhoge.txtだけでなく
fuga.txtも更新があった場合、
Version2の更新内容は「hoge.txt」「fuga.txt」になります。

もちろん現在はそれぞれどちらかをバージョン1（更新前）に戻すことや
どちらか一方だけ更新をかける（バージョン2や3にすること）ができますが、
Gitはさらに利便性が高まります。


Gitの場合はここに「ブランチ」という概念が加わります。
※ブランチ＝「枝」の意味のごとく木の枝のようにいろいろと分岐させることができます。
先ほどと同様下記の構成があったとき。

Aフォルダ　hoge.txt　
Bフォルダ  fuga.txt
Cフォルダ  設計書.xlsx

仮にこの状態を「Master」ブランチとします。

ここにtest.txtを加えたいとしたとき、
「Master」ブランチを残したまま
「test」ブランチという別のブランチを作成することができます。
もし仮にtest.txtが不要になった場合や更新をかける場合には
testブランチを削除したり、test.txtを更新をかけて
Masterブランチに「マージ」（上乗せ）することもできます。

ここで重要なのは「test」ブランチも存在しつつ
「Master」ブランチも存在させることができるので
多次元的にブランチの管理を行うことができます。

これがどういうことかというと、SVNでは
Version1、2という状況でしか管理できませんでしたが
GitではVersion1-1や2-3といった状況も作り出すことができます。


※注意点！
しかし一方であまりにブランチを多岐にわたらせすぎると
混乱の温床（どこでマージするか、どこをマージしていないか等の問題）
になるので管理には一定程度のルールが無いと非常に厄介です。

###4.Gitのコマンドについて
SVNでは基本的に使用するコマンドは「コミット」「チェックアウト」「更新」の三択です。

**「コミット」**…更新内容をリモートリポジトリ（データの集合場所）に集約する

**「チェックアウト」**…リモートリポジトリ（データの集合場所）からデータを一律引っ張ってくる。（ローカル環境で保存しているデータも強制的に更新する
**「更新」**…リモートリポジトリ（データの集合場所）からデータを一律引っ張ってくる。（ローカル環境のデータは更新はするものの、強制的ではなく、更新する）

しかも、SVNでは特にコマンドプロンプトを起動してコマンドをたたかなくても使用できます。
※Gitでもコマンドをたたかなくても使用できますが、ツールが必要です。

そこでGitでよく使用するコマンド、オプションを備忘録として記載しておきます。

**最初にやること**
`git init`　
これ大事。忘れないこと。

**・クローン**
githubからクローン
`git clone git@github.com`

リモートリポジトリからクローン
`git clone http://～～～～～～～～～～`
or
`git clone ssh～～～～@～～～～～～`


**ブランチ関係**
ローカルブランチ一覧を見たいとき
`git branch`

リモートブランチ一覧を見たいとき
`git branch -r`

現在のブランチを切替するとき
`git checkout （ブランチ名）`

リモートブランチのデータを見たいとき&ブランチを作りたいとき
`git checkout -b branch名　origin/ブランチ名`


**コミット**
コミット内容にメッセージをつけたいとき。
間違っても適当なコミットメッセージはだめです。

`git commit -m 'message' .`

現状とステージングのファイルとの差をしる
(ローカルで変更したファイルがわかる)
`git status`

差分確認
`git diff`
`git log`

ここらへんはよく使います

**その他**
ステージングにあげる
(すべてあがるので注意)
`git add -a`

確認しながらあげたい場合は
git add -p  
基本的にここら辺が良く使いますが、
また何かあれば随時更新していきます。


3/28追記

ちょっとあまりに雑だったので追記
私がGITに初めて触れて感じたこと。

###どうやってブランチからデータ引っ張ればええんや・・・・。
ブランチを切り替えたいとき
`git checkout [引っ張りたいブランチ名]`
新しいデータがほしいとき
git pull
でおｋ。
※このとき、変更点が重なった場合、conflictが起きるので注意

###コミットってどうやったらええんや…

まずはステージング環境にあげなきゃならんので
`git add ****`
でステージング環境へ
****は適当にオプションをどうぞ。

もし特定のプログラムだけ上げたい場合は
`git add [ファイル名]`
とすればおｋ

その他ディレクトリを上げる場合は
`git add dir/[ディレクトリ名]`

※ちなみに、上げたいファイルがあるディレクトリを
　エクスプローラー上で右クリック→git bash here　で
gitコマンドが開けるためそこからgit　addする手もあるので参考にどうぞ。

そのあとに
`git  commit -m "コミットメッセージ"`
とすればコミットまではOK

なお、
`git add -p`
で変更点を表示しながらadd するなんてことも可能


コミット後は
`git push origin/[送りたいブランチ名]`
でプッシュ（ブランチにデータを反映）ということで一連のデータを送信する流れになる。

同じブランチなら
git push origin HEAD でも良いぞ

基本的にadd>commit>pushの三段階あると思えばおk




ざっと削ったのにこの物量で恐縮ですが…。以上です。