リポジトリを複製する(クローン)
前節では共有リポジトリの作成を解説しましたが、通常の開発では、すでにリポジトリが用意されている場合の方が多いと思います。そのような場合は、作業を開始するにあたって、共有リポジトリであるリモートリポジトからローカルリポジトリに複製(クローン)を行います。これは、SVNで言うところのチェックアウト操作に相当します。分散バージョン管理システムであるGitでは、作業開始時にSVNのように作業コピーを取得するわけではなく、リモートリポジトリを丸ごと複製するのです。
cloneコマンドに共有リポジトリのURLを指定すると、リポジトリが複製されます(リスト3)。
$ git clone //magi/share/repos/sample.git Cloning into 'sample'... done.
複製されたローカルリポジトリが、どのリモートリポジトリと関連付いているか確認するためには、remoteコマンドを実行します。複製直後には、必ず1つ「origin」という名前が見えるはずです。これは複製元のリポジトリに自動でつけられる名前です。さらに詳細な情報を表示するためには、remote show originと入力します
$ cd sample $ git remote origin $ git remote show origin * remote origin Fetch URL: //magi/share/repos/sample.git Push URL: //magi/share/repos/sample.git HEAD branch: master Remote branches: bugfix tracked master tracked Local branch configured for 'git pull': master merges with remote master Local ref configured for 'git push': master pushes to master (up to date)
複製したリポジトリは、前回までに説明したローカルリポジトリへの操作で、ファイルの追加/削除/修正/マージ/コミットなどを操作できます。
さて、GUIでリポジトリを複製する場合は先ほど説明した図3において、クローン先のリポジトリにリモートリポジトリを指定し、リポジトリの種類に[個人リポジトリ]をチェックすれば複製できます。
修正を反映する(プッシュ)
ローカルリポジトリでの修正内容を共有リポジトリに反映するためには、プッシュ操作が必要です。反映を行いたい修正は、あらかじめローカルリポジトリへコミットしておく必要があります。例えば、何らかのファイルを修正しコミットした状態をstatusコマンドで確認すると、ローカルリポジトリ側が1コミット進んでいることが確認できます(リスト5)。
$ git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # (use "git push" to publish your local commits) # nothing to commit, working directory clean
このコミット内容を共有リポジトリに反映するには、pushコマンドを利用します。引数にはリモートリポジトリ名とブランチ名を指定します。
$ git push origin master Counting objects: 5, done. Delta compression using up to 8 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 392 bytes, done. Total 3 (delta 2), reused 0 (delta 0) To //MAGI/share/repos/sample.git 00e579c..f97757c master -> master
上記引数の意味はoriginという名のリモートリポジトリ(最初に複製したリポジトリ)のmasterブランチに対して反映を行うという意味です。共有リポジトリ側に修正が入っていなければ、プッシュ操作は正常に完了するでしょう。
プッシュ操作をGUIから確認してみます。図4は、ローカルリポジトリへ修正をコミットした直後のGitブラウザです。masterブランチが、origin/materブランチより先に進んでいることが確認できます。origin/masterブランチとは、リモートリポジトリとローカルリポジトリを紐付ける特殊なブランチで、追跡ブランチと呼ばれます。これは、複製したときに自動的に作成されるリモートリポジトリの内容を保持しているブランチだと考えてださい。とすると、複製した時点から1コミット進んでいるという意味が理解できるかと思います。
プッシュ操作は、上矢印のボタンもしくは、[Gitコマンド]-[Push]を選択します。プッシュ確認ダイアログが表示されますが、そのまま[Push]ボタンをクリックすれば操作完了です。
masterブランチと、追跡ブランチorigin/masterが同一コミットを指していることが確認できるでしょう(図4)。
修正を取り込む(プル)
リモートリポジトリ側での修正内容を取り込むには、フェッチまたはプル操作を行います。フェッチ操作は、リモートリポジトリの修正内容をローカルリポジトリに取り込みますが、作業ディレクトリには影響を与えません。修正内容を作業ディレクトリに取り込むには別途マージ操作を行う必要があります。一方プル操作はフェッチとマージ操作を同時に行います。
プル操作を行うには、pullコマンドを利用します。続いてリモートリポジトリ名とブランチ名を指定します(リスト7)。競合する修正などなければ問題なくとりこまれるでしょう。出力結果によりファストフォワードによってProgram.csに修正がマージされたのが確認できます。
$ git pull origin master remote: Counting objects: 5, done. remote: Compressing objects: 100% (3/3), done. remote: Total 3 (delta 2), reused 0 (delta 0) Unpacking objects: 100% (3/3), done. From //MAGI/share/repos/sample * branch master -> FETCH_HEAD Updating b73b13e..f525efd Fast-forward Program.cs | 5 +++++ 1 file changed, 5 insertions(+)
GUIから操作する場合は、Gitブラウザの下矢印ボタンから[Pull(リモートから取得)]を選択します。プル操作のダイアログが表示されるため、マージオプションに[現在のブランチと取得したブランチをマージする]にチェックを入れて、[Pull]ボタンをクリックすれば取り込まれます(図6)。