逐語https://www.dazhuanlan.com/2019/08/25/5d622c99b2cb2/
Gitリポジトリの中核となる概念へのガイド
私はGitのを学ぶ前に、私は別のVCSを使用したことがありません。だから私は、他のVCSの詳細についてはあまり知りません。あなたはGitリポジトリへの別のVCSのあなたの過去の知識を適用してはならないので、しかし、多分これは良いことです。多くの人々は、Gitが学ぶことは難しいと思います。多分これは理由の一つです。
しかし、Gitのような複雑なシステムは、あなたは彼らが実際にどのように動作するかを理解一度理解することがはるかに容易になります。ここでは、少なくともGitはボンネットの下にどのように動作するかのいくつかの詳細を説明することができるものがについて話します。私たちは、ブランチやタグがどのように機能するか、作業をコミットする方法、その基本的なオブジェクトストレージなど、Gitリポジトリの中核概念のいくつかを見てみましょうしようとしています。だから我々は、Gitの内の1つのコマンドが使用されているかを教えてくれません。私たちはあなたのGitのコマンドの後ろに何かを伝えたいです。うまくいけば、それはすべての終わりに、あなたはこれらの概念をしっかりと理解を持っているだろうと自信を持ってGitリポジトリのより高度な機能の一部を使用することができるようになります。したがって、このガイドはGitの初心者のための入門することを意図していないことを覚えておいてください。
リポジトリ
Gitリポジトリの中核となるのリポジトリです。Gitのリポジトリは本当に単純なキーと値のデータストアです。これは、Gitリポジトリに格納されているものです。
- ブロブ Gitの中で最も基本的なデータ型です。基本的に、ブロブは、バイトのちょうど束です。通常、ファイルのバイナリ表現。
- ツリーオブジェクトビットディレクトリのようなものです。ツリーオブジェクトは、BLOBと他のツリーオブジェクトへのポインタを含めることができます。
- オブジェクトコミット単一のツリーオブジェクトを指す、と著者をコミットし、すべての親がコミットを含むいくつかのメタデータが含まれます。
- タグオブジェクト、単一のコミットオブジェクトを指す、といくつかのメタデータをcotain。
- 参照単一のオブジェクト(通常コミットオブジェクトやタグオブジェクト)へのポインタです。
Gitのリポジトリについて覚えておくために、インポート事は、それが単一で完全に存在していることである.gitプロジェクトのルートディレクトリ。インポートディレクトリは.git /オブジェクト、wherse Gitの店舗そのオブジェクトのすべてを、そして.git /レフリー、Gitの店舗の参照がすべて。
ツリーオブジェクト
Gitリポジトリのツリーオブジェクトには、ディレクトリと考えることができます。これは、ブロブ(ファイル)や他のツリーオブジェクト(サブディレクトリ)のリストが含まれています。
ルート・ツリー・オブジェクトを考えると、我々は全体の作業ツリーの状態を把握するために、すべてのツリーオブジェクトを再帰することができます。ルート・ツリー・オブジェクトは、それゆえ、本質的であるSNAPSHOT与えられた時点でのリポジトリの。それはGitリポジトリの高fficiencyの一方の主な理由であるため、コンセプトSNAPSHOTに気づくように注意してください。
コミット
コミットオブジェクトは、本質的に重要なメタデータのいくつかの作品が含まれているポインタです。自分自身をコミットするには、それに含まれるメタデータの組み合わせから構築されたハッシュを、持っています:
- コミット時のツリー(ルート・ツリー・オブジェクト)のハッシュ。私たちが学んだようにツリーオブジェクト、これは単一でコミットすることを意味し、Gitはツリーに再帰によって全体の作業ツリーを構築することができます。
- 任意の親コミットのハッシュ。これは、リポジトリにその歴史を与えるものである:すべてのは非常に最初のコミットに戻って、親がコミットしているすべての方法をコミットします。
- 著者の名前と電子メールアドレス、および変更が執筆したことの時間。
- コミッターの名前と電子メールアドレス、および行われたコミット時間。
- メッセージをコミットします。
git show --format=raw COMMIT-ID
このコマンドを使用して、我々は新たに作成されたのコミットのメタデータを見ることができます。
参照
まず第一に、我々はGitの中のすべてのオブジェクトはハッシュでINDENTIFIEDされていることを知っておく必要があります。しかし、あなたは、あなたが操作したいすべてのオブジェクトのハッシュを覚えておく必要があります。これらのハッシュを暗記することからあなたを保存するには、Gitは参照または「参考文献」があります。参照は、単にのどこかに格納されたファイルである.git /参考文献コミットオブジェクトのハッシュを含みます。Gitは参照して指しているコミットている私たちに伝えることができますshow
し、rev-parse
コマンド。
$ git show rev-parse master e439c576b191fd9cb797fd9a27f4b7c617abfd21
Gitはまた、特別な参照を持っていますHEAD
。これは、現在のブランチではなくコミット実際の先端を指し、「シンボリック」基準です。ことが実際に可能であるHEAD
コミットオブジェクトを直接指すように。これが発生すると、Gitはあなたが「デタッチHEAD状態」にあることを教えてくれます。
支店
Gitの中ブランチはGitリポジトリのブランチは、一般的にその最強の機能として考えられている理由である非常に軽量です。彼らはただの言及だから枝がGitの中でとても軽量である理由があります。枝の二種類の支店およびリモート追跡ブランチです。
タグ
軽量タグと注釈付きのタグ - Gitリポジトリ内のタグの2種類があります。
表面には、タグのこれらの2つのタイプは非常に似ています。どちらもに保存されている参照です.git/refs/tags
。しかし、それはおよそ限り類似点が行くようです。本当の違いは、軽量タグと注釈付きのタグの間にあります。
デフォルトでは、コマンドは、git tag
軽量のタグを作成します。しかし、であるこのタグに細心の注意を払うタグオブジェクトではありません。それはちょうど、現在のコミットオブジェクトを指す参照です。
今度は、注釈付きのタグを見てみましょう:
$ git tag -a -m "Tagged 1.0" 1.0
このコマンドは、指定された注釈付きのタグが作成されます1.0。ここで何をはるかに注意が必要なのは、それが作成することで、タグのオブジェクトではなく、タグの参照を。それが指すことをコミットするタグオブジェクトは別個です。同様にコミットへのポインタを含むとして、タグオブジェクトは、タガー約タグメッセージ及びINFOMATIONを格納します。タグオブジェクトもで署名することができGPGキーコミットまたは電子メールのなりすましを防止します。
マージ
Gitリポジトリにマージする2つの履歴(通常は枝)を接合する工程です。私たちは、マスターからの二つのブランチを作成し、それぞれいくつかの作業を行っていると言います。この時点で、歴史はこのようになります。
今、私たちはにバグ修正をもたらすことができるmaster
ので、我々はそれをタグ付けし、それを解放することができます。のは、合併後に何が起こるか見てみましょう。
私たちは、どのようにGitのmensions見ることができます早送りをマージ中。これが意味することでコミットがすべてということですhotfix
から、すぐ上流ましたmaster
。これは、Gitは単に移動することができますmaster
ツリーへのポインタをアップhotfix
。
その後のは、試してみて、マージしてみましょうfeature-branch
にmaster
。
今回は、Gitは早送りを実行することができませんでした。これは、feature-branch
直接、上流からではありませんmaster
。このような状況に来たとき、Gitは実際に両親からある新しい「マージ」コミットを作成feature-branch
してをmaster
。そして、これはと呼ばれているコミットマージ。
次はそれらをマージする前に、機能ブランチをリベースすることにより、非早送りマージのこの種のを防ぐためにどのように表示されますmaster
。
リベース
This part is gonna be hard because of the extrordinay amount of scaremongering around rebasing which you can read from the Internet. First of all, let's take a quick look at the cherry-picking. I'm gonna tell you that cherry-picking exists in a special situation from rebasing.
Cherry-picking
What git cherry-pick
does is take one or more commits, and replay them on top of the current commit. It's like you get a patch from one commit and apply it on your current commit. All git cherry-pick
does is apply one from a commit one by one. But what if you want to play a chain of commits on the other one, e.g., master
branch. Actually, you don't have to use git cherry-pick
command many times.
rebaseing (continued)
$ git rebase master foo
フォーマットではgit rebase <base> <target>
、rebase
コマンドからコミットのすべてを取る<target>
、との上にそれらを淡い<base>
一つずつ。それはactuall変更せずにこれを行い<base>
、その最終的な結果は、線形歴史ある<base>
に早送りすることができ<target>
。
今のところ、私は終わりです。しかし、より多くのコンテンツがあるでしょう。