読者です 読者をやめる 読者になる 読者になる

GitとGitHubの環境設定

Git

最近プログラミングを勉強し始めて、バージョン管理の重要さを痛感している。

コードを書く際にはあれこれ試したいこと(例えば、既に動作しているコードを読みやすく書き直したり、変数の値や型を確認するコードを一時的に挿入したり)がある。スクリプト中でコメントアウトを追加&消去したりコードの一部をコピーして別のファイルに保存したりしていたが、これらは時間がかかるし間違いも起きやすい。

このような課題に対処するため、一般的にはGit等のバージョン管理システムを使うようだ。Gitについては下記のドキュメントが参考になる。これを参照しながらコマンドラインで基本的な設定を進めていく。
Git - Book

Gitの仕組みについて

Gitは分散型のバージョン管理システムで、全てのクライアントがリポジトリ(管理対象のファイル、ディレクトリ、更新履歴等の一群)全体をミラーリングすることで、障害やデータ消失のリスクを軽減している。
また、クライアントに開発に必要な全ての環境があるため、ネットワークに接続しなくても開発や変更履歴の記録を行うことができる。

MacでのGitの設定

インストール

homebrewを使ってgitをインストールできる。

brew install git

でインストールが完了する。パスの設定等は下記の記事を参照いただきたい。pyoonn.hatenablog.com

ユーザー設定

インストールしたらユーザー名とメールアドレスの設定を行う。

git config --global user.name "John Doe"
git config --global user.email johndoe@example.com

リポジトリの初期化

Gitで管理したいディレクトリに移動し、下記のコマンドを実行する。

git init

この時点ではディレクトリ内のファイルはGitの管理対象になっていないため、addでファイルを追加し、commitで変更履歴を保存する。

git add hoge.txt
git commit -m "initial project commit"

リモートリポジトリは、短縮名(ここではorigin)を決め、リモートリポジトリのURLとともにgit remote addで追加する。これで、コマンドラインhogeリポジトリのURLを全て打ち込むかわりにoriginでアクセスできるようになる。

git remote add origin https://github.com/hqac/hoge.git

しかし、これを以ってURL先のリモートリポジトリにファイルや変更履歴が追加されるわけではない。GitHubをリモートリポジトリとする場合、GitHub上でhogeリポジトリを作成し、pushする必要がある。

GitHubの設定

SSH keyの追加

SSHを使ってセキュアな接続を確保するため、リモートリポジトリ(ここではGitHub)に公開鍵を保存する。
GitHubの公式ドキュメントが非常に参考になる。
Generating SSH keys - User Documentation

なお、本記事の最初で紹介したドキュメントにはパスフレーズを空欄にすることが推奨されているようだが、公式ドキュメントではssh-agentやキーチェーンアクセスを使うことが推奨されている。
Git - SSH 公開鍵の作成

リモートリポジトリの追加

GitHub上でリモートリポジトリを作成する。ここで作成したリモートリポジトリに向けてpushすることで、ローカルでcommitしたファイルや変更履歴をGitHub上にアップロードすることができる。ここでもGitHubの公式ドキュメントが参考になる。
Create A Repo - User Documentation

リモートリポジトリへのpush

git push -u origin master

ローカルで作業していない変更が既にリモートに存在する場合はエラーになる。その場合は、pushする前にgit pull origin masterでリモートの変更を取り込む必要がある。例えば、以下のエラーが表示された場合は、git pull origin masterしてからgit push -u origin masterすれば良い。

Warning: Permanently added the RSA host key for IP address 'xxx.xxx.xxx.xxx' to the list of known hosts.
To git@github.com:hqac/hoge.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'git@github.com:hqac/hoge.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.