Git 🌙
Chapters â–Ÿ 2nd Edition

1.3 䜿い始める - Gitの基本

Gitの基本

では、芁するにGitずは䜕なのでしょうか。 これは、Gitを吞収するには重芁な節です。なぜならば、もしGitが䜕かを理解し、Gitがどうやっお皌動しおいるかの根本を理解できれば、Gitを効果的に䜿う事が恐らくずおも容易になるからです。 Gitを孊ぶずきは、SubversionやPerforceのような他のVCSに関しおあなたが恐らく知っおいるこずは、意識しないでください。このツヌルを䜿うずきに、ちょっずした混乱を回避するこずに圹立ちたす。 ナヌザヌ・むンタヌフェむスがよく䌌おいるにも関わらず、Gitの情報の栌玍の仕方や情報に぀いおの考え方は、それら他のシステムずは倧きく異なっおいたす。これらの盞違を理解する事は、Gitを扱っおいる間の混乱を、防いでくれるでしょう。

スナップショットで、差分ではない

Gitず他のVCS (Subversionずその類を含む)の䞻芁な盞違は、Gitのデヌタに぀いおの考え方です。 抂念的には、他のシステムのほずんどは、情報をファむルを基本ずした倉曎のリストずしお栌玍したす。 これらのシステムCVS、Subversion、Perforce、Bazaar等々は、図1-4に描かれおいるように、システムが保持しおいるファむルの集合ず、時間を通じおそれぞれのファむルに加えられた倉曎の情報を考えたす。

他のシステムは、デヌタをそれぞれのファむルの基本バヌゞョンぞの倉曎ずしお栌玍する傟向がありたす。
図 4. 他のシステムは、デヌタをそれぞれのファむルの基本バヌゞョンぞの倉曎ずしお栌玍する傟向がありたす。

Gitは、この方法ではデヌタを考えたり、栌玍したせん。 代わりに、Gitはデヌタをミニ・ファむルシステムのスナップショットの集合のように考えたす。 Gitで党おのコミット蚳泚commitずは倉曎を蚘録・保存するGitの操䜜。詳现は埌の章を参照をするずき、もしくはプロゞェクトの状態を保存するずき、Gitは基本的に、その時の党おのファむルの状態のスナップショットを撮り蚳者泚意蚳、そのスナップショットぞの参照を栌玍するのです。 効率化のため、ファむルに倉曎が無い堎合は、Gitはファむルを再栌玍せず、既に栌玍しおある、以前の同䞀のファむルぞのリンクを栌玍したす。 Gitは、むしろデヌタを*䞀連のスナップショット*のように考えたす。

Gitは時間を通じたプロゞェクトのスナップショットずしおデヌタを栌玍したす。
図 5. Gitは時間を通じたプロゞェクトのスナップショットずしおデヌタを栌玍したす。

これが、Gitず類䌌の党おの他のVCSずの間の重芁な違いです。 ほずんどの他のシステムが以前の䞖代から真䌌しおきた、ほずんど党おのバヌゞョン管理のやり方蚳者泚aspectを意蚳を、Gitに芋盎させたす。 これは、Gitを、単玔にVCSず蚀うより、その䞊に組み蟌たれた幟぀かの途方も無くパワフルなツヌルを備えたミニ・ファむルシステムにしおいたす。 このやり方でデヌタを考えるこずで埗られる利益の幟぀かを、[ch03-git-branching]を扱ったずきに探求したす。

ほずんど党おの操䜜がロヌカル

Gitのほずんどの操䜜は、ロヌカル・ファむルず操䜜する資源だけ必芁ずしたす。倧䜓はネットワヌクの他のコンピュヌタヌからの情報は必芁ではありたせん。 ほずんどの操䜜がネットワヌク遅延損倱を䌎うCVCSに慣れおいるのであれば、もっさりずしたCVCSに慣れおいるのであれば、このGitの速床は神業のように感じるでしょう蚳者泚盎蚳は「このGitの偎面はスピヌドの神様がこの䞖のものずは思えない力でGitを祝犏したず考えさせるでしょう」。 プロゞェクトの履歎は䞞ごずすぐそこのロヌカル・ディスクに保持しおいるので、倧抂の操䜜はほが瞬時のように芋えたす。

䟋えば、プロゞェクトの履歎を閲芧するために、Gitはサヌバヌに履歎を取埗しに行っお衚瀺する必芁がありたせん。盎接にロヌカル・デヌタベヌスからそれを読むだけです。 これは、プロゞェクトの履歎をほずんど即座に知るずいうこずです。 もし、あるファむルの珟圚のバヌゞョンず、そのファむルの1ヶ月前の間に導入された倉曎点を知りたいのであれば、Gitは、遠隔のサヌバヌに差分を蚈算するように問い合わせたり、ロヌカルで差分を蚈算するために遠隔サヌバヌからファむルの叀いバヌゞョンを持っおくる代わりに、1か月前のファむルを調べおロヌカルで差分の蚈算を行なえたす。

これはたた、オフラむンであるか、VPNから切り離されおいたずしおも、出来ない事は非垞に少ないこずを意味したす。 もし、飛行機もしくは列車に乗っおちょっずした仕事をしたいずしおも、アップロヌドするためにネットワヌク接続し始めるたで、楜しくコミットできたす。 もし、垰宅しおVPNクラむアントを適切に䜜動させられないずしおも、さらに䜜業ができたす。 倚くの他のシステムでは、それらを行なう事は、䞍可胜であるか苊痛です。 䟋えばPerforceにおいおは、サヌバヌに接続できないずきは、倚くの事が行なえたせん。SubversionずCVSにおいおは、ファむルの線集はできたすが、デヌタベヌスに倉曎をコミットできたせんなぜならば、デヌタベヌスがオフラむンだからです。 このこずは巚倧な問題に思えないでしょうが、実に倧きな違いを生じうるこずに驚くでしょう。

Gitは完党性を持぀

Gitの党おのものは、栌玍される前にチェックサムが取られ、その埌、そのチェックサムで照合されたす。 これは、Gitがそれに関しお感知するこずなしに、あらゆるファむルの内容を倉曎するこずが䞍可胜であるこずを意味したす。 この機胜は、Gitの最䞋局に組み蟌たれ、たたGitの哲孊に䞍可欠です。 Gitがそれを感知できない状態で、転送䞭に情報を倱う、もしくは壊れたファむルを取埗するこずはありたせん。

Gitがチェックサム生成に甚いる機構は、SHA-1ハッシュず呌ばれたす。 これは、16進数の文字0-9ずa-fで構成された40文字の文字列で、ファむルの内容もしくはGit内のディレクトリ構造を元に蚈算されたす。 SHA-1ハッシュは、このようなもののように芋えたす:

24b9da6552252987aa493b52f8696cd6d3b00373

Gitはハッシュ倀を倧倉よく利甚するので、Gitのいたるずころで、これらのハッシュ倀を芋るこずでしょう。 事実、Gitはファむル名ではなく、ファむル内容のハッシュ倀によっおGitデヌタベヌスの䞭に党おを栌玍しおいたす。

Gitは通垞はデヌタを远加するだけ

Gitで行動するずき、ほずんど党おはGitデヌタベヌスにデヌタを远加するだけです。 システムにいかなる方法でも、UNDO䞍可胜なこず、もしくはデヌタを消させるこずをさせるのは困難です。 あらゆるVCSず同様に、ただコミットしおいない倉曎は倱ったり、台無しにできたりしたす。しかし、スナップショットをGitにコミットした埌は、特にもし定期的にデヌタベヌスを他のリポゞトリにプッシュ蚳泚pushはGitで管理するあるリポゞトリのデヌタを、他のリポゞトリに転送する操䜜。詳现は埌の章を参照しおいれば、倉曎を倱うこずは倧倉難しくなりたす。

激しく物事をもみくちゃにする危険なしに詊行錯誀を行なえるため、これはGitの利甚を喜びに倉えたす。Gitがデヌタをどのように栌玍しおいるのかず倱われたように思えるデヌタをどうやっお回埩できるのかに぀いおの、より詳现な解説に関しおは、䜜業のやり盎しを参照しおください。

䞉぀の状態

今、泚意しおください。 もし孊習プロセスの残りをスムヌズに進めたいのであれば、これはGitに関しお芚えおおく䞻芁な事です。 Gitは、ファむルが垰属する、コミット枈、修正枈、ステヌゞ枈の、䞉぀の䞻芁な状態を持ちたす。 コミット枈は、ロヌカル・デヌタベヌスにデヌタが安党に栌玍されおいるこずを意味したす。 修正枈は、ファむルに倉曎を加えおいたすが、デヌタベヌスにそれがただコミットされおいないこずを意味したす。 ステヌゞ枈は、次のスナップショットのコミットに加えるために、珟圚のバヌゞョンの修正されたファむルに印を぀けおいる状態を意味したす。

このこずは、Gitプロゞェクト蚳者泚ディレクトリ内の、Gitディレクトリ、䜜業ディレクトリ、ステヌゞング・゚リアの䞉぀の䞻芁な郚分蚳者泚の理解に導きたす。

䜜業ディレクトリ、ステヌゞング・゚リア、Gitディレクトリ
図 6. 䜜業ディレクトリ、ステヌゞング・゚リア、Gitディレクトリ

Gitディレクトリは、プロゞェクトのためのメタデヌタ蚳者泚Gitが管理するファむルやディレクトリなどのオブゞェクトの芁玄ずオブゞェクトのデヌタベヌスがあるずころです。 これは、Gitの最も重芁な郚分で、他のコンピュヌタヌからリポゞトリをクロヌン蚳者泚コピヌ元の情報を蚘録した状態で、Gitリポゞトリをコピヌするこずしたずきに、コピヌされるものです。

䜜業ディレクトリは、プロゞェクトの䞀぀のバヌゞョンの単䞀チェックアりトです。 これらのファむルはGitディレクトリの圧瞮されたデヌタベヌスから匕き出されお、利甚するか修正するためにディスクに配眮されたす。

ステヌゞング・゚リアは、普通はGitディレクトリに含たれる、次のコミットに䜕が含たれるかに関しおの情報を蓄えた䞀぀のファむルです。 「むンデックス」ず呌ばれるこずもありたすが、ステヌゞング・゚リアず呌ばれるこずも倚いです。

基本的なGitのワヌクフロヌは、このような颚に進みたす

  1. 䜜業ディレクトリのファむルを修正したす。

  2. 修正されたファむルのスナップショットをステヌゞング・゚リアに远加しお、ファむルをステヌゞしたす。

  3. コミットしたす。蚳者泚Gitではこれは、ステヌゞング・゚リアにあるファむルを取埗し、氞久䞍倉に保持するスナップショットずしおGitディレクトリに栌玍するこずです。

もしファむルの特定のバヌゞョンがGitディレクトリの䞭にあるずしたら、コミット枈だず芋なされたす。 もし修正されおいお、ステヌゞング・゚リアに加えられおいれば、ステヌゞ枈です。 そしお、チェックアりトされおから倉曎されたしたが、ステヌゞされおいないずするなら、修正枈です。 [ch02-git-basics]では、これらの状態ず、どうやっおこれらを利甚をするか、もしくは完党にステヌゞ化郚分を省略するかに関しおより詳しく孊習したす。

scroll-to-top