Gitの仕組みと現場でよく使用するコマンド
職場の勉強会で発表することになり、お題をGitとコマンドに決めたため
調べたものをまとめる場としてこの記事を書くことにしました。
見出し
- Gitとは
- Gitを使うと嬉しいこと
- 集中型バージョン管理システムとの違い
- Gitの構造
- 上記以外で使用する事が多いコマンド
Gitとは
まず、Gitとはプログラムのソースコードなどの変更履歴を記録・追跡するための分散型バージョン管理システムのことであり、かのLunuxを開発したリーナス・トーバルズ氏によって開発されたシステムです。
Gitが生まれた経緯としてざっくり言うと、もともとLinuxカーネル開発1でBitKeeperというバージョン管理システムを使用していたが、社員の一人がやらかしてしまいBitKeeperの無料提供の停止が通告され、交渉も決裂してしまい利用できなくなってしまいました。
BitKeeper利用前の状態に戻るのは耐えられないが、他社のシステムの中でBitKeeperの代用品になるシステムが見つからず、最終的には自前でSCMを開発することになりました。
その結果誕生したのがGitです。
Gitを使うと嬉しいこと
ソースコードの変更をしている最中に「これ、変更したけど前のほうがいいな」「色々修正していたら元々コードがどんなものだったか分からなくなった」「バグが起きたけど原因が分からない、変更前の状態からやり直したい」という事が起きます。
その際、あらかじめGitにコミットして履歴を残していると以前の状態に戻すことが容易にできます。
またVSCodeにGitGraphなどの拡張機能を入れて上で変更の差分を表示させて、変更箇所の特定の部分だけ戻すなどの操作も可能です。
集中型バージョン管理システムとの違い
そもそもバージョン管理システムとなにかという話になりますが、「テキストファイルの変更履歴を管理する」ためのツールです。(テキスト以外のバイナリファイルのバージョン管理にも使われます)
変更の内容と日時の記録や、リポジトリから任意の時点のデータを復元など、手戻りやバグなどの課題を発見、レビューの際に差分点を効率的に見つけることができます。
そして集中型バージョン管理(SVNなど)との違いですが、ローカルリポジトリの有無になります。
集中型は1つの共有リポジトリに随時コミットしていくのに対して、分散型は各個人が持っているローカルリポジトリにコミットしていきます。
集中型は自分のコミットが他のメンバーの作業にも影響するため、ある程度まとまった状態でないとコミットできませんが、分散型は個人でリポジトリを持っているので中途半端なデータをコミットしても他のメンバーの作業には影響しません。
そのため、Gitはこまめにコミット(履歴を記録)できてミスを探したり戻し作業がしやすいです。
他の利点としてはGitはブランチを簡単に切れることが挙げられます。SVNでもブランチを切ることは出来るのですが、制約やコストが大きいらしく簡単にGitのようにブランチを切ることはできないようです。(SVNは触ったことがないのでよく分かりませんが…)
このあたりの話は以下の動画が分かりやすかった為、参考にさせて頂きました。
https://youtu.be/jOFSn59q6IY?si=DRb8FGUY4mJEozS4
Gitの構造
Gitの構造ですが何もなしに説明するのは難しいため実際にGitを使用するときのケースを元に説明します。
実際に開発する場合は大体以下の画像の通りの流れになると思います。
といってもこれだけ見てもGitに馴染みがない人には分かりづらいと思うので順を追って説明していきます。
1.ワーキングツリー
実際にコードをゴリゴリ書いたり、削除したりする作業場所。
2.インデックス
コミットするための前準備としてファイルを記録する場所。
ワーキングツリーで変更したファイルをgit add
コマンドでインデックスに移動させる。
git add ファイル名
で特定のファイルだけステージング(インデックスに移動)させたり、
git add -p
でファイル内の特定のコードだけをステージングさせることも可能。
3.ローカルリポジトリ
リモートリポジトリにアップロードするためのコミット履歴とファイルを記録する場所。
ステージングしたインデックス上のファイルを、git commit
コマンドでローカルリポジトリにコミットする。
git commit -m "メッセージ"
でコミットにメッセージを残せる。コミットするときはなんのコミットなのか分かりやすくするためにコミットメッセージを残すのが基本。
4.リモートリポジトリ
複数人で共有するリポジトリ。
git push
コマンドでローカルリポジトリにコミットしたファイルとコミット履歴をリモートリポジトリにアップロードする。
アップロードされたコミットからコードの変更点を比較してレビューを行ったり、プルリクエストを発行してマージしたりします。
上記以外で使用する事が多いコマンド
git pull
リモートリポジトリに記録されている最新の内容をローカルリポジトリに反映するコマンド。
git stash
まだコミットしていない内容を一時的に避難するコマンド。
git stash pop
stashしたものを戻すコマンド。似たコマンドとしてgit stash apply
がある。stashしたものを戻すのは同じだが、popは履歴から削除する、applyは履歴を残すといった違いがある。
参考サイト
-
ハードウェアとソフトウェアの中立ちをしてくれる、OSとして動く大元の部分。 ↩