原文はこちらです。 ※この記事は「チュートリアル」からの転載です。
Git は、Subversion、CVS、Mercurial などのバージョン管理システムから移行するのに最適な分散管理システムです。複数の開発者が同時に 1 つのプロジェクトに貢献していて修正量が膨大な時に有効な道具です。無料の Github を使って git 入門をしましょう。
git は、他のバージョン管理システムとは考え方が異なります。昔の RCS はファイルの変更履歴を取得しており、その内容は、コンフィギュレーション ファイルを見るとわかるようになっていました。Git は、もっとファイル システムのスナップショットに似た発想でできています。すべてのコミットや状態は、完全なスナップショットの形で格納され、従来の差分ファイルは存在しません。Git はスナップショット間の変更のみを記録し、変更がないファイルはリンクすることにより、容量を節約します。すべての変更にはチェックサムがつけられており、データの整合性が保証されるとともに、変更の無効化を行うことができます。
すべての作業をローカル PC 上で行った後、リモート リポジトリへのプッシュを行うので、効率よくできます。プッシュするまで、リモートレポジトリは影響を受けないので、全ての作業を安全に進めることができます。さらに、ブランチという安全弁があります。Git のブランチ システムは良くできています。マスター ブランチから新しくブランチを作ります。実験的に修正をし、テストします。そして、アップストリームにプッシュします。アップストリームにプッシュした時に、他の開発者がその修正を使うことができるようになります。または、プル リクエストを出してレビューを要求し、レビュー通過後、マスターへのマージをすることもできます。
これほど注意深くしてマスターを壊してしまったとしても、リバートを行うことで元に戻すことができます。
Github で演習
手っ取り早く Git を実際的に学ぶには、Github にアカウントを持つことです。図 1 は、”playground” と名付けた著者の Github テストベッドです。新しくアカウントを作成すると、新しくレポが作成され、README ファイル、ライセンスとバグ レポート、プル リクエスト、Wiki 用のボタンなど多数が用意されます。
無料の Github アカウントは、パブリックなリポジトリだけ許可されています。つまり、誰もが参照したりダウンロードしたりできます。Github アカウントを持ち、あなたが開発者として承認した人だけがコミットできます。もし、非公開のレポを持ちたい場合は、有料会員になる必要があります。ひと月 7 ドルで、5 つの非公開レポと、開発者数に制限のない公開レポを持つことができます。
Github は、リポジトリ クローン用に、URL コピー貼り付け機能を提供しています。自分のコンピューターに自身用のリポジトリを作成し、そこにリポジトリをクローンできます。
$ mkdir git-repos $ cd git-repos $ git clone https://github.com/AlracWebmaven/playground.git Cloning into 'playground'... remote: Counting objects: 4, done. remote: Compressing objects: 100% (4/4), done. remote: Total 4 (delta 0), reused 0 (delta 0) Unpacking objects: 100% (4/4), done. Checking connectivity... done. $ ls playground/ LICENSE README.md
すべてのファイルが手元の PC にコピーされます。他のファイルと同様に読み書き、編集、削除を行うことができます。README.md を修正しながら、git の branching 機能の素晴らしさを見ていきましょう。
Branching
Git のブランチは、変更を修正するための仕組みとして安全で優れています。自由に作成、破棄ができます。README.md を編集してみましょう。
$ cd playground $ git checkout -b test Switched to a new branch 'test'
git status コマンドで、どのブランチを作業しているか、確認します。
$ git status On branch test nothing to commit, working directory clean
作成したブランチを確認します。
$ git branch * test master
アスタリスク (*) は、作業中のブランチを意味します。master が主となるブランチです。master には、ブランチでのテストが完了するまで、変更を適用してはなりません。README.md を修正して、状態をチェックしましょう。
$ git status On branch test Changes not staged for commit: (use "git add ..." to update what will be committed) (use "git checkout -- ..." to discard changes in working directory) modified: README.md no changes added to commit (use "git add" and/or "git commit -a")
うまくできているようですね。Git コマンドで状況が確認でき、ヒントもわかりました。変更を破棄するためには、次のコマンドを投入します。
$ git checkout README.md
次のコマンドですべてのブランチを破棄できます。
$ git checkout master $ git branch -D test
ファイルの変更履歴を見るコマンドです。
$ git add README.md $ git status On branch test Changes to be committed: (use "git reset HEAD ..." to unstage) modified: README.md
現在、Git は README.md をトラッキングしていて、このファイルはすべてのブランチで使用可能です。考えが変わってこのファイルのトラッキングが不要になった時は、Git のヒントにあるように、git reset HEAD README.md を実行します。これを含む Git のすべての履歴はリポジトリの .git ディレクトリに格納されています。ファイル、チェックサム、誰が何をしたか、リモート、ローカル リポジトリのすべてが、平文で格納されています。
複数ファイルを追加する時は、次のようにします。git add file1 file2 のように 1 つずつ追加しても良いですし、git add * でも追加できます。
ファイルを削除したい時は、git rm filename コマンドを実行します。このコマンドは、git からファイルを ”un-stage” するだけで、あなたのシステムからは削除しません。たくさんのファイルを削除する時は、git add -u を使ってください。
ファイルのコミット
修正したファイルをコミットしましょう。これにより、ファイルがブランチに追加され、他のブランチからは見ることができなくなります。
$ git commit README.md [test 5badf67] changes to readme 1 file changed, 1 insertion(+)
コミット メッセージを入れるように促されます。本来は詳細を入れるべきでしょうが、ここでは省略します。これで、修正済みのファイルが test ブランチにコミットされました。この段階では、まだ master へのマージもアップストリームへのプッシュも行われません。test にあるだけです。他にすべきことがあるならば、ちょうどよい頃合いです。
複数ファイルのコミットをしてみましょう。特定のファイル、すべてのファイルのコミットができます。
$ git commit file1 file2 $ git commit -a
ブランチにあるが、アップストリームにプッシュされていないコミットの確認をしましょう。git status ではわかりません。
$ git log --branches --not --remotes commit 5badf677c55d0c53ca13d9753344a2a71de03199 Author: Carla Schroder Date: Thu Nov 20 10:19:38 2014 -0800 changes to readme
これで、マージされていないコミットがわかります。全コミットがアップストリームにプッシュされていれば、何も表示されません。では、このコミットをプッシュします。
$ git push origin test Counting objects: 7, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 324 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) To https://github.com/AlracWebmaven/playground.git * [new branch] test -> test
Github ログイン credential を要求される場合があります。Git は標準で 15 分間キャッシュしていますが、この時間は、以下のように変更可能です。
$ git config --global credential.helper 'cache --timeout=7200'
github に行って、新しいブランチを見てみましょう。github は全ブランチを表示しています。他ブランチのファイルを見ることができます (図 2)。
“Compare & Pull Request” ボタンを押して、プル リクエストを出します。これにより、master にマージする前に変更のレビューを要求します。コマンド ラインからプル リクエストを出すこともできます。しかし、すべての作業をより簡単に Web 上の操作で完了できるツールがあるので、今後、Github のボタンを使っていくことにします。
ファイルのプレーン テキスト形式での表示や、複数のマークアップ言語のサポートをしているので、容易にファイル内容を見ることができます。この時点で、同じブランチに他の変更をプッシュできます。Github 上で直接ファイルを編集できますが、オンライン バージョンとローカル バージョンの衝突に気をつけてください。変更が問題なければ、”Merge pull request” ボタンをクリックしてください。2 回クリックする必要があります。Github は、この修正が問題なくマージできるか調べます。もし矛盾・衝突があれば、修正する必要があります。
複数のブランチがある時、ブランチ リストの右にある ”Edit” ボタンをクリックして、どのブランチをマージするかを簡単に選択できます (図 3)。
マージが完了したら、”Delete Brach” ボタンを使ってすべてをきれいにします。ローカル コンピューター上においても、master へ変更を最初にプルしてブランチを消去します。こうして、Git と矛盾なくブランチを消すことができます。
$ git checkout master $ git pull origin master $ git branch -d test
大文字オプション ”-D” を使用すると、強制的にブランチを消します。
$ git branch -D test
変更のリバート
Git のポイント、クリックというインタフェースは、使いやすいものです。全変更をリストし、ボタンをクリックすることで、必要なものをリバートできます。削除したブランチを復活することもできます。
同じことをコマンド ラインからも実行できます。これについては、長くなるので別に紹介します。もっと、知りたい人は、Git book を参照してください。