はじめに
Gitを学び始めると、SVNやCVSといった集中型バージョン管理との用語の違いに戸惑う人は多いでしょう。
SVN:リモートから取得 → checkout(チェックアウト)
SVN:リモートに登録 → commit(コミット)
Git:リポジトリから取得 → pull(プル)
Git:リポジトリに登録 → push(プッシュ)
どちらも「リポジトリからコードを持ってくる」操作なのに、なぜ言葉が違うのでしょうか?
なぜ用語が違うのか?
集中型における「checkout」と「commit」
Subversion(SVN)では、リポジトリは中央にひとつしか存在せず、開発者はそこからコードを取得して作業します。
svn checkout
→ 中央リポジトリからソースを展開して作業ディレクトリを作る
その後の更新もupdateやcommitを通じて、常にリモートのリポジトリと直接やり取りします。
分散型における「pull」と「push」
一方、Gitは最初にcloneすると、リポジトリそのもの(履歴込み)が手元にコピーされます。
ローカルにすでにリポジトリがある
リモートからは「新しい履歴を同期」するだけ
この「履歴を引っ張ってくる」動作を表すのがpullです。
単にファイルをコピーするわけではないため、SVNと同じ「checkout」や「commit」という言葉は使われず、「リモートから履歴ごと引き寄せる」=pull、「履歴ごとリモートに登録する」=pushという表現が選ばれました。
本質的には一緒?
ここまで読むとGitではcheckoutの代わりにpull、commitの代わりにpushを実行していると思えるかもしれません。
しかし、実は本質的にはGitとSVNは変わりません。
実はGitにもcheckoutもcommitが存在します。
Gitではローカルのリポジトリから特定のコミットからソースコードを作業ツリーに展開することをcheckout(チェックアウト)と言い
修正内容をローカルのリポジトリに履歴として登録することをcommit(コミット)と言います
つまり本質的にはcheckoutもcommitもリモートへの作業ではなくリポジトリ本体への作業と言えます。
これはGitでもSVNでも同じです。
違うのは、Gitでは「リポジトリ自体をローカルに持てる」ため、リモート操作に新しい言葉(pull/push)が割り当てられただけなのです。
まとめ
- SVNは常に中央リポジトリと直接やり取り → checkout / commit
- Gitはリポジトリをローカルに保持 → ローカルはcheckout / commit、リモート操作にはpull / push
- 用語は違っても、本質的には「取得=checkout」「登録=commit」という構造は共通
つまり「なぜ用語が違うのか?」の答えは、
リポジトリをどこに持つか(中央のみか、分散か)の違いを表現するため
です。