「.NET 開発基盤部会 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
技術解説の意味が解らんかったので、やっぱ基本は大事。
用語集 †
基本概念 †
リポジトリ(Repository) | Gitで管理されるプロジェクトのデータの保管場所。ローカルリポジトリとリモートリポジトリがある。 |
ワーキングツリー(Working Tree) | 実際に作業を行うディレクトリ。ここでファイルを編集し、変更を加える。 |
インデックス(Index, Staging Area) | git add で追加された変更が一時的に保存される領域。コミット前の準備段階。 |
HEAD | 現在チェックアウトされているブランチの最新のコミットを指すポインタ。 |
ブランチとコミット関連 †
ブランチ(Branch) | コミットの履歴を分岐させる機能。開発の並行作業を可能にする。 |
コミット(Commit) | インデックスに追加された変更を記録する操作。リポジトリの履歴として保存される。 |
マージ(Merge) | 異なるブランチの変更を統合する操作。 |
リベース(Rebase) | ブランチの基点を変更し、履歴を整理する操作。 |
チェリーピック(Cherry-pick) | 特定のコミットのみを別のブランチに適用する操作。 |
タグ(Tag) | 特定のコミットに名前を付ける機能。リリースバージョン管理などに使用される。 |
リモートリポジトリ関連 †
リモート(Remote) | ネットワーク上にあるリポジトリ。GitHubやGitLabなどを指す。 |
フェッチ(Fetch) | リモートリポジトリの最新の変更を取得するが、ローカルのブランチには適用しない操作。 |
プル(Pull) | fetch + merge を行い、リモートの変更をローカルに適用する操作。 |
プッシュ(Push) | ローカルリポジトリの変更をリモートリポジトリへ送信する操作。 |
クローン(Clone) | リモートリポジトリをローカルに複製する操作。 |
履歴管理とトラブルシューティング †
ログ(Log) | git log で過去のコミット履歴を表示するコマンド。 |
リセット(Reset) | コミットの状態を過去の状態に戻す操作。--soft, --mixed, --hard などのオプションがある。 |
リバート(Revert) | 既存のコミットを打ち消す新しいコミットを作成する操作。履歴を残しつつ修正できる。 |
ステータス(Status) | git status で作業ツリーの状態を確認するコマンド。 |
ディフ(Diff) | git diff で変更点を比較するコマンド。 |
スタッシュ(Stash) | 作業中の変更を一時的に退避する機能。git stash で退避し、git stash pop で戻す。 |
基本操作 †
ほとんど全ての操作がローカル †
- 分散バージョン管理システム (DVCS) として設計されているので、
- ローカルだけで作業できる(ローカルの作成にリモートが必要だが)。
- 後に要所・要所でローカルで作業してリモートと同期する。
チェックサムde完全性 †
Gitでは、すべてのオブジェクト(ファイル、ディレクトリ、コミットなど)にハッシュが関連付けられ、これを元にデータが管理される。
コミットはスナップショット †
Gitのコミットはスナップショットで、差分ではない?
- 他のVCS (CVS、Subversionとその類を含む)は差分
- 各コミットでは、ファイルの変更点 (diff) のみ記録する方式
- 履歴を取得する際には前のバージョンから順番に差分を適用して復元する必要がある。
- Gitはファイルのスナップショット
- 各コミットで全体のスナップショットを保存(変更ファイルの完全なコピー)
- 差分自体ではないが、内部的には効率的に差分を管理する仕組みとなっている。
- また、変更のないファイルについては前回のバージョンへの参照を持つ。
- 過去のバージョンの取得やブランチの切り替えが高速になる利点がある。
これにより、過去のバージョンの取得やブランチの切り替えが高速になる。
ブランチの統合はマージ&コミット †
- ブランチの統合はファイル間の差異をそれぞれマージしてコミットする。
- マージでは、コンフリクトが無ければ自動的に行われる。マージ後、確認してコミット。
- この際、2つの分岐をマージした結果のコミットを特別にマージコミットと呼ぶ。
- なお、ブランチしたが実際には分岐していない場合はマージコミットされない(Fast-Forward Merge)。
- 従ってGitHub
- 分散開発が可能な仕組みとなっている。
- デメリットとしてコンフリクトが発生し得る。
- コンフリクトは手動でマージして解決する必要がある。
プル、プッシュ、プルリクエスト †
- Gitにはローカルブランチとリモートブランチがある。
- ローカルブランチ:
開発者のPC上に存在する作業用ブランチ、直接編集可能。
- リモートブランチ:
- サーバー上に存在するチーム共有ブランチ、直接編集不可能。
- 直接編集ではなくローカルからリモートに変更をプッシュして編集する。
- リモートをローカルにクローン
- 先ず、リモートのリポジトリをローカルにクローンする。
- リポジトリの変更履歴として、1~複数のブランチが含まれる。
- ココではブランチにはMasterとMasterから分岐したFeatureがある状態とする。
- ローカルブランチでリモートブランチをプルし(最新の変更を取り込み)ながら開発を遂行する。
- ローカルブランチでは、Featureブランチに対して開発を行う。
- プル=フェッチ+マージで、リモート、ローカルのブランチ間の変更を統合する(Master →(プル)→ Feature)。
- マージは既出で、フェッチとは、マージ前に変更を取得する行為。
- ローカルブランチの変更をリモートブランチへプッシュ
- プッシュはクローンの逆でローカルの変更履歴をリモートに同期する。
- Masterをプッシュするか?Featureをプッシュするかでシナリオが異なる。
- (Master →(プッシュ)→ Master)(Feature →(プッシュ)→ Feature)
- ローカルでマージ(した場合、Masterをプッシュ
- ローカルでブランチをマージ(Feature →(マージ)→ Master)
- Masterブランチをプッシュすればそれで完了する。
- リモートでマージ(する場合、Featureをプッシュ
- Featureをプッシュしプルリクエストを送る
- プルリクエストはGitではなくGitホスティングサービスの機能
- コレでリモートのMasterにFeatureの変更の取り込みを要求する。
- プルリクエストは、リモートでプル(ではなくマージ)をリクエストする。
- コレによりリモートでブランチをマージする(Feature →(マージ)→ Master)
変更履歴の有向非巡回グラフ †
- Gitのグラフとは、変更履歴を表す有向非巡回グラフ
- グラフは、各コミットがノードとなり、親コミットへの参照(エッジ)を持つ。
- 変更履歴には単純な「コミット」や「分岐(ブランチ)」を「統合(マージ)」した「マージコミット」が含まれる。
仕組み †
三つの状態 †
- 修正済、ステージ済、コミット済
- スナップショットはコミット時にのみ作成される。
修正済 †
ファイルに変更を加えたが、databaseにそれがまだコミットされていない状態
ステージ済 †
次のスナップショットのコミットに加えるために、
現在のバージョンの修正されたファイルに印をつけている状態。
コミット済 †
local databaseにデータが安全に格納されている状態
ファイルの状態 †
git status でファイルの状態を確認できる。
gitに認識されているか、いないか? †
- 追跡されている (tracked)
- 追跡されてない (untraced)
追跡されているファイルの3つの状態 †
- 変更されていない (unmodified)
- 変更されている (modified)
- ステージされている (staged)
Gitプロジェクト(ディレクトリ内) †
Gitディレクトリ †
プロジェクトのためのメタデータとオブジェクトのdatabaseがあるところ。
作業ディレクトリ †
プロジェクトの一つのバージョンの単一checkout
ステージング・エリア †
- インデックス or ステージング・エリア と呼ばれる。
- 次のコミットに何が含まれるかに関しての情報を蓄えた一つのファイル。
- git addでファイルをステージング・エリアに追加できる。
参考 †
@IT †
git-scm.com †
リファレンス †