Gitの設定
なぜGitを使うのか?
勉強か研究かに関わらず、Gitなどのバージョン管理システムを使うことを強く勧める。今の時代、プログラムを日付ごとにコピーするのは完全に時代遅れだ。
しかし、Gitは大変便利である反面、初心者には敷居が高いということは理解できる。ともかく、最初はcommit
とpush
だけを覚えよう。コミットコメントなどは丁寧に書くに越したことはないが、兎にも角にも「記録を取っておく」ということが一番重要である。
Gitで変更履歴を残しておけば、プログラムが動かなくなった時に、履歴を遡って、どこからエラーが発生したかを調べられるだけでなく、エラーの起こった日がわかったら、その時から今までの変更履歴を一覧で見ることもできる。
さらに使いこなせば、自動でテストをしたりすることもできる。実際、このページはGitHub Actionsという仕組みを利用していて、コミットがリモートサーバーにプッシュされると自動的にサーバー上のWebページを更新する仕組みになっている。
話がそれたがGitやGitHubは絶対使おう。情報系でありながらバージョン管理をしないのは今の時代恥ずかしい。もう一度言う、絶対に使おう。というか使わないことは許されない。絶対に絶対に絶対に使おう。
GitHubアカウントの作成
Git自体は自前のサーバー等にインストールしても使えるが、今はGitHubやBitbucketなどのSaaS (Software as a Service)が充実しているので、わざわざ自分でサーバーを立てる必要はない。ありがたく、このどちらかを使おう。以下はGitHubを使う前提で話を進める。
アカウントを作るのはとても簡単で、以下のステップに従えば10分程度でアカウントが作れる。
- GitHub にアクセスしてアカウントを作る
- 学生の場合にはアカデミック・ライセンスでアカウントが作れる (オプションだが設定しておく方が良い)
- Windowsの人はGit for Windows をインストール
GitHubはオープンソース開発を支援する目的で運営されているウェブサービスなので、初期は自分以外がアクセスできない「プライベート・リポジトリ」は有料アカウントでないと作れなかったが、現在は無料アカウントであっても無数にプライベート・リポジトリが作成可能である。
Gitクライアント
ローカル環境でGitを操作する際に、何で操作をするかという点についてだが、Windowsの場合にはGit for WindowsについてくるGit Bashで、Macの場合にはターミナルを使って操作をするのが最も原始的なやり方だろう。ただし、最初はコマンドを覚えるのも大変だと思うのでGUI環境(Gitクライアント)からGitを使うものを使用するのも良いと思う。以下に一例を上げておく。
- TortoiseGit (Windows)
- 右クリックのメニューからコマンドを選べる。コマンドで操作するのに近いので、これで慣れておくとコマンドへの以降がスムーズだと思われる。
- URL: https://tortoisegit.org/
- GitHub Desktop (Window, Mac)
- GitHubが公式で提供しているGitクライアント。驚くことにタブレットでも使える。GitHubを使う前提なら、これが使いやすいかも。
- URL: https://desktop.github.com/
- SourceTree (Windows, Mac)
- こちらはBitbucketを運営するAtlassianが提供しているGitクライアント。
- URL: https://www.sourcetreeapp.com/
- GitKraken (Windows, Mac, Linux)
- こちらはLinuxでも使用可能なオープンソースのGitクライアント。機能はGitHub DesktopやSourceTreeとほとんど変わらない。見た目が奇抜。
- URL: https://www.gitkraken.com/
Gitの基本の「き」
使い方についてはWeb上の記事が豊富にあるので、それらを参考にするのがいい。ここでは非常に簡単にGitリポジトリの作成から、コミットまでの流れを見ていく。
Gitリポジトリの作成
Gitリポジトリを用意する方法は、他の人が公開しているプログラムを「クローン」してくる方法と、自分で一からリポジトリを作る方法の2通りがある。ここでは、少し標準的なやり方からは外れるかもしれないが、覚えやすいやり方としてGitHub上でリポジトリを作ってクローンする方法を説明する。
まずGitHubにアクセスして、適当なリポジトリを作成しよう。ここでは、リポジトリの名前をmy-first-repo
とした。ここで「Add a README.md file」にチェックを入れておくと、リポジトリがファイルを含めて初期化される (本来このチェックはオプションだが、以下のやり方に従う場合はチェックが必要)。
リポジトリが作成できたら、ローカルでターミナルを使い、リポジトリをクローンする。
$ git clone https://github.com/[Your Account]/my-first-repo.git
これでリポジトリの作成は完了である。
Gitリポジトリの設定
このあと、実際にリポジトリ上で作業を行っていくが、まず最初にリポジトリ上でユーザの設定を行おう。まずはcd
コマンドでリポジトリのフォルダに入る。
$ cd my-first-repo
リポジトリにコミット(更新の記録)を行うためには、ユーザの名前とメールアドレスを設定する必要がある。例えば以下のような形だ。
$ git config --local user.name "Tatsuya Yatagawa"
$ git config --local user.email "tatsy.mail@gmail.com"
上記のコマンドではオプションに--local
を渡しているが、これを指定すると、このフォルダに含まれるリポジトリにだけ設定が反映される。自分のPC全体に設定を反映したい場合には上記の--local
を--global
に変更すれば良い。なお、ここに指定するメールアドレスは何でも問題ないが、このアドレスをGitHubに登録したときに使用したメールアドレスにしておくと、自分のコミットの数などがGitHubに記録されてやる気が出る。
この他、リポジトリの設定項目には
- コミットコメントを書くときのエディタを何にするか?
- ソースコードの改行コードを自動で変換するか?
git status
をgit st
にするなど、エイリアスの設定- コミットの差分を色付きで表示するか?
などが設定できる。設定項目は非常に多いが、よく探してみると便利な機能が見つかるかもしれない (参考)。
また、複数の環境でこのような設定を共有したい場合には~/.gitconfig
ファイルをコピーすれば良い。ちなみに著者の.gitconfig
は以下のように設定している。
[user]
name = Tatsuya Yatagawa
email = tatsy.mail@gmail.com
[core]
autocrlf = input
editor = nvim
[color]
ui = true
[push]
default = nothing
[pull]
ff = only
[alias]
st = status
stu = status -u
ファイルの作成
それではファイルを作成して、それを編集してみよう。ここもターミナルを使って行う。
$ touch file.txt
するとファイルが作成されるので、適当に中身を編集する。とりあえずはecho
コマンドを使って中身を入れてもいい。
$ echo "Hello, world!" >> file.txt
$ cat file.txt # 中身が表示される
ここで、Gitリポジトリの状態を確認する。
$ git status
なお、フォルダにファイルが入っている場合には、フォルダ名だけしか表示されないので、その場合にはオプションとして-u
をつけてgit status -u
とする。このコマンドで、上記のファイルが追加されていることが分かるが、この状態では更新がGitにより記録されない状態(unstaged)なので、ファイルをGitの記録対象に追加する。
$ git add file.txt
$ git status # ファイルが記録対象に追加されて色が変わる(おそらく赤から緑)
ただ、ファイルが多い場合には、いちいちファイルを1つずつ追加していくのは非常に面倒だと思われる。Gitの運用にあたっては、追加しない対象を.gitignore
ファイルで指定しておき、それ以外のファイルをgit add -A
というコマンドで一括追加するのが良いと思われる。
また、すでに記録対象になっているファイルの変更履歴を更新するには--update
あるいは-u
オプションをつけて、
$ git add -u
とすると、すでにstageされているファイルの履歴が更新される。
変更のコミット
上記のadd
コマンドは履歴の「追加」あるいは「更新」の予定を表すものであり、実際にはコミットをするまで記録は変更されない。コミットでは、この変更が何であるかを表すコミットコメントをつけて記録を取ることができる。
$ git commit
とタイプすると、エディタが開いてコミットコメントの編集画面になる。適当なコメントを入れて保存し、エディタを閉じるとコミットが実行される。なお、短いコメントをつける時など、エディタを開くまでもないときには
$ git commit -m "First commit."
のようにしてターミナルから直接コメントを指定することもできる。加えて、コミットコメントを修正したいときには--amend
オプションを追加して、
$ git commit --amend -m "Last one was mistake!"
のようにすれば良い。
変更のプッシュ
Gitは専門的な言葉で言うとVCS (version controll system)と呼ばれるシステムの一種であるが、VCSは何もGitに限るものではなく、一世代前のプログラマだとSVNあるいはSubversionと呼ばれるシステムを使うのが一般的だった。
このSVNは集権管理型といって、全ての変更は即サーバーに記録する必要があり、上記のGitで見られたようなローカルでのコミットは存在しなかった。だが、当然、ローカルで処理して問題ないコードをサーバーで他のメンバーに共有する方が良いわけでGitのような分散管理型のVCSが作られた。
Gitのプッシュはローカルの変更をサーバーに反映する処理であり、コミットの後に行う。ただし、1回のコミットごとに行う必要はなく、コミットを複数回して、コードを整理した後でプッシュを行うのが一般的な使い方であるように思う。ともあれ、個人開発の範囲であればコミット後に即プッシュでもそれほど問題はない。
では、早速変更をGitHubにプッシュしてみる。通常はプッシュ先のURL設定を
$ git remote add origin https://github.com/[Your Account]/my-first-repo.git
のように行う必要があるのだが、今回はGitHubでリポジトリを作ってクローンしてきたので、これは必要ない(でも覚えておこう!)。URLが設定されているかどうかを確認するには
$ git remote get-url origin
とすれば良い。URLの設定を確認できたら実際にプッシュする。
$ git push origin master
じつはorigin
やmaster
の部分は省略することもできるのだが、個人的には都度これを明示することを最初のうちはお勧めする(挙動がわかりづらい時があるため)。なお、最近のGitHubはデフォルトのブランチ名がmaster
からmain
に変更になっているので、自分がどのブランチで作業しているかを
$ git branch
で最初に確認しておくと良い。
リモートの更新内容のプル
プル(pull)は、リモートで更新された内容をローカルに反映する処理を指す。例えば自分のノートPCと研究室のデスクトップの両方で作業していて、ノートPCからプッシュした内容をデスクトップにも反映する場合にはプルが必要になる。
やり方は簡単で
$ git pull origin master
とすればよい。特に更新に問題なければ自動的にソースコードが更新される。ただ、ノートPCとデスクトップの両方でソースコードを更新してしまった場合などは競合(conflict)が起こってプルがうまくいかない時がある。
競合が起こったときにはにはgit status
で確認すると、どのファイルで競合が起こっているかを教えてくれるので、競合している箇所を修正した後でコミットし直すと、リモート環境の内容がローカルに反映された状態となる。
ちなみにプルという操作は、フェッチ(fetch)とマージ(merge)という操作から成っていて、これらを別々に行うこともできる。
$ git fetch origin master
$ git merge FETCH_HEAD
先にフェッチだけを行うと、例えばgit diff
で変更箇所を確認できたり、特定のファイルだけを選んでマージしたりすることもできる。
最後に
以上、簡単にGitの使い方を説明したが、初心者が使い始めるにはそれなりに覚えることがあるのは間違いない。だが、使い始めなければ慣れもしないので、何を分からないなら、それこそ今すぐ使い始めた方が良い。
またGitを使うときの緒言として「コミットは細かく、プッシュは慎重に」というものがある。コミットを細かく行って、変更を記録しておく方がバグが起こったときに問題を特定しやすいことから、最初はやりすぎなくらいでコミットをして問題ない。プッシュに関しては、個人開発の範囲なら細かくても全く問題はない。だが、もしチームで開発する機会があるなら、細かくコミットした内容を1つのコミットにまとめる(rebase)してからプッシュするなどのケアが必要になることも覚えておくと良い。