gitについて自分のにわか知識を撲滅したい 基本編
こちらはITRC Advent Calendar 2019の13日目の記事です。
2日前の人: トラコンの感想
前の人: 限定公開でした。
次の人: VisualStudioCode 便利なプラグインをまとめてみた
目的
自分のにわか知識を撲滅したく調べてみました。
今回はgitの歴史や仕組み、自分がなんとなく使っていた基本的なコマンドなどの用語理解編です。
目次
- gitとは
- バージョン管理とは
- リポジトリとは
- ローカルバージョン管理システム
- 集中バージョン管理システム
- 分散バージョン管理システム
- Gitを使用する上で最低限必要な用語
- ローカルリポジトリとリモートリポジトリ
- gitサーバとは
- なんとなく使っていたコマンド達
- commitとpushについて
- cloneについて
- pullについて
- コマンドの流れ
- 参照
gitとは
- 分散バージョン管理システム
- スナップショットでファイルを保存
バージョン管理システムとは
ファイルを以前のバージョンに戻したり、変更履歴を保存するためや誰がいつファイルを変更したのか確認のためしたりなどを行え、
かつ、それらをリポジトリで管理するのがバージョン管理システムです。
参考にした文章
「バージョン管理」とは何でしょうか。また、なぜそれを気にする必要があるのでしょうか。 バージョン管理とは、一つのファイルやファイルの集合に対して時間とともに加えられていく変更を記録するシステムで、後で特定バージョンを呼び出すことができるようにするためのものです。 本書の例では、バージョン管理されるファイルとしてソフトウェアのソースコードを用いていますが、実際にはコンピューター上のあらゆる種類のファイルをバージョン管理のもとに置くことができます。
もしあなたがグラフィックス・デザイナーやウェブ・デザイナーで、画像やレイアウトの全てのバージョンを保存しておきたいとすると(きっとそうしたいですよね)、バージョン管理システム(VCS)を使うというのはいい考えです。 VCSを使うことで、ファイルを以前の状態まで戻したり、プロジェクト丸ごとを以前の状態に戻したり、過去の変更履歴を比較したり、問題が起こっているかもしれないものを誰が最後に修正したか、誰がいつ問題点を混入させたかを確認したりといった様々なことができるようになります。 また、VCSを使うと、やっていることがめちゃくちゃになってしまったり、ファイルを失ったりしても、普通は簡単に復活させることができるようになります。 それに、これらのことにかかるオーバーヘッドは僅かなものです。
参照:git バージョン管理に関してより
リポジトリとは
ファイルなどの保存場所。
決してデータベースやコンテナではないですが似たようなものです。
バージョン管理システムの種類
おおまかに3種類のバージョン管理システムがある。
- ローカルバージョン管理システム
- 集中バージョン管理システム
- 分散バージョン管理システム
ローカルバージョン管理システム
ローカルにのみリポジトリがある。
参考にした文章
どのディレクトリにいるのか忘れやすく、うっかり間違ったファイルに書き込んだり、上書きするつもりのないファイルを上書きしてしまったりします。
この問題を扱うため、はるか昔のプログラマは、ローカルのVCSを開発しました。それは、バージョン管理下のファイルに対する全ての変更を保持するシンプルなデータベースによるものでした。
参照:git ローカルバージョン管理システムより
集中バージョン管理システム
1個のサーバーを用意してあげてそこのリポジトリに保存。
参考にした文章
次に人々が遭遇した大きな問題は、他のシステムを使う開発者と共同作業をする必要があるということです。
バージョン管理されたファイルを全て持つ一つのサーバーと、その中心点からファイルをチェックアウトする多数のクライアントからなっています。 長年の間、これはバージョン管理の標準でした。
参照:git 集中バージョン管理システムより
分散バージョン管理システム
ローカルにもサーバーにもリポジトリがある。
もしサーバーが死んでも大丈夫()。
参考にした文章
ここで分散バージョン管理システム(DVCS)の出番になります。 DVCS(Git、Mercurial、Bazaar、Darcsのようなもの)では、クライアントはファイルの最新スナップショットをチェックアウト(訳者注:バージョン管理システムから、作業ディレクトリにファイルやディレクトリをコピーすること)するだけではありません。リポジトリ(訳者注:バージョン管理の対象になるファイル、ディレクトリ、更新履歴などの一群)全体をミラーリングするのです。 そのため、あるサーバーが故障して、DVCSがそのサーバーを介して連携していたとしても、どれでもいいのでクライアント・リポジトリの一つをサーバーにコピーすれば修復できます。 クローンは全て、実際は全データの完全バックアップなのです。
参照:git 分散バージョン管理システムより
スナップショットで、差分ではない
commitが分かれば納得できると思う。
分散バージョン管理システムは一回一回全保存。
その他だと編集したファイルだけ保存。
参考にした文章
Gitと他のVCS (Subversionとその類を含む)の主要な相違は、Gitのデータについての考え方です。 概念的には、他のシステムのほとんどは、情報をファイルを基本とした変更のリストとして格納します。 これらのシステム(CVS、Subversion、Perforce、Bazaar等々)は、図1-4に描かれているように、システムが保持しているファイルの集合と、時間を通じてそれぞれのファイルに加えられた変更の情報を考えます。
Gitは、この方法ではデータを考えたり、格納しません。 代わりに、Gitはデータをミニ・ファイルシステムのスナップショットの集合のように考えます。 Gitで全てのコミット(訳注:commitとは変更を記録・保存するGitの操作。詳細は後の章を参照)をするとき、もしくはプロジェクトの状態を保存するとき、Gitは基本的に、その時の全てのファイルの状態のスナップショットを撮り(訳者注:意訳)、そのスナップショットへの参照を格納するのです。 効率化のため、ファイルに変更が無い場合は、Gitはファイルを再格納せず、既に格納してある、以前の同一のファイルへのリンクを格納します。 Gitは、むしろデータを一連のスナップショットのように考えます。
参照:git Gitの基本より
容量についての疑問点
Gitを使用する上で最低限必要な用語
- ローカルリポジトリ
- リモートリポジトリ
- Gitサーバ
- add
- commit(コミット)
- push(プッシュ)
- clone(クローン)
- pull(プル)
リポジトリとは(復習)
ローカルリポジトリとリモートリポジトリ
- ローカルリポジトリは自分のPC内にあるリポジトリのこと
- リモートリポジトリはGitサーバにあるリポジトリのこと
Gitサーバ
Git用に設定されたサーバです。
もちろん自分でたてられたりしますが、
GitHubやGitLabなどの無料で使えるクラウドサーバ(厳密には開発プラットホーム)もあります。
全体像
全体像はこんな感じ
addとは
作業ファイルはリポジトリをコピーして「作業コピー」を取得します。
その作業コピーにたして変更を加えてあげることで、変更内容のスナップショットをリポジトリにコミットします。
ファイルの状態には追跡されている(tracked)や追跡されてない(untracked)があり、
追跡されている(tracked)状態の「変更されている(modified)」ファイルを「ステージされている(staged)」状態にするために行うことがadd
です。
commit(コミット)してpush(プッシュ)
- commitはローカルリポジトリにファイルを保存すること。
- pushはリモートリポジトリにローカルリポジトリを保存すること。
gifだと分かりやすく新しいファイルのみpushしていますが、実際はリポジトリごとpushしています。
ここで行っているadd,commit,pushコマンド
$ git add [file]
$ git commit -m "[comment]"
$ git push -u origin master
cloneとpullの違い
ローカルリポジトリがあるかないかです。
つまり自分のPCにデータがあるかないかです。
- cloneはローカルリポジトリがないとき
- pullはローカルリポジトリがあるとき
clone
リモートリポジトリにリポジトリがあるがローカルリポジトリにリポジトリがない時に行います。
つまり、サーバにだけデータベースがあって自分のPCにデータベースがない時に使用するコマンドです。
ここで行っているcloneコマンド
$ git clone [URL]
pull
他人がリモートリポジトリにもリポジトリが変更した時、自分もそのリポジトリをローカルリポジトリにダウンロードする必要があります。
つまり他人がサーバにデータを保存した時、それをダウンロードするために使用するコマンドです。
ここで行っているpushコマンド
$ git pull origin master
コマンドの流れ
ローカルリポジトリをGitHubにpushする
1回目
$ mkdir [file name]
$ cd [file name]
$ echo "hello,world" >> README.md
$ git init
$ git add [file name]
$ git commit -m "[comment]"
$ git remote add origin [URL]
$ git push -u origin master
2回目以降
$ git add .
$ git commit -m "comment"
$ git push -u origin master
リモートリポジトリからローカルリポジトリにcloneしてくる
$ git clone [URL]
リモートリポジトリからローカルリポジトリにpullしてくる
$ git pull origin master
まとめ
- バージョン管理には種類がある。
- リポジトリはファイルの保存場所
- アップロードはaddしてcommitしてpush
- ダウンロードはclone or pull