本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、「git remote」コマンドの応用編として、共有ディレクトリ上でリモートリポジトリを作成し、コミットを同期する例を紹介します。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitのリモートリポジトリを追加、削除する「git remote」コマンドです。応用編として、共有ディレクトリ上でリモートリポジトリの作成し、コミットを同期する例を紹介します。
「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアやWebサイトのソースコード、ドキュメントの管理などに用いられています。
ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。
Gitでは、テスト版など複数に枝分かれした状態も管理できます。複数のメンバーによる開発を前提としており、開発中の各時点におけるコメントや、コメントへの返信なども管理できるようになっています。
gitコマンドはほとんどの場合、「サブコマンド」と組み合わせて利用します(本連載ではgitとサブコマンドの組み合わせをコマンドとして紹介します)。
gitコマンドでは「リポジトリ(repository)」を使ってバージョンを管理します。リポジトリにはソースコードや変更履歴、コメントなどを一括して保管します。リポジトリには、自分のPC上に作る「ローカルリポジトリ」と、「GitHub」などのWebサービス上に作る「リモートリポジトリ」があり、両者を連携させることで複数の開発者による開発を1本にまとめることができます。
また、ローカルリポジトリのみで運用することも可能です。そのような運用をしているリポジトリにリモートリポジトリを追加したり、逆に、リモートリポジトリを削除したりするには、「git remote」コマンドを使用します。「git remote」コマンドには、さらに「add」や「remove」などのサブコマンドがあります。
既存のリポジトリ(リモートリポジトリ)にあるソースコードなどを入手したい場合は、まず、「git clone」(連載第381回)でリポジトリを自分の環境に複製します(※1)。リモートリポジトリの内容がバージョンアップされたら「git pull」(連載第382回)コマンドで最新版を取得します。開発に参加するのではなく、単に最新版を取得したいという場合は、「git clone」と「git pull」を利用すればよいでしょう。
※1 特定のファイルだけが欲しい場合、例えばGitHub(github.com)にあるリポジトリであれば「Raw」というボタンで表示されるURLを使い、「wget」コマンドなどを使ってダウンロードできる。この他、プロジェクト全体をダウンロードするためのリンクも用意されている([Clone or download]ボタン→「Download ZIP」)。
保管場所であるリポジトリに対し、ファイルの編集などを行う場所を「ワークツリー」「ワーキングエリア」「作業ツリー」などと呼びます。「git clone」や「git pull」で取得した最新版のファイルはワークツリーに配置されます。つまり「作業ディレクトリ」です。
ワークツリーで編集した結果をリポジトリに反映する操作を「コミット」と呼びます。「git add」(連載第384回)コマンドでコミットしたいファイルを「インデックス」あるいは「ステージングエリア」と呼ばれる領域に追加します。インデックスにはファイルの変更箇所などが記録されます。
インデックスの内容は「git commit」コマンドでローカルリポジトリにコミットされ、「git push」コマンドでローカルリポジトリの内容をリモートリポジトリに反映します。従って、「git add」や「git commit」などを行わなければ、自分の環境で編集した内容がリポジトリに影響を与えることはありません。自由に編集し、テストできます。なお、ワークツリーのファイルを過去の任意のコミット状態に戻すことも可能です。
Gitには、この他、開発中のソースコードやドキュメントを、「テスト版」「○○版」……のように枝分かれさせたり、それらを合流させたりする機能もあります。枝分かれしたそれぞれのバージョンを「ブランチ」(branch)と呼び、ブランチを合流させることを「マージ」(merge)と呼びます。
コミットには「タグ」と呼ばれる名前を付けることができます。その際には「git tag」コマンドを使います。
git [オプション] サブコマンド [サブコマンドごとのオプションや引数]
git remote -v
git remote add [オプション] 名前 URL
git remote remove 名前
git remote サブコマンド 対象
※ 「名前」欄ではリモートに対して付けるものを指定する。通常は「origin」とする。「対象」にはファイル名やブランチ、タグ、コミットのハッシュ値などが指定可能。[ ]は省略可能な引数を示しています。
短いオプション | 長いオプション | 意味 |
---|---|---|
-C パス | カレントディレクトリではなく指定したディレクトリで実行したものとする | |
--bare | リポジトリを「bareリポジトリ」(ワーキングツリーが存在しない、管理だけを目的としたリポジトリ)として扱う | |
-c 設定=値 | 設定値を指定する(設定は「git config」で確認可能) | |
-p | --paginate | 全ての出力を「less」コマンドまたは環境変数PAGERで指定されたコマンドで表示する |
-P | --no-pager | 「less」コマンドで表示しない(「-p」の指定を打ち消す) |
--exec-path=パス | gitの実行ファイルのパスを指定する(「--exec-path」のみの場合、実行ファイルのパスを表示する) | |
--html-path | gitのHTML形式のドキュメントがインストールされたパスを表示する | |
--man-path | gitのmanファイルのパスを表示する | |
--info-path | gitのinfoファイルのパスを表示する | |
コマンド | 実行内容 |
---|---|
clone | リポジトリのクローンを作成する |
init | リポジトリを新規作成する、または既存のリポジトリを初期化する |
remote | リモートリポジトリを関連付けする |
fetch | リモートリポジトリの内容を取得する |
pull | リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う) |
push | ローカルリポジトリの変更内容をリモートリポジトリに送信する |
add | ファイルをインデックスに追加する(コミットの対象にする) |
rm | ファイルをインデックスから削除する |
mv | ファイルやディレクトリの名前を変更する |
reset | ファイルをインデックスから削除し、特定のコミットの状態まで戻す |
status | ワークツリーにあるファイルの状態を表示する |
show | ファイルの内容やコミットの差分などを表示する |
diff | コミット同士やコミットとワークツリーの内容を比較する |
commit | インデックスに追加した変更をリポジトリに記録する |
tag | コミットにタグを付ける、削除する、一覧表示する |
log | コミット時のログを表示する |
grep | リポジトリで管理されているファイルをパターン検索する |
branch | ブランチを作成、削除、一覧表示する |
checkout | ワークツリーを異なるブランチに切り替える |
merge | 他のブランチやコミットの内容を現在のブランチに取り込む |
rebase | コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる) |
config | 現在の設定を取得、変更する |
サブコマンド 対象 | 意味 |
---|---|
add 名前 URL | 現在のローカルリポジトリにリモートのリポジトリを追加する(※2) |
remove 名前 | 現在のリポジトリからリモートのリポジトリを削除する |
rm 名前 | removeと同じ |
rename 名前 新しい名前 | リモートの名前を変更する |
set-url 名前 URL | リモートのURLを変更する(「--add」で追加、「--delete」で削除) |
get-url 名前 | リモートのURLを表示する |
set-head 名前 | リモートのデフォルトブランチを設定する |
set-branches 名前 ブランチ | リモートで追跡するブランチを変更する(ブランチは複数指定可能、変更ではなく追加したい場合は「--add ブランチ名」とする) |
prune 名前 | リモートの追跡ブランチを削除する(「-n」または「--dry-run」を付けると実行せずに、実行する内容だけを表示する) |
show 名前 | リモートの情報を詳しく表示する |
※2 「名前」はリモートリポジトリに付けるもので、通常は「origin」を使用する。
オプション | 意味 |
---|---|
-t ブランチ | 変更を取得するブランチを指定する(デフォルトはmaster、複数を指定可能) |
-m ブランチ | HEAD(先頭)に設定するブランチを指定する |
--tags | 全てのタグを取得する(※3) |
--no-tags | タグを取得しない(※3) |
--mirror=fetch | リモートリポジトリからの取得(fetchやpull)時に、全てのブランチやタグを取得する |
--mirror=push | リモートリポジトリへの送信(push)時に、全てのブランチやタグを送信する |
-f | リポジトリを追加した後、リモートリポジトリの変更内容を取得(fetch)する |
※3 デフォルトでは、リモートブランチに関連するタグのみを取得する。
今回は、「git remote」コマンドの応用編として、ローカルリポジトリだけを使った編集から始め、共有ディレクトリ上にリモートリポジトリを作成して複数ユーザーがファイルの更新結果をコミットするという操作まで、順を追って解説します。「git」コマンドと「git remote」の基本的な使い方については、第395回を参照してください。
画面1では、ローカルリポジトリだけを作成し、コミットを実行する様子を示しました。最初に「project01」というディレクトリ(ワークツリー)を選び、このディレクトリに対して、「git init」コマンド(連載第383回)でローカルリポジトリを作成しました。
そして、「git add .」(連載第384回)でワークツリーにある全てのファイルをインデックスに追加(ステージング)しました。最後に「git commit -m メッセージ」(連載第385回)でコミットしています。
ローカルリポジトリのみで運用する場合、「git add」と「git commit」を繰り返します。以前の状態にさかのぼりたいときは、適宜、「git checkout」(連載第391回)を実行します。
複数のメンバーでファイルを更新したり、複数の環境(PC)から更新したりしたい、という場合はリモートリポジトリが必要です。
ここでは、複数メンバーが更新する際に必要なリポジトリを作成する例を紹介します。操作しているユーザーは「study」で、root権限が必要なため「sudo」コマンドを使用しています。
画面2ではまず準備から始めています。リポジトリを更新するユーザーのグループとして「projgroup」を作成(groupaddコマンド)した後、ユーザー「study」とユーザー「penguin」の2名を「projgroup」グループに追加しました(gpasswdコマンド)。
グループの情報は次のログインで反映されます。ここでは、グループ情報を読み直し、このままユーザー「study」で操作を続けるために、「su study」を実行しました(※4)。
※4 「su」コマンドは、多くの場合スーパーユーザーの権限でシェルを動かしたいときに使用する。この他、画面2のように「su ユーザー名」で指定したユーザーになることができる。特定のユーザーのログインスクリプトを実行したい場合は「su - ユーザー名」のように「-」を指定する。
次に、「mkdir」コマンドでリモートリポジトリ用のディレクトリ(/mnt/data/work/project01)を作成し、「chgrp」コマンドで所有グループを「projgroup」に変更しました。最後にこのディレクトリ内のファイルやディレクトリの所有グループが全て「projgroup」になるように、「chmod」コマンドで「SGID」を設定しました(※5)。
※5 SGIDについては「共有ディレクトリ」を作成してパーミッション(許可属性)への理解を深めようを参照。
ディレクトリの準備ができたので、最後に「git init」でリポジトリを作ります。ワークツリーは不要なので「--bare」オプションを指定しました。このようなリポジトリを「ベアリポジトリ」と呼びます。ここでは、共有リポジトリにしたいため「--shared」オプションも指定しました。
画面3では「git remote add」を使って作成したローカルリポジトリ(画面1)に対し、リモートリポジトリ(画面2)を追加しました。ワークツリー(作業ディレクトリ)の中で実行しています。リモートリポジトリの名前は一般的に使用されている「origin」としました。
リモートリポジトリを作成したら、「git push」を使ってmasterブランチで進んでいたコミットを全てリモート(origin)に送信しています。「git push」は、送信先としてリモートとブランチを指定する必要がありますが、「--set-upstream」オプションを付けることで、今後は、originとmasterがデフォルトの送信先になります。
画面1〜3でローカルリポジトリとリモートリポジトリの準備が終わりました。次にこの環境でファイルを更新する運用について紹介します。
画面4ではワークツリーで「hello.txt」というファイルを作成した後、「git add」と「git commit」でコミットしています。最後に「git push」でリモートリポジトリに送信しました。
ここで別のユーザー「penguin」が開発に参加できるようにしてみましょう。必要なコマンドは「git clone」(連載第381回)です。リポジトリのクローンを作成して、リポジトリの内容を取得する機能があります。
画面5では、テスト用として/tmp/workディレクトリの中に、ユーザー「penguin」のローカルリポジトリを作成しています。恒常的に使用するのであれば、「penguin」のホームディレクトリなどを使用してください。
完成したワークツリー内で「git log --oneline」(連載第386回)を実行すると、ユーザー「study」のコミットログを表示します。
次はユーザー「penguin」でコミットを実行します(画面6)。まずは準備のために「git config」で、メールアドレスとユーザー名を登録します。
hello.txtの内容を変更し、「git add」でインデックスに追加しました。その後「git commit」でコミットし、「git push」でリモートリポジトリにも反映しています。
git config --global user.email メールアドレス
(メールアドレスを登録する)
git config --global user.name 名前
(名前を登録する)
ユーザー「study」が「git pull」でリモートリポジトリの内容を取り込むと、ユーザー「penguin」による更新が反映されていました(画面7)。
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザー。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『[新版 zsh&bash対応] macOSコマンド入門』『Accessではじめるデータベース超入門[改訂2版]』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社等の"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.