gitとは, anchor.png

Subversion に代わる新しいバージョン管理システムということで,Git(Linusは「ギット」と発音している)。
AndroidもGitで管理されているらしい。というよりも,GitはLinuxカーネルの管理を目的としてLinus Torvalds氏が開発したものだそうだ :)

Linusはトランスメタ時代にCVSを使えと言われて,その時にCVSを憎むほど嫌いになったらしい。 Subversion に対しては,史上最大の無意味なプロジェクトであると思っていると言っている。SubversionがCVSの改良というスタンスで開発された訳が,その理由になっている。

集中型バージョン管理システムとの違い
従来の集中型バージョン管理システム(CVSやSubversion)とGitの違いは,Gitが分散型であるということ。

SubversionとGitと比較してみる。

Page Top

Subversionでの管理方法 anchor.png

svn.png

Subversionでは中央リジトリが1つあって,各ユーザーはリポジトリ*1からチェックアウトを行い,作業コピーを取得する。

作業コピーで必要な修正を行った後,修正内容をコミットとしてリポジトリへ反映する。
またリポジトリからの修正を取り込むために,アップデートを行ったりする。

このように常に管理対象のリポジトリが1つなので,特に操作に戸惑うことはない。

重要なのは,コミットという操作が共用リポジトリへ反映されるということなのだが,このことは,完全には機能しない途中段階のコードは,一切コミットできないことを意味するとも言える。

Page Top

Gitでの管理方法 anchor.png

git.png

これに対してGitでは複数のリポジトリを使用する。

リモートリポジトリ*2から,クローンという作業でリポジトリの複製(ローカルリポジトリ)を作成する。

修正は複製したローカルリポジトリに対して行って,リモートリポジトリへ反映するにはコミットではなくプッシュという操作を行う。
コミットという操作もあるが,それはローカルリポジトリを対象とした操作のことになる。

この仕組みにより,ファイルを管理している格納先を中央の1箇所ではなく,いろいろな所に持てることになる。

Linuxカーネルの開発のはじめの頃は,開発している多くの人たちがLinux Kernel Mailing Listにパッチを投稿して,それをソースに反映させるという開発スタイルだったようだ。
これでは作業が大変だということで,あるバージョン管理システムを使ってみたのだが機能に問題があってGitを開発したらしい。

ということで,Linuxカーネルではすごい量のソースコード・変更点の抽出・リポジトリ操作なんかが日々あるわけで,これらの管理が問題なく行えているのでGitの性能は折り紙付きなわけです。

同じバージョン管理システムでも,中央集権型と分散型では作業手番が異なっていて,同じような操作名(例:コミット)でも,違った動作になったりするので時々混乱する。

Gitを使った作業フローとしては,

  • リモートリポジトリからコピーする
    リモートリポジトリは専用のサーバに配置して,複数人で共有するためのリポジトリの事。
    そこから,ローカルリポジトリ(ユーザ一人ひとりが作業を行うために,自分の手元のマシン上に配置するリポジトリ)にファイルをコピーする。
    このローカルリポジトリから必要なファイルを,ワーキングディレクトリ(作業をする)に配置しておく。
  • ワーキングディレクトリのファイルを編集し,コンテンツの修正・追加・削除などを行う
  • ローカルリポジトリへコミットする
    普段の作業はローカルリポジトリを使って,全て手元のマシン上でファイルの変更等を管理する。
  • リモートリポジトリへ変更内容を反映させる
    ローカルリポジトリでの更新された内容を,リモートリポジトリに反映させる。
    これにより,共有するファイル類を更新することができる。

のように行う。

Page Top

Gitの良い点 anchor.png

例えば「ある使用ライブラリを1.xから2.xにバージョンアップする」という作業を考えてみます。

作業タスクは,以下の様な感じになります。

  1. 既存ライブラリの削除(1.xは削除して2.xにするために)
  2. 2.xのライブラリをプロジェクトに取り込む
  3. 1.xから2.xで変更となったAPIの反映
  4. Licence表記の変更(必要があれば)

これらの変更作業は,それぞれ独立していると考えられる。(それぞれの作業にゴールがある)

これをSubversionで管理している場合は,すべての作業が間違いなく完了していないと共有リポジトリにはコミット出来ない。

この事は,以下のことを意味する。

  • コミット前の動作確認で正しく動作しない場合,自分がどこで間違えたか分からない。
  • ソフトウェアのコードレビューをする人は,すべての修正作業をまとめてレビューして検証する必要がある。

これが,もしローカルコミットが出来るとどうなるかというと,

  1. 既存ライブラリの削除(1.xは削除して2.xにするために)
    <コミット1>
  2. 2.xのライブラリファイルをプロジェクトに取り込む
    <コミット2>
  3. 1.xから2.xで変更となったAPIの反映
    <コミット3>
  4. Licence表記の変更(必要があれば)
    <コミット4>

それぞれの作業タスクで,差分を確認してコミットをすることが出来るようになる。
この段階では共有リポジトリへの反映はしていないため,他の開発者への影響は全くありません。

つまりローカルコミットがない場合と比べて,どのような変化が起こるかと言うと,

  • コミット前の動作確認で正しく動作しない場合,コミット単位で間違いを探せる
    差分(diff)あるいは過去コミットのチェックアウトすることで確認できる。
  • コードレビューをする人は,それぞれのコミット(独立した作業単位)でレビューして検証出来る
    作業単位でレビューできるので集中することができる。

のようになりSubversionを使った場合の問題が解決しています。

この構造を採用したバージョン管理がGitになる。ここがSubversionに比べてGitが優れている点になると思う。

Page Top

Gitの基本 anchor.png

Gitには管理している領域に4つの領域があります。

手元のPCに存在するワークディレクトリステージングエリアローカルリポジトリという3つと,ネットワーク越しに存在するリモートリポジトリです。

基本.png
Page Top

履歴を管理するリポジトリ anchor.png

リポジトリとは,ファイルやディレクトリの状態を記録する場所です。
保存された状態は,内容の変更履歴として格納されています。
変更履歴を管理したいディレクトリをリポジトリの管理下に置くことで,そのディレクトリ内のファイルやディレクトリの変更履歴を記録することが出来ます。

リポジトリ1.png
Page Top

リモートリポジトリとローカルリポジトリ anchor.png

Gitのリポジトリには,リモートリポジトリローカルリポジトリの2種類があります。

  • リモートリポジトリ
    ファイルが共有できるファイルサーバー等に配置して,複数人でファイルを共有するためのリポジトリ。
  • ローカルリポジトリ
    ユーザ一毎の利用のために,自分のPC上に配置するリポジトリ。

リポジトリをリモートとローカルの2種類に分けることで,普段の作業はローカルリポジトリ(ローカルリポジトリは自分のPCの任意のディレクトリに作成できる。)を使って全て自分のPC上で行うことが出来ます。
自分のローカルリポジトリで作業した内容をみんなと共有するために,リモートリポジトリにファイルをアップロードして共有・公開します。
また,リモートリポジトリを通して,他の人の作業内容を取得することが出来ます。

Page Top

ワークディレクトリとインデックス anchor.png

各個人が実際に作業をしているディレクトリのことを,Gitではワークディレクトリとかワークツリー''と言っている。

そして,リポジトリとワークツリーの間にはステージングとかインデックスと呼ばれているところがあります。
インデックスは,ローカルリポジトリにコミットする準備をするための場所になります。

流れ.png

Gitは,コミットを実行した時にワークツリーから直接ローカルリポジトリ内に状態を記録するのでなく,その間に設けられているインデックスの設定された状態を記録するように処理されます。
このため,コミットを使ってファイルの状態を記録するためには,まずインデックスにファイルを登録する必要があります。

このようにインデックスを間に入れることで,ワークツリー内の必要ないファイルを含めずにコミットを行ったり,ファイルの一部の変更だけをインデックスに登録してコミットすることが出来るようになります。

Page Top

Gitのインストール anchor.png

PCにGitをインストールする。

Page Top

Gitの使い方 anchor.png

Gitの使い方について。

Page Top

Gitで扱えるリモートリポジトリのタイプとアクセス方法 anchor.png

リモートリポジトリのタイプとアクセス方法

Page Top

リモートリポジトリ(共有リポジトリ)の作成と運用 anchor.png

リモートリポジトリ(共有リポジトリ)の作成と運用の仕方

Page Top

GitリポジトリホスティングサービスとGit管理ツール anchor.png

リポジトリホスティングサービスとGit管理ツールについて。


*1 リポジトリとは直訳すると貯蔵庫,倉庫といった意味のようだ。コンピューターだとデータを保管・集積する場所として使われるが,バージョン管理システムでのリポジトリは,それによって管理されたファイル群を指している。
*2 Subversionで言うところの中央リポジトリ。

新しくコメントをつける

題名
ゲスト名
投稿本文
より詳細なコメント入力フォームへ

トップ   凍結 差分 バックアップ 複製 名前変更 リロード   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom
Counter: 811, today: 1, yesterday: 1
最終更新: 2020-12-26 (土) 15:07:53 (JST) (1652d) by yuji