ローカルで利用するGitの話

Gitとはバージョン管理システムのことでその中でも分散型の管理システムって言われてる。
基本的にはエンジニアが利用するもので書いたコードをその都度セーブできて、前のコードに戻りたくなったらすぐに戻れたりとタイムスリップが可能になる。また、Gitは複数人で共同作業ができるような環境も揃っている。今回は、Githubなどのリモートリポジトリを利用したものではなくローカルにおけるGit話。Gitがどのようにバージョン管理を行うのかとその他コマンドについて書いていく。

Gitはどのようにバージョン管理をするのか

ローカルでGitを利用するにはローカルにローカルリポジトリを作成する必要がある。ローカルリポジトリにはセーブした履歴がどんどん積み重なっていく。では、どのようにセーブをしていくのかというと、Gitのバージョン管理の構造は大きく3つのステージからなる。

  • 作業ディレクトリ

  • ステージ

  • ローカルリポジトリ

作業ディレクトリは普通に自分が作業するフォルダーのこと。
ステージは、作業ディレクトリで作業した分をローカルリポジトリにセーブする前に検査するようなものやと考えていいと思う。ほんとにこのまま履歴に載せてしまっていいのか?っていうのをみてくれる場所。
ローカルリポジトリは、最初に書いたとおりであるが、実際はコミットというのが積み上げられていく。作業後にバージョン追加を行うとそれが1コミットとなる。

コミットまでの流れ

ローカルリポジトリにセーブした履歴を追加することをコミットという。それをするには、作業ディレクトリで作業した分をステージにあげなければならない。このステージに上げる作業をaddという

git add ファイル名

addすることでステージに追加されたファイルはトラックされるようになる。addの後にファイル名を入れてもいいし、全ての作業ディレクトリ内のファイルをステージさせたい場合は、--aをつけるとファイル名を指定せずとも全てがステージに上げられる。また、ステージに挙げられたものは次にaddするまで以前にステージに上げた作業分の履歴がそこにあることに注意が必要。
ちなみに現在作業ディレクトリにあるものがステージされているかどうかを知りたければ

git status

を使うといい。git statusは次に自分がどんなコマンドを打てば良いか教えてくれる。
また、作業ディレクトリの作業分とステージに上がっている作業分においてどこが変わったのかを差分で知りたいときは

git diff

を使うと良い。ステージとリポジトリの差分を見るときは上のコマンドの最後に--stagedをつける。
次にいよいよコミットする。コミットをするには

git commit -m "メッセージ"

基本これでOKで、ファイル単位でコミットしたい場合とかに合わせてオプションが用意されてる。ちなみに-mはメッセージを書き込めるオプション。

リポジトリにコミットするとそれを追加した日付やconfigに設定されているユーザー名/メアド/コミットメッセージと履歴を識別するハッシュ値が生成される。
前のコミットしたコードに戻したくなったらこのハッシュ値を使ってコミットを指定したりする。他にも2コミット前のコミットを指定したりというハッシュ値を使わない指定の仕方もある。
前のコミットのハッシュ値をどうしたら見れるかというと

git log

をするとコミット履歴を見ることができる。オプションもいっぱい用意されてて、この後登場するブランチを使ったときより見やすい形にできたりもする。
基本的にはaddしてcommitしておけばgitは使えると思う。

共同作業

共同作業するときにはブランチを作ってそれぞれが邪魔し合わない環境をつくって作業をする。ブランチは実は既にリポジトリにあってそれがmasterブランチである。いままでコミットしたものはmasterブランチに対してコミットしていたのである。
実際にgit branchとコマンドを打ってみると現在いるブランチがmasterという名前になっていることがわかるだろう。
共同作業においてマスターブランチに直接各々がコミットをするのではなく、まず自分だけでの作業環境であるブランチをマスターから枝分かれさせてつくって作業をすすめる。そして作業が終わってブランチの存在が不要になったらmasterに作業したブランチのコミットを合体させる作業を行う。それをマージするという。

ブランチを作成して作業を開始するためには、2つのステップを踏む。

git branch ブランチ名
git checkout 上記で作ったブランチ名

をするとブランチを生成してその作業環境に切り替えることができる。checkoutで切り替えをおこなっている。git branchは引数を指定せずに実行するとbranchの一覧を見ることができる。また、同じ名前のブランチを作成する子はできない。ブランチの生成時にもハッシュ値が生成されて第一回目のコミットみたいな扱いになる。
ちなみに、「ブランチを作成して作業を開始する」の2ステップを一度にすることもできて、

git checkout -b 作成するブランチ名 枝分かれ開始地点

をすると1ステップでできるようになる。枝分かれ開始地点にはハッシュ値などコミットを識別するものを入れる。-bはブランチ生成オプション。
ちなみにgit branch -dをすると現在自分がいるブランチを削除することができる。その場合作業分が全て消えるので注意が必要です。
次にブランチで作業した分をmasterへマージする。
マージするにはマージする対象のブランチに環境を切り替えてからコマンドを打つ。そのためmasterにマージする場合は以下の2ステップで完了する。

git checkout master
git merge ブランチ名

作成したブランチとmasterが直系の子孫のような関係の場合git mergeを行うと勝手にfast-forwardマージが行われる。

https://ariya.io/2013/09/fast-forward-git-merge

上記図の右がfast-forwardマージが行われた状態である。fast-forwardが行われると直系の子孫のブランチとmasterブランチが一緒になる。
かえって通常のマージは左のような、図で表される。masterと他のブランチが合体することには二つとも違いはないが、masterにマージするのかmasterが他のブランチのあるところにマージするのかというニュアンスの違いみたいなところで差がある。ちなみにニュアンスだけでmasterにマージしていることには違いはないので注意。
共同作業において、ブランチで作業している(まだコミットしたくない)時に他のブランチに移ってコードレビューなどを行いたい時がある。そして、コミットせずにブランチを切り替えることはできない。その時に使うのがstashコマンドである。これ使うと現在の作業を仮セーブすることができ、コミットしなくてもブランチの切り替えができるようになる。作業が済んで作業していたブランチに戻った後にstash popをすると仮セーブしていた作業分を戻すことができる。

git stash
git stash list
git stash pop

以上がローカルで利用するGitの話でした。

この記事が気に入ったらサポートをしてみませんか?