gitの仕組み

この゚ッセむでは、Gitの仕組みに぀いお説明したす。 プロゞェクトのバヌゞョン管理にGitを䜿甚するのに十分なGitに粟通しおいるこずを前提ずしおいたす。

゚ッセむは、Gitの基になっおいるグラフ構造ず、このグラフのプロパティがGitの動䜜をどのように決定するかに焊点を圓おおいたす。 基本を孊び、APIを䜿甚した実隓から埗られた仮説ではなく、信頌できる情報に基づいおアむデアを構築したす。 適切なモデルを䜿甚するず、Gitが䜕をしたのか、Gitが䜕をし、䜕をしようずしおいるのかをよりよく理解できたす。

テキストは、単䞀のプロゞェクトで䜜業する䞀連のチヌムに分割されたす。 Gitの基瀎ずなるグラフのデヌタ構造に぀いおの芳察がありたす。 芳察結果は、グラフのプロパティずそれに基づく動䜜を瀺しおいたす。

より深く没頭するために読んだ埌、GitのJavaScript実装の豊富にコメントされた゜ヌスコヌドを参照できたす。

プロゞェクト䜜成


~ $ mkdir alpha ~ $ cd alpha 

ナヌザヌはアルファディレクトリを䜜成したす

 ~/alpha $ mkdir data ~/alpha $ printf 'a' > data/letter.txt 

このディレクトリに移動し、デヌタディレクトリを䜜成したす。 内郚で、圌は「a」の内容を含むletter.txtファむルを䜜成したす。 alphaディレクトリは次のようになりたす。

 alpha └── data └── letter.txt 

リポゞトリの初期化


 ~/alpha $ git init Initialized empty Git repository 

git initは、珟圚のディレクトリをGitリポゞトリに移動したす。 これを行うために、圌は.gitディレクトリを䜜成し、その䞭にいく぀かのファむルを䜜成したす。 Git構成党䜓ずプロゞェクト履歎を定矩したす。 これらは普通のファむルです-魔法ではありたせん。 ナヌザヌはそれらを読んで線集できたす。 ぀たり、ナヌザヌはプロゞェクト自䜓のファむルず同じくらい簡単にプロゞェクトの履歎を読んで線集できたす。

alphaディレクトリは次のようになりたす。

 alpha ├── data | └── letter.txt └── .git ├── objects etc... 

.gitディレクトリずその内容はGitを参照しおいたす。 他のすべおのファむルは䜜業コピヌず呌ばれ、ナヌザヌに属したす。

ファむルを远加する


 ~/alpha $ git add data/letter.txt 

ナヌザヌはgit add on data / letter.txtを実行したす。 2぀のこずが起こりたす。

最初に、新しいblobファむルが.git / objects /ディレクトリに䜜成されたす。 data / letter.txtの圧瞮されたコンテンツが含たれおいたす。 その名前は、生成されたコンテンツベヌスのハッシュです。 たずえば、Gitはaからハッシュを䜜成し、2e65efe2a145dda7ee51d1741299f848e5bf752eを取埗したす。 ハッシュの最初の2文字は、オブゞェクトデヌタベヌスのディレクトリ名に䜿甚されたす.git / objects / 2e /。 ハッシュの残りは、远加されたファむルの内郚を含むblobファむルの名前です.git / objects / 2e / 65efe2a145dda7ee51d1741299f848e5bf752e。

ファむルをGitに远加するだけで、その内容がオブゞェクトディレクトリに保存されるこずに泚意しおください。 ナヌザヌが䜜業コピヌからdata / letter.txtを削陀するず、そこに保存されたす。

次に、git addはファむルをむンデックスに远加したす。 むンデックスは、Gitが埓うように指瀺されたすべおのファむルを含むリストです。 .git / indexに保存されたす。 監芖察象ファむルに応じた各行は、その内容ず远加時間をハッシュしたす。 これは、git addコマンドの実行埌にむンデックスの内容を取埗する方法です。

 data/letter.txt 2e65efe2a145dda7ee51d1741299f848e5bf752e 

ナヌザヌは、1234を含むdata / number.txtファむルを䜜成したす。

 ~/alpha $ printf '1234' > data/number.txt 

䜜業コピヌは次のようになりたす。

 alpha └── data └── letter.txt └── number.txt 

ナヌザヌがファむルをGitに远加したす。

 ~/alpha $ git add data 

git addコマンドは、data / number.txtの内容を保存するblobファむルを䜜成したす。 data / number.txtのむンデックスに゚ントリを远加し、blobをポむントしたす。 git addを再床実行した埌のむンデックスの内容は次のずおりです。

 data/letter.txt 2e65efe2a145dda7ee51d1741299f848e5bf752e data/number.txt 274c0052dd5408f8ae2bc8440029ff67d79bc5c3 

ナヌザヌがgit add dataコマンドを指定したにもかかわらず、デヌタディレクトリのファむルのみがむンデックスにリストされるこずに泚意しおください。 デヌタディレクトリ自䜓は個別に指定されおいたせん。

 ~/alpha $ printf '1' > data/number.txt ~/alpha $ git add data 

ナヌザヌがdata / number.txtを䜜成したずき、圌は1234ではなく1を曞き蟌みたいず思っおいたした。圌は倉曎を加え、ファむルを再びむンデックスに远加したした。 このコマンドは、新しいコンテンツを持぀新しいblobを䜜成したす。 data / number.txtのむンデックスの゚ントリを新しいblobで曎新したす。

コミットする


 ~/alpha $ git commit -m 'a1' [master (root-commit) 774b54a] a1 

ナヌザヌはa1をコミットしたす。 Gitはそれに関するデヌタを衚瀺したす。 すぐに説明したす。

commitコマンドには3぀のステップがありたす。 コミットするプロゞェクトのバヌゞョンの内容を衚すグラフを䜜成したす。 コミットオブゞェクトを䜜成したす。 珟圚のブランチを新しいコミットオブゞェクトにリダむレクトしたす。

グラフ䜜成


Gitは、むンデックスからツリヌグラフを䜜成するこずにより、プロゞェクトの珟圚の状態を蚘憶したす。 このグラフは、プロゞェクト内の各ファむルの堎所ず内容を蚘録したす。

グラフは、ブロブずツリヌの2皮類のオブゞェクトで構成されたす。 BLOBはgit addを介しお保存されたす。 ファむルの内容を衚したす。 コミット時にツリヌが保存されたす。 ツリヌは、䜜業コピヌ内のディレクトリを衚したす。 以䞋は、新しいコミットでデヌタディレクトリの内容を蚘録したツリヌオブゞェクトです。

 100664 blob 2e65efe2a145dda7ee51d1741299f848e5bf752e letter.txt 100664 blob 56a6051ca2b02b04ef92d5150c9ef600403cb1de number.txt 

最初の行は、data / letter.txtの耇補に必芁なすべおを蚘録したす。 最初の郚分には、ファむルのアクセス蚱可が栌玍されたす。 2番目は、ファむルの内容がツリヌではなくblobに保存されるこずです。 3぀目はBLOBハッシュです。 4番目はファむル名です。

同様に、2行目はdata / number.txtに適甚されたす。

以䞋は、プロゞェクトのルヌトディレクトリであるalphaのツリヌオブゞェクトです。

 040000 tree 0eed1217a2947f4930583229987d90fe5e8e0b74 data 

1本の線はデヌタツリヌを指したす。



䞊のグラフでは、ルヌトツリヌはデヌタツリヌを指しおいたす。 デヌタツリヌは、data / letter.txtおよびdata / number.txtのBLOBを指したす。

コミットオブゞェクトの䜜成


git commitは、グラフの䜜成埌にコミットオブゞェクトを䜜成したす。 コミットオブゞェクトは、.git / objects /内の別のテキストファむルです。

 tree ffe298c3ce8bb07326f888907996eaa48d266db4 author Mary Rose Cook <mary@maryrosecook.com> 1424798436 -0500 committer Mary Rose Cook <mary@maryrosecook.com> 1424798436 -0500 a1 

最初の行はグラフツリヌを指したす。 ハッシュ-䜜業コピヌのルヌトを衚すツリヌオブゞェクト。 ぀たり、アルファディレクトリです。 最埌の行は、コミットのコメントです。



珟圚のブランチを新しいコミットにダむレクトする


最埌に、commitコマンドは珟圚のブランチを新しいコミットオブゞェクトに向けたす。

珟圚のブランチは䜕ですか Gitは.git / HEADのHEADファむルに移動し、以䞋を確認したす。

 ref: refs/heads/master 

これは、HEADがマスタヌを指しおいるこずを意味したす。 masterは珟圚のブランチです。

HEADずmasterはリンクです。 リンクは、特定のコミットを識別するためにGitたたはナヌザヌが䜿甚するラベルです。

これはリポゞトリ内の最初のコミットであるため、マスタヌリンクを衚すファむルは存圚したせん。 Gitは.git / refs / heads / masterにファむルを䜜成し、その内容コミットオブゞェクトのハッシュを蚭定したす。

 74ac3ad9cde0b265d2b4f1c778b283a6e2ffbafd 

読み取り䞭にコマンドをGitに入力するず、ハッシュa1は私のものずは異なりたす。コンテンツオブゞェクトブロブずツリヌのハッシュは垞に同じになりたす。ただし、䜜成者の日付ず名前を考慮するため、コミットはありたせん。

グラフにGit HEADずmasterを远加したす。



コミット前のように、HEADはマスタヌを指したす。 しかし、今ではmasterが存圚し、新しいコミットオブゞェクトをポむントしおいたす。

最初のコミットは行いたせん


以䞋は、コミットa1埌のグラフです。 䜜業コピヌずむンデックスが含たれおいたす。



䜜業コピヌ、むンデックス、およびコミットの内容は、data / letter.txtおよびdata / number.txtず同じであるこずに泚意しおください。 むンデックスずHEADはBLOBを瀺すためにハッシュを䜿甚したすが、䜜業コピヌの内容はテキストずしお他の堎所に保存されたす。

 ~/alpha $ printf '2' > data/number.txt 

ナヌザヌはdata / number.txtの内容を2に倉曎したす。これにより、䜜業コピヌが曎新されたすが、むンデックスずHEADは倉曎されたせん。



 ~/alpha $ git add data/number.txt 

ナヌザヌがファむルをGitに远加したす。 これにより、2を含むblobがオブゞェクトディレクトリに远加されたす。 data / number.txtのむンデックス゚ントリポむンタヌは、新しいBLOBを指したす。



 ~/alpha $ git commit -m 'a2' [master f0af7e6] a2 

ナヌザヌがコミットしたす。 圌の手順は以前ず同じです。

最初に、むンデックスの内容を衚す新しいツリヌグラフが䜜成されたす。

data / number.txtのむンデックス゚ントリが倉曎されたした。 叀いデヌタツリヌは、デヌタディレクトリのむンデックス付き状態を反映しなくなりたした。 新しいデヌタツリヌオブゞェクトを䜜成する必芁がありたす。

 100664 blob 2e65efe2a145dda7ee51d1741299f848e5bf752e letter.txt 100664 blob d8263ee9860594d2806b0dfd1bfd17528b0ba2a4 number.txt 

新しいオブゞェクトのハッシュは、叀いデヌタツリヌずは異なりたす。 このハッシュを曞き蟌むには、新しいルヌトツリヌを䜜成する必芁がありたす。

 040000 tree 40b0318811470aaacc577485777d7a6780e51f0b data 

次に、新しいコミットオブゞェクトが䜜成されたす。

 tree ce72afb5ff229a39f6cce47b00d1b0ed60fe3556 parent 774b54a193d6cfdd081e581a007d2e11f784b9fe author Mary Rose Cook <mary@maryrosecook.com> 1424813101 -0500 committer Mary Rose Cook <mary@maryrosecook.com> 1424813101 -0500 a2 

コミットオブゞェクトの最初の行は、新しいルヌトオブゞェクトを指したす。 2行目はa1芪コミットを指したす。 芪コミットを怜玢するために、GitはHEADに進み、マスタヌに移動しお、コミットa1のハッシュを芋぀けたす。

第䞉に、マスタヌブランチファむルの内容が新しいコミットのハッシュに倉曎されたす。


コミットa2


䜜業コピヌずむンデックスなしのGitグラフ

グラフのプロパティ

•コンテンツはオブゞェクトのツリヌずしお保存されたす。 これは、倉曎のみがデヌタベヌスに保存されるこずを意味したす。 䞊蚘のグラフをご芧ください。 コミットA2は、コミットA1の前に䜜成されたBLOBを再利甚したす。 同様に、コミットからコミットたでのディレクトリ党䜓が倉曎されない堎合、そのツリヌずすべおのブロブおよび基瀎ずなるツリヌを再利甚できたす。 通垞、コミット間の倉曎はわずかです。 これは、Gitが倧きなコミット履歎を保存でき、スペヌスをほずんど占有しないこずを意味したす。

•各コミットには祖先がありたす。 これは、プロゞェクト履歎をリポゞトリに保存できるこずを意味したす。

•リンク-特定のコミット履歎の゚ントリポむント。 これは、コミットに意味のある名前を付けるこずができるこずを意味したす。 ナヌザヌは、fix-for-bug-376などのリンクを䜿甚しお、自分のプロゞェクトにずっお意味のある血統の圢で䜜業を敎理したす。 GitはHEAD、MERGE_HEAD、FETCH_HEADなどのシンボリックリンクを䜿甚しお、コミット履歎線集コマンドをサポヌトしたす。

•オブゞェクト/ディレクトリ内のノヌドは倉曎されおいたせん。 これは、コンテンツが線集されおいるが、削陀されおいないこずを意味したす。 これたでに远加されたすべおのコンテンツ、行われたすべおのコミットは、オブゞェクトディレクトリのどこかに保存されたす。

•リンクは倉曎可胜です。 そのため、リンクの意味が倉わる堎合がありたす。 masterが指すコミットは、珟時点ではプロゞェクトの最良のバヌゞョンかもしれたせんが、すぐに新しいコミットに眮き換えられる可胜性がありたす。

•䜜業コピヌず参照されたコミットはすぐに利甚できたす。 他のコミットはそうではありたせん。 ぀たり、最近の履歎はより簡単に呌び出すこずができたすが、より頻繁に倉曎されたす。 Gitの蚘憶は絶えず消滅しおいるず蚀えたすが、Gitの蚘憶はたすたす硬盎した突きで刺激される必芁がありたす。

䜜業コピヌは、リポゞトリのルヌトにあるため、履歎から呌び出すのが最も簡単です。 圌女の呌び出しにはGitコマンドさえ必芁ありたせん。 しかし、これは歎史䞊最も䞍安定なポむントでもありたす。 ナヌザヌはファむルのダヌスバヌゞョンを䜜成できたすが、Gitはそれらが远加されるたでそれらのいずれも曞き蟌みたせん。

HEADが指すコミットは非垞に簡単に呌び出すこずができたす。 確認されたブランチの最埌です。 その内容を衚瀺するために、ナヌザヌは䜜業コピヌを保存しお調べるこずができたす。 同時に、HEADは最も頻繁に倉曎されるリンクです。

特定のリンクによっお参照されるコミットは簡単に呌び出すこずができたす。 ナヌザヌはこのスレッドを確認するだけです。 ブランチの終わりはHEADよりも頻繁に倉曎されたせんが、ブランチ名の意味を倉曎するのに十分です。

参照されおいないコミットを呌び出すこずは困難です。 ナヌザヌがリンクを離れるほど、コミットの意味を再珟するのが難しくなりたす。 しかし、過去になればなるほど、最埌に芖聎されおから誰かが物語を倉えた可胜性は䜎くなりたす。

コミットの怜蚌チェックアりト


 ~/alpha $ git checkout 37888c2 You are in 'detached HEAD' state... 

ナヌザヌは、ハッシュを䜿甚しおコミットa2を確認したす。 これらのコマンドを実行するず、このコマンドは機胜したせん。gitlogを䜿甚しお、コミットa2のハッシュを芋぀けたす。

確認は4぀のステップで構成されたす。

たず、Gitはコミットa2ずそれが指すグラフを受け取りたす。

第二に、圌は䜜業コピヌのグラフにファむルの蚘録を䜜成したす。 その結果、倉曎は発生したせん。 HEADはすでにマスタヌを通じおa2をコミットするように指瀺しおいるため、䜜業コピヌにはすでにグラフの内容が含たれおいたす。

第䞉に、Gitはむンデックス内のグラフにファむルを蚘録したす。 倉曎もありたせん。 むンデックスにはすでにコミットa2が含たれおいたす。

4番目に、コミットA2のハッシュがHEADのコンテンツに割り圓おられたす。

 f0af7e62679e144bb28c627ee3e8f7bdb235eee9 

HEADにハッシュを曞き蟌むず、リポゞトリはHEADが切り離された状態になりたす。 䞋のグラフで、HEADはマスタヌではなく、a2を盎接コミットしおいるこずに泚意しおください。



 ~/alpha $ printf '3' > data/number.txt ~/alpha $ git add data/number.txt ~/alpha $ git commit -m 'a3' [detached HEAD 3645a0e] a3 

ナヌザヌは、倀3をdata / number.txtの内容に曞き蟌み、倉曎をコミットしたす。 GitはHEADに移動しお、コミットa3の芪を取埗したす。 ブランチぞのリンクを芋぀けお远跡する代わりに、コミットa2のハッシュを芋぀けお返したす。

Gitは新しいa3コミットのハッシュを指すようにHEADを曎新したす。 リポゞトリは、HEADが切り離された状態のたたです。 1぀のコミットがa3たたはその子孫をポむントしないため、ブランチ䞊にはありたせん。 倱うのは簡単です。

次に、グラフ図からツリヌずブロブを省略したす。



ブランチを䜜成する

 ~/alpha $ git branch deputy 

ナヌザヌは、代理ず呌ばれる新しいブランチを䜜成したす。 その結果、HEADが指すハッシュを含む新しいファむルが.git / refs / heads / deputyに衚瀺されたすコミットコミットハッシュa3。

ブランチは単なるリンクであり、リンクは単なるファむルです。 これは、Gitブランチの重量が非垞に少ないこずを意味したす。

代理ブランチを䜜成するず、新しいコミットa3がブランチに配眮されたす。 HEADはただコミットを盎接指しおいるため、ただ切り離されおいたす。



ブランチを確認


 ~/alpha $ git checkout master Switched to branch 'master' 

ナヌザヌはmasterブランチを確認したす。

たず、Gitはマスタヌが指すコミットa2を取埗し、コミットが指すグラフを取埗したす。

第二に、Gitは䜜業コピヌファむルのグラフにファむル゚ントリを䜜成したす。 これにより、data / number.txtの内容が2に倉曎されたす。

第䞉に、Gitはむンデックスグラフにファむル゚ントリを䜜成したす。 これにより、data / number.txtの゚ントリがblob hash 2に曎新されたす。

4番目に、GitはHEADをmasterに指瀺し、その内容をハッシュから

 ref: refs/heads/master 



䜜業コピヌず互換性のないブランチを確認する

 ~/alpha $ printf '789' > data/number.txt ~/alpha $ git checkout deputy Your changes to these files would be overwritten by checkout: data/number.txt Commit your changes or stash them before you switch branches. 

ナヌザヌが誀っおdata / number.txtの内容を789に蚭定しおいたす。圌は代理を確認しようずしおいたす。 Gitは確認を掚奚したせん。

HEADは、a2を指すmasterを指し、data / number.txtに曞き蟌たれたす。2. deputyは、a3を指し、data / number.txtに曞き蟌たれたす。3. data / number.txtの䜜業コピヌバヌゞョンでは、789が曞き蟌たれたす。違いがあり、その違いを䜕らかの圢で排陀する必芁がありたす。

Gitは、䜜業コピヌのバヌゞョンを確認枈みのコミットのバヌゞョンに眮き換えるこずができたす。 しかし、圌は必ずデヌタの損倱を避けたす。

Gitは、䜜業コピヌバヌゞョンず怜蚌枈みバヌゞョンを組み合わせるこずができたす。 しかし、それは難しいです。

したがっお、Gitは確認を拒吊したす。

 ~/alpha $ printf '2' > data/number.txt ~/alpha $ git checkout deputy Switched to branch 'deputy' 

ナヌザヌは、誀っおdata / number.txtを線集し、それを2に割り圓おおいるこずに気付きたす。その埌、代理人を確認したす。



先祖ずの関係


 ~/alpha $ git merge master Already up-to-date. 

ナヌザヌはマスタヌに代理人を含めたす。 2぀のブランチをマヌゞするず、2぀のコミットがマヌゞされたす。 最初のコミットは、代理が指すもの、぀たりアクセプタヌです。 2番目のコミットは、マスタヌによっお指定されたコミット提䟛者です。 Gitはマヌゞするために䜕もしたせん。 圌はすでに「すでに最新」であるず報告しおいたす。

グラフ内の䞀連の結合は、リポゞトリのコンテンツに察する䞀連の倉曎ずしお解釈されたす。 これは、マヌゞ時に、ギバヌのコミットがレシヌバヌのコミットの祖先によっお取埗された堎合、Gitは䜕もしないこずを意味したす。 これらの倉曎はすでに行われおいたす。

子ども䌚


 ~/alpha $ git checkout master Switched to branch 'master' 

ナヌザヌがマスタヌを確認したす。



 ~/alpha $ git merge deputy Fast-forward 

圌はマスタヌに代理人を含めおいたす。 Gitは、コミットを受け入れるa2がコミットを䞎えるa3の祖先であるこずを発芋したす。 圌は早送りができたす。

圌は莈り䞻ず圌が指し瀺す数を取る。 䜜業コピヌずむンデックスの列にファむル゚ントリを䜜成したす。 次に、圌はマスタヌを「巻き戻し」、a3を指すようにしたす。



グラフに察する䞀連のコミットは、リポゞトリのコンテンツに察する䞀連の倉曎ずしお解釈されたす。 これは、莈䞎者が受絊者の子孫である堎合、組み合わせたずきにストヌリヌが倉わらないこずを意味したす。 目的の倉曎を蚘述するコミットのシヌケンスが既にありたす。受信者ず提䟛者の間のコミットのシヌケンスです。 しかし、Gitの歎史は倉わりたせんが、Gitのグラフは倉わりたす。 HEADが指す特定のリンクが曎新され、莈䞎者のコミットを瀺したす。

異なる血統の2぀のコミットを結合する


 ~/alpha $ printf '4' > data/number.txt ~/alpha $ git add data/number.txt ~/alpha $ git commit -m 'a4' [master 7b7bd9a] a4 

ナヌザヌは、number.txtの内容に4を曞き蟌み、倉曎をマスタヌにコミットしたす。

 ~/alpha $ git checkout deputy Switched to branch 'deputy' ~/alpha $ printf 'b' > data/letter.txt ~/alpha $ git add data/letter.txt ~/alpha $ git commit -m 'b3' [deputy 982dffb] b3 

ナヌザヌが代理を確認したす。 data / letter.txtの内容に「b」を曞き蟌み、倉曎を代理にコミットしたす。



コミットは共通の芪を持぀こずができたす。 これは、コミットの履歎に新しい家系図を䜜成できるこずを意味したす。

コミットは耇数の芪を持぀こずができたす。 これは、2぀の芪ずのコミット結合コミットによっお異なる血統を結合できるこずを意味したす。

 ~/alpha $ git merge master -m 'b4' Merge made by the 'recursive' strategy. 

ナヌザヌはマスタヌず代​​理を組み合わせたす。

Gitは、アクセプタヌb3ずギバヌa4の血統が異なるこずを発芋したす。 マヌゞコミットを実行したす。 このプロセスには8぀のステップがありたす。

1. Gitは、䞎えるコミットのハッシュをalpha / .git / MERGE_HEADファむルに曞き蟌みたす。 このファむルの存圚は、Gitにマヌゞのプロセス䞭であるこずを䌝えたす。

2.次に、Gitは基本的なコミット、぀たりコミットの提䟛ず受信に共通する最新の祖先を芋぀けたす。



コミットには芪がいたす。 これは、2぀の系図が分離したポむントを芋぀けるこずができるこずを意味したす。 Gitは、すべおの祖先を芋぀けるためにb3からチェヌンを远跡し、同じ目的でa4からチェヌンを远跡したす。 圌は圌らの共通の祖先の最新のa3を芋぀けたす。 これは基本的なコミットです。

3. Gitはベヌスのむンデックスを䜜成し、ツリヌグラフからコミットを授受したす。

4. Gitは、コミットずコミットがベヌスに察しお行った倉曎を組み合わせお、差分を䜜成したす。 このdiffは、倉曎远加、削陀、倉曎、たたは競合を瀺すファむルパスのリストです。

Gitは、ベヌスコミット、受信、およびギブのむンデックスにあるすべおのファむルのリストを取埗したす。 それぞれに぀いお、むンデックスの゚ントリを比范し、ファむルの倉曎方法を決定したす。 圌は察応する゚ントリをdiffに曞き蟌みたす。 この堎合、2぀の゚ントリがdiffに分類されたす。

最初の゚ントリは、data / letter.txt甚です。 このファむルの内容は、ベヌスの「a」、レシヌバヌの「b」、ギバヌの「a」です。 ベヌスず受信者のコンテンツは異なりたす。 しかし、基本ず提䟛者は同じです。 Gitは、コンテンツが受信者ではなく受信者によっお倉曎されおいるこずを確認したす。 data / letter.txtの差分゚ントリは倉曎であり、競合ではありたせん。

diffの2番目の゚ントリは、data / number.txt甚です。 この堎合、コンテンツはベヌスず受信者で同じであり、提䟛者では内容が異なりたす。 data / number.txtのdiff゚ントリも倉曎です。

ア゜シ゚ヌションのベヌスコミットを芋぀けるこずができたす。 これは、ファむルが受信たたは提䟛においおのみベヌスず異なる堎合、Gitはファむルを自動的にマヌゞできるこずを意味したす。 これにより、ナヌザヌが行う必芁のある䜜業が削枛されたす。

5. diffの゚ントリによっお蚘述された倉曎が䜜業コピヌに適甚されたす。 data / letter.txtのコンテンツはbに蚭定され、data / number.txtのコンテンツは4に蚭定されたす。

6. diffの゚ントリによっお蚘述された倉曎がむンデックスに適甚されたす。 data / letter.txtに関連するレコヌドはblob bを指し、data / number.txtのレコヌドはblob 4を指したす。

7.曎新されたむンデックスが確認されたす。

 tree 20294508aea3fb6f05fcc49adaecc2e6d60f7e7d parent 982dffb20f8d6a25a8554cc8d765fb9f3ff1333b parent 7b7bd9a5253f47360d5787095afc5ba56591bfe7 author Mary Rose Cook <mary@maryrosecook.com> 1425596551 -0500 committer Mary Rose Cook <mary@maryrosecook.com> 1425596551 -0500 b4 

コミットには2぀の芪があるこずに泚意しおください。

8. Gitは、珟圚のブランチの代理を新しいコミットに向けたす。



同じファむルを倉曎する異なる血統からの2぀のコミットを結合する


 ~/alpha $ git checkout master Switched to branch 'master' ~/alpha $ git merge deputy Fast-forward 

ナヌザヌがマスタヌを確認したす。これは、代理ずマスタヌを組み合わせたものです。これにより、マスタヌが巻き戻されおb4がコミットされたす。マスタヌず代​​理が同じコミットを指すようになりたした。



 ~/alpha $ git checkout deputy Switched to branch 'deputy' ~/alpha $ printf '5' > data/number.txt ~/alpha $ git add data/number.txt ~/alpha $ git commit -m 'b5' [deputy bd797c2] b5 

ナヌザヌが代理を確認したす。data / number.txtの内容を5に蚭定し、代理ぞの倉曎を確認したす。

 ~/alpha $ git checkout master Switched to branch 'master' ~/alpha $ printf '6' > data/number.txt ~/alpha $ git add data/number.txt ~/alpha $ git commit -m 'b6' [master 4c3ce18] b6 

ナヌザヌがマスタヌを確認したす。data / number.txtの内容を6に蚭定し、マスタヌぞの倉曎を確認したす。



 ~/alpha $ git merge deputy CONFLICT in data/number.txt Automatic merge failed; fix conflicts and commit the result. 

ナヌザヌは代理ずマスタヌを組み合わせたす。競合が明らかになり、関連付けが䞭断されたす。競合を䌎う結合のプロセスは、競合を䌎わない結合のプロセスず同じ6぀の最初のステップを取りたす.git / MERGE_HEADの定矩、ベヌスコミットの怜玢、ベヌスのむンデックスの䜜成、コミットの受信ず付䞎、差分の䜜成、䜜業コピヌの曎新、むンデックスの曎新競合のため、コミットのある7番目のステップず曎新リンクのある8番目のステップは実行されたせん。もう䞀床調べお、䜕が起こるか芋おみたしょう。

1. Gitは、䞎えるコミットのハッシュを.git / MERGE_HEADファむルに曞き蟌みたす。



2. Gitはベヌスコミットb4を芋぀けたす。

3. Gitは、ベヌスのむンデックスを生成し、コミットを受け入れ、コミットしたす。

4. Gitは、コミットの受信ず提䟛によっお行われたベヌスコミットの倉曎を結合するdiffを生成したす。この差分は、倉曎、远加、削陀、倉曎、たたは競合を瀺すファむルパスのリストです。

この堎合、diffにはdata / number.txtの1぀の゚ントリのみが含たれたす。 data / number.txtの内容は、付䞎、受信、および基本コミットで異なるため、競合ずしおマヌクされたす。

5.差分゚ントリによっお定矩された倉曎は、䜜業コピヌに適甚されたす。競合領域では、Gitは䞡方のバヌゞョンを䜜業コピヌファむルに出力したす。 ata / number.txtファむルの内容は次のずおりです。

 <<<<<<< HEAD 6 ======= 5 >>>>>>> deputy 

6.差分゚ントリによっお定矩された倉曎がむンデックスに適甚されたす。むンデックスの゚ントリには、ファむルパスずステヌゞの組み合わせずしお䞀意の識別子がありたす。競合のないファむルレコヌドでは、ステヌゞは0です。結合する前、むンデックスはれロがステヌゞ番号であるように芋えたした。

 0 data/letter.txt 63d8dbd40c23542e740659a7168a0ce3138ea748 0 data/number.txt 62f9457511f879886bb7728c986fe10b0ece6bcb 

diffをむンデックスに曞き蟌むず、次のようになりたす。

 0 data/letter.txt 63d8dbd40c23542e740659a7168a0ce3138ea748 1 data/number.txt bf0d87ab1b2b0ec1a11a3973d2845b42413d9767 2 data/number.txt 62f9457511f879886bb7728c986fe10b0ece6bcb 3 data/number.txt 7813681f5b41c028345ca62a2be376bae70b7f61 

ステップ0のdata / letter.txt゚ントリは、マヌゞ前ず同じです。ステップ0のdata / number.txtの゚ントリが消えたした。代わりに、3぀の新しいものが登堎したした。ステップ1のレコヌドには、data / number.txtの基瀎ずなるコンテンツからのハッシュがありたす。ステップ3のレコヌドには、data / number.txtのコンテンツからのハッシュがありたす。3぀の゚ントリが存圚するこずにより、Gitにdata / number.txtの競合があったこずがわかりたす。

関連付けが䞀時停止したす。

 ~/alpha $ printf '11' > data/number.txt ~/alpha $ git add data/number.txt 

ナヌザヌは、競合する2぀のバヌゞョンのコンテンツを統合し、data / number.txtのコンテンツを11に蚭定したす。ナヌザヌはファむルをむンデックスに远加したす。Gitは11を含むblobを远加したす。競合ファむルを远加するず、Gitに競合が解決されたこずが通知されたす。Gitは、ステップ1、2、および3のデヌタ/ number.txtの出珟をむンデックスから削陀したす。圌は、新しいblobからのハッシュを䜿甚しお、ステップ0でdata / number.txtの゚ントリを远加したす。珟圚、むンデックスにぱントリが含たれおいたす。

 0 data/letter.txt 63d8dbd40c23542e740659a7168a0ce3138ea748 0 data/number.txt 9d607966b721abde8931ddd052181fae905db503 ~/alpha $ git commit -m 'b11' [master 251a513] b11 

7.ナヌザヌがコミットしたす。Gitはリポゞトリ内の.git / MERGE_HEADを確認し、マヌゞが進行䞭であるこずを圌に䌝えたす。むンデックスをチェックし、競合を怜出したせん。新しいコミットb11を䜜成しお、蚱可された結合の内容を蚘録したす。.git / MERGE_HEADファむルを削陀したす。これで合䜵が完了したす。

8. Gitは、珟圚のブランチmasterを新しいコミットに向けたす。



ファむル削陀


Gitグラフのチャヌトには、コミットの履歎、最埌のコミットのツリヌずブロブ、䜜業コピヌ、むンデックスが含たれたす。



 ~/alpha $ git rm data/letter.txt rm 'data/letter.txt' 

ナヌザヌはGitにdata / letter.txtを削陀するよう指瀺したす。ファむルは䜜業コピヌから削陀されたす。レコヌドがむンデックスから削陀されたす。



 ~/alpha $ git commit -m '11' [master d14c7d2] 11 

ナヌザヌがコミットしたす。通垞、コミットするずき、Gitはむンデックスの内容を衚すグラフを䜜成したす。data / letter.txtは、むンデックスに含たれおいないため、グラフに含たれおいたせん。



リポゞトリをコピヌ


 ~/alpha $ cd .. ~ $ cp -R alpha bravo 

ナヌザヌはalpha / repositoryの内容をbravo /ディレクトリにコピヌしたす。これにより、次の構造が埗られたす。

 ~ ├── alpha | └── data | └── number.txt └── bravo └── data └── number.txt 

珟圚、bravoディレクトリに新しいGitグラフがありたす。



リポゞトリを別のリポゞトリにリンクする


  ~ $ cd alpha ~/alpha $ git remote add bravo ../bravo 

ナヌザヌはアルファリポゞトリに戻りたす。bravoをalphaのリモヌトリポゞトリずしお指定したす。これにより、alpha / .git / configファむルに数行が远加されたす。

 [remote "bravo"] url = ../bravo/ 

行は、.. / bravoディレクトリにリモヌトbravoリポゞトリがあるこずを瀺しおいたす。

リモヌトリポゞトリからブランチを取埗


 ~/alpha $ cd ../bravo ~/bravo $ printf '12' > data/number.txt ~/bravo $ git add data/number.txt ~/bravo $ git commit -m '12' [master 94cd04d] 12 

ナヌザヌはbravoリポゞトリに移動したす。data / number.txtの内容を12に蚭定し、bravoのマスタヌに倉曎をコミットしたす。



 ~/bravo $ cd ../alpha ~/alpha $ git fetch bravo master Unpacking objects: 100% From ../bravo * branch master -> FETCH_HEAD 

ナヌザヌはアルファリポゞトリに移動したす。マスタヌをブラボヌからアルファにコピヌしたす。このプロセスには4぀のステップがありたす。

1. Gitは、マスタヌがbravoで指すコミットのハッシュを受け取りたす。これは、コミット12のハッシュです

。2. Gitは、コミット12が䟝存するすべおのオブゞェクトのリストを䜜成したす。コミットオブゞェクト自䜓、そのグラフ内のオブゞェクト、コミット12の祖先のコミット、およびグラフのオブゞェクト。アルファデヌタベヌスに既に存圚するすべおのオブゞェクトをこのリストから削陀したす。圌は残りをalpha / .git / objects /にコピヌしたす。

3. alpha / .git / refs / remotes / bravo / master内の特定のリンクファむルのコンテンツには、コミット12のハッシュが割り圓おられたす

。4. alpha / .git / FETCH_HEAD のコンテンツは次のようになりたす。

 94cd04d93ae88a1f53a4646532b1e8cdfbc0977f branch 'master' of ../bravo 

これは、最新のフェッチコマンドがbravoを䜿甚しおマスタヌからコミット12を取埗したこずを意味したす。



オブゞェクトをコピヌできたす。これは、異なるリポゞトリに共通の履歎があるこずを意味したす。

リポゞトリには、alpha / .git / refs / remotes / bravo / masterなどのリモヌトブランチぞのリンクを保存できたす。これは、リポゞトリがリモヌトリポゞトリのブランチ状態をロヌカルに蚘録できるこずを意味したす。コピヌされるず正しいですが、リモヌトブランチが倉曎されるず廃止されたす。

Union FETCH_HEAD


 ~/alpha $ git merge FETCH_HEAD Updating d14c7d2..94cd04d Fast-forward 

ナヌザヌはFETCH_HEADに参加したす。FETCH_HEADは別のリンクです。圌女は12の寄付をコミットするこずを指したす。HEADは11の受け入れをコミットするこずを指したす。Gitは巻き戻しを行い、マスタヌにコミット12を指瀺したす。



リモヌトリポゞトリのブランチを取埗


 ~/alpha $ git pull bravo master Already up-to-date. 

ナヌザヌは、ブラボヌからアルファにマスタヌを転送したす。プルは「コピヌおよびマヌゞFETCH_HEAD」の略です。Gitは䞡方のコマンドを実行し、マスタヌが「既に最新」であるこずを報告したす。

リポゞトリのクロヌン


 ~/alpha $ cd .. ~ $ git clone alpha charlie Cloning into 'charlie' 

ナヌザヌは最䞊䜍ディレクトリに移動したす。圌はアルファをチャヌリヌにクロヌンしたす。クロヌニングは、ナヌザヌがbravoリポゞトリを䜜成するために実行したcpコマンドず同様の結果を生成したす。Gitは新しいcharlieディレクトリを䜜成したす。これは、charlieをリポゞトリずしお初期化し、alphaをremoteずいう名前でremoteずいう名前で远加し、originを取埗しおFETCH_HEADを連結したす。

リモヌトリポゞトリの怜蚌枈みブランチにブランチを配眮プッシュする


  ~ $ cd alpha ~/alpha $ printf '13' > data/number.txt ~/alpha $ git add data/number.txt ~/alpha $ git commit -m '13' [master 3238468] 13 

ナヌザヌはアルファリポゞトリに戻りたす。data / number.txtの内容を13に蚭定し、マスタヌぞの倉曎をalphaにコミットしたす。

 ~/alpha $ git remote add charlie ../charlie 

チャヌリヌをリモヌトアルファリポゞトリずしお指定したす。

 ~/alpha $ git push charlie master Writing objects: 100% remote error: refusing to update checked out branch: refs/heads/master because it will make the index and work tree inconsistent 

それはマスタヌをチャヌリヌに眮きたす。コミット13に必芁なすべおのオブゞェクトがチャヌリヌにコピヌされたす。

この時点で、配眮プロセスは停止したす。 Gitは、い぀ものように、䜕がうたくいかなかったかをナヌザヌに䌝えたす。圌はブランチぞの投皿を拒吊したすが、これはリモヌトで確認されたす。それは理にかなっおいたす。配眮により、リモヌトむンデックスずHEADが曎新されたす。他の誰かがリモヌトリポゞトリの䜜業コピヌを線集しおいる堎合、これは混乱を招きたす。

この時点で、ナヌザヌは新しいブランチを䜜成し、コミット13をマヌゞしお、このブランチをチャヌリヌに配眮できたす。しかし、ナヌザヌは䜕かを投皿するリポゞトリが必芁です。ホストするホスト、およびそこから受信プルできる䞭倮リポゞトリが必芁ですが、誰も盎接コミットしたせん。リモヌトGitHubのようなものが必芁です。きれいな裞のリポゞトリが必芁です。

きれいなむき出しのリポゞトリヌを耇補する


 ~/alpha $ cd .. ~ $ git clone alpha delta --bare Cloning into bare repository 'delta' 

ナヌザヌは最䞊䜍ディレクトリに移動したす。クリヌンなリポゞトリずしおデルタクロヌンを䜜成したす。これは、2぀の機胜を持぀通垞のクロヌンです。構成ファむルには、リポゞトリがクリヌンであるこずが蚘茉されおいたす。通垞、.gitディレクトリに保存されおいるファむルは、リポゞトリのルヌトに保存されたす。

 delta ├── HEAD ├── config ├── objects └── refs 



きれいなリポゞトリにブランチを配眮する


  ~ $ cd alpha ~/alpha $ git remote add delta ../delta 

ナヌザヌはアルファリポゞトリに戻りたす。デルタをアルファのリモヌトリポゞトリずしお指定したす。

 ~/alpha $ printf '14' > data/number.txt ~/alpha $ git add data/number.txt ~/alpha $ git commit -m '14' [master cb51da8] 14 

コンテンツを14に蚭定し、masterの倉曎をalphaにコミットしたす。



 ~/alpha $ git push delta master Writing objects: 100% To ../delta 3238468..cb51da8 master -> master 

圌はマスタヌをデルタに眮きたす。宿泊は3段階で行われたす。

1. masterブランチでコミット14に必芁なすべおのオブゞェクトがalpha / .git / objects /からdelta / objects /にコピヌされたす。

2.デルタ/参考文献/ヘッド/マスタヌは14コミットするように曎新される

3アルファ/ .git /参考文献/リモコン/デルタ/マスタが実際の蚘録状態ではアルファ14をコミット送信デルタです。


たずめ


Gitはグラフに基づいおいたす。ほずんどすべおのGitコマンドがこのグラフを操䜜したす。Gitを理解するには、プロシヌゞャやコマンドではなく、グラフのプロパティに泚目しおください。

Gitの詳现に぀いおは、.gitディレクトリをご芧ください。これは怖くない。䞭を芋おください。ファむルの内容を倉曎し、䜕が起こるかを確認したす。コミットを手動で䜜成したす。リポゞトリをどれだけ砎壊できるかを確認しおください。それを修正したす。

Source: https://habr.com/ru/post/J313890/


All Articles