DUICUO

Gitの基本

Gitは分散型バージョン管理ツールです。この記事ではまずGitの概要を紹介し、基本的なコマンドと使い方に焦点を当てます。Gitを試用していただき、バージョン管理ツールが開発にもたらす大きな影響を実感していただくことを目的としています。この記事は2つのパートに分かれています。パート1では、よく使われるGitコマンドを紹介し、Gitの基本的な概念と原則を解説します。パート2では、Gitの使い方に焦点を当てます。最後に、GitHubでオープンソースプロジェクトを作成し、Gitの実践的な学習を始めましょう。

1. Git とは何ですか?

GitはWikipediaで、無料の分散型バージョン管理ツール、または速度を重視したソースコード管理ツールと定義されています。Gitはもともと、Linuxカーネルの開発管理のためにLinus Torvaldsによって開発されました。Gitの各作業ディレクトリは、ネットワークや中央サーバーから独立した、完全な履歴とバージョン追跡機能を備えた完全に独立したリポジトリです。

Gitの登場により、多くの開発者やオープンソースプロジェクトにおけるブランチコード管理の負担が軽減されました。ブランチに対する優れた制御性は、開発者が関心のあるプロジェクトに貢献することをさらに促進します。実際、Linuxカーネル、Samba、X.org Server、Ruby on Railsなど、多くのオープンソースプロジェクトは、既にバージョン管理ツールとしてGitに移行しています。私たちのようにコードを書くのが好きな開発者にとって、Gitには2つの大きなメリットがあります。1つは、どこからでも(通勤中の地下鉄の中でも)コードをコミットし、バージョンの変更を確認できること、もう1つは、アイデアを実現するために多数のブランチを作成でき、それらのブランチをマージするオーバーヘッドはほぼ無視できることです。

2. Git 1+1

さて、この記事の本題であるGitの基本的なコマンドと操作の紹介に入りましょう。まずは3つのパート、Gitリポジトリの初期化、基本操作、そしてよく使われる独自のコマンドについて解説します。これらを通して、Gitを使い始めることができるようになります。

Git は通常、次の 2 つの方法で初期化されます。

`git clone`: これは比較的シンプルな初期化方法です。既にリモートGitリポジトリがある場合は、それをローカルにクローンするだけで済みます。例えば、コマンド `git clone git://github.com/someone/some_project.git some_project` は、URL `git://github.com/someone/some_project.git` にあるリモートリポジトリをローカルの `some_project` ディレクトリに完全にクローンします。

`git init` と `git remote`:この方法は少し複雑です。ローカルで作業ディレクトリを作成した後、そのディレクトリに入り、`git init` コマンドを使用して初期化します。Git はディレクトリ内のファイルをバージョン管理します。リモートサーバーに移動する必要がある場合は、リモートサーバー上にディレクトリを作成し、アクセス可能な URL を記録しておきます。その後、`git remote add` コマンドを使用してリモートサーバーを追加します。例えば、`git remote add origin git://github.com/someone/another_project.git` コマンドは、`origin` という名前のリモートサーバーを `git://github.com/someone/another_project.git` という URL で追加します。後でコードをコミットする際には、エイリアス `origin` のみを使用します。

3. 基本的なGitコマンド

ローカル リポジトリとリモート リポジトリが作成されたので、基本的な Git コマンドをいくつか試してみましょう。

`git pull`: ローカルリポジトリを別のリポジトリ(リモートまたはローカル)のコードで更新します。例えば、`git pull origin master` は、`origin` リポジトリのコードをローカルの `master` リポジトリに更新します。この機能は SVN の `update` に似ています。

`git add` は、現在変更中または新しく追加されたファイルを Git インデックスに追加します。Git インデックスに追加すると、バージョン履歴に記録されます。これはコミット前に必要な手順です。例えば、`git add app/model/user.rb` は、ファイル `app/model/user.rb` を Git インデックスに追加します。

`git rm`: 現在の作業スペースとインデックスからファイルを削除します。例: `git rm app/model/user.rb`。

`git commit`: SVNの`commit`コマンドと同様に、現在の作業ディレクトリに変更をコミットします。例えば、`git commit -m "story #3, add user model"`のように実行します。コミット時には、`-m`オプションを使用してコミットメッセージを指定する必要があります。

`git push`: ローカルにコミットされたコードをリモートリポジトリに更新します。例えば、`git push origin` はローカルコードを `origin` という名前のリモートリポジトリに更新します。

git log: 履歴ログを表示する

`git revert`: 以前のバージョンからの変更を元に戻します。特定のGitバージョン番号を指定する必要があります(例:`'git revert bbaf6fb5060b4875b18ff9ff637ce118256d6f20'`)。Gitバージョン番号はハッシュ値として生成されます。

上記のコマンドは、ほぼすべてのバージョン管理ツールで共通です。では、Git特有のコマンドをいくつか試してみましょう。

4. Git特有のコマンド

`git branch`: ブランチの作成、削除、取得などの操作を実行します。例えば、`git branch new_branch` は現在の作業バージョンから `new_branch` という名前の新しいブランチを作成します。`git branch -D new_branch` は `new_branch` という名前のブランチを強制的に削除します。`git branch` はすべてのローカルブランチを一覧表示します。

`git checkout`: Gitの`checkout`には2つの機能があります。1つ目は、異なるブランチ間の切り替えです。例えば、`git checkout new_branch`は`new_branch`ブランチに切り替えます。2つ目は、コードの変更を元に戻します。例えば、`git checkout app/model/user.rb`は、`user.rb`ファイルを前回のコミットから更新し、コミットされていないすべてのコンテンツをロールバックします。

`git rebase`: 次の2つの図でより明確に理解できます。`rebase` コマンドが実行されると、ブランチポイントがCからGに移動し、ブランチにCからGへの移動機能が付与されます。

`git reset`: このコマンドは、現在の作業ディレクトリを指定されたバージョン番号に完全に戻します。例えば、画像に示すように、バージョンAGのコミットが5つあり、バージョンCはbbaf6fb5060b4875b18ff9ff637ce118256d6f20です。`git reset bbaf6fb5060b4875b18ff9ff637ce118256d6f20`を実行すると、バージョンACのコミットは3つだけになります。

`git stash`: 現在コミットされていない作業をGitの作業スタックに保存し、適切なタイミングで再適用できるようにします。これはコマンドの使い方の簡単な概要です。詳細は後のヒントセクションで説明します。

`git config`:このコマンドを使うと、Gitの様々な設定を追加したり変更したりできます。例えば、`git config branch.master.remote origin` は、`master` のリモートリポジトリを `origin` というリポジトリに設定します。ヒントのセクションでは、このコマンドを使ってGitをカスタマイズし、自分だけのGitリポジトリを作成します。

`git tag` を使うと特定のバージョンにタグを付けることができるため、複雑なバージョン番号ハッシュを覚える必要がなくなります。例えば、`git tag revert_version bbaf6fb5060b4875b18ff9ff637ce118256d6f20` とすれば、リバートしたバージョンにタグを付けることができます。後でそのバージョンを確認したいときは、ハッシュ値の代わりに `revert_version` タグ名を使用できます。

Gitがローカルブランチのような便利な機能を提供できるのは、ファイル保存の仕組みによるものです。Gitは独自に定義されたファイルシステムを使用してバージョン管理情報を保存し、コードルートディレクトリに次のようなディレクトリ構造を持つ`.git`フォルダを作成します。


いくつかの重要なファイルとディレクトリについては説明が必要です。HEAD ファイルにはルートノードの情報が格納されます。そのディレクトリ構造はツリー構造を表し、Git はバージョン情報を格納するためにこれを使用するため、HEAD はルートを表します。refs ディレクトリには、現在のバージョン管理ディレクトリ内のさまざまな参照 (参照は、ローカルおよびリモートで使用されるさまざまなツリー ブランチに関する情報を参照します) が格納されます。このディレクトリには、heads、remotes、stash、tags の 4 つのサブディレクトリがあり、それぞれ異なるルート、リモート リポジトリ、Git スタック、タグへの 4 種類の参照が格納されます。コマンド 'git show-ref' を使用すると、参照情報をより明確に表示できます。logs ディレクトリには、さまざまな参照に従ってログ情報が格納されます。したがって、ルートとサブディレクトリの両方に .svn ディレクトリがある SVN とは異なり、Git では完全なバージョン管理情報を記録するために、ルート ディレクトリ内のこの 1 つの .git ディレクトリのみが必要です。では、Git と SVN の違いを見てみましょう。

5. GitとSVNの違い

現在最も広く使われているバージョン管理ツールはSVN(Subversion)です。それと比較して、Gitの最大の利点は、ローカルブランチの追加の容易さと分散性という2点です。

以下の 2 つの画像は、Git と SVN の違いを鮮明に示しています。

ローカルブランチを簡単に作成できるように、Git のローカルおよびサーバーサイドの構造は柔軟で、すべてのバージョンが単一のディレクトリに保存されます。ブランチを切り替えることで、特定のブランチで作業できます。しかし、SVN は全く異なります。ローカルでコードを試す必要がある場合、それぞれが SVN サーバーアドレスに対応する複数のコピーを保持する必要があります。例えば、以前のチームではバージョン管理に SVN を使用していました。あるモジュールを拡張しようとしていたとき、途中でモジュールの動作変更が原因でコードサーバー上の多くのテストが失敗し、コミットできませんでした。その後、上司から 2 時間以内に修正する必要がある緊急のバグがあると連絡がありました。ローカルでのすべての変更を比較し、パッチファイルを出力し、現在のタスクに関連するすべてのコードをロールバックし、バグの修正を開始し、パッチを適用する必要がありました。これは、コードの競合を解決するための作業を含めても、複数の面倒な手順を要しました。しかし、Git では、ブランチを作成するかメインブランチに戻るだけで、いつでもバグ修正タスクを開始できます。完了後は、元のブランチに戻るだけで、前のタスクをスムーズに継続できます。必要に応じて、新しいタスクをブランチとして作成し、完了後にメインブランチにマージすることもできます。簡単でエレガントです。

Git の場合、分散システムではコードをローカルにコミットできます。そのため、上の図では、Git は大きなタスクを複数のローカルコミットに分割するのに有利ですが、SVN ではローカルでの大規模な 1 回限りの変更しか許可されないため、後でメインブランチにマージする際に大きなリスクにつながります。Git のコードログはローカルにあり、いつでも表示できます。SVN のログはサーバー上にあるため、表示するたびにダウンロードする必要があります。私のチームでは、コードサーバーは米国にあり、何年も前のログをダウンロードするのに 10 分もかかり、非常にイライラしていました。Git に移行した後、そのローカルログ機能を活用して、特定のタスクのコード履歴全体をわずか数秒で表示する Rake スクリプトを Ruby で作成し、作業を大幅に簡素化しました。もちろん、分散システムだからといって、Git で中央コードサーバーが必要なくなるわけではありません。チームで作業する場合は、すべてのコードを保存するサーバーが依然として必要です。

要約

この記事では、Gitの基本概念、よく使われるコマンド、そしてその原理についてご紹介します。ぜひご自身で試してみてください。次の記事では、Gitコマンドの使い方やGitに付属するツールについて解説し、最後にGit Hubでオープンソースプロジェクトを作成します。

元のリンク: http://www.open-open.com/lib/view/open1332904495999.html