まるお
「Git」とか「Github」とかよく聞くけど、何がなんやらサッパリやわー
かとてん
確かにめっちゃ分かりづらいよな・・・
でもそんな人向けに分かりやすく記事にまとめたで!
Git / Githubとは?
「Git」とは、CUIツール(コマンドラインツール)の一種で、「ファイルのバージョン管理システム」のことです。
Gitの管理下に置かれたファイルは、誰が・いつ・どのファイルに・どのような変更を加えたのかを複数人で共有管理することができます。
また、「Github」とは、「ファイルの保存・共有などができるGitの仕組みを利用したWebサービス」のことです。
Github社により運営されており、文字どおり「Gitの拠点」となって、Gitで管理されているファイルをGithub上で一元管理することができます。
GitやGithubは、今ではチーム開発をするプロジェクトには欠かせない必須ツールなっています。
エンジニアだけでなく、デザイナーやライターといった方の必須スキルと言っても過言ではないので、しっかりとマスターしておきたいところですね。
Git / Githubの全体像
全体像は上図のとおりとなります。
以下でそれぞれを説明します。(コマンドについては後ほど解説します。)
①リポジトリ(Repository)
直訳すると「貯蔵庫」であり、「Gitにより管理されるファイルやバージョン情報等を格納する領域」のことを指します。
追加・編集したファイルなどを一元管理するフォルダのようなイメージを持っていただけると分かりやすいかと思います。
なお、Gitにおけるリポジトリには以下の2種類があります。
・リモートリポジトリ:サーバー上にある複数人で共有管理するリポジトリ(Githubなどで作成できる)
・ローカルリポジトリ:ローカル上にある個人で編集作業をするリポジトリ
・ローカルリポジトリ:ローカル上にある個人で編集作業をするリポジトリ
②ワークツリー(Work Tree)
「ローカルで実際に作業を行うGitに管理されているディレクトリ」のことを指します。
小難しく言いましたが、ようするに「ローカル上の作業ディレクトリ」のことです。
基本的にはワークツリー上で変更を加え、リポジトリを更新していく流れになります。
③インデックス(Index) / ステージ(Stage)
「ワークツリーとローカルリポジトリとの差分を記録する一時的な保存領域」のことを指します。
インデックスに保存することで、リポジトリに保存したいファイルだけを保存することができます。
なお、インデックスのリストは「.git/index」に、インデックスに登録された内容は「.git/objects/」下にバイナリファイルとして保存されます。
④ブランチ(Branch)
直訳すると「枝、分岐」であり、「バージョンごとにリポジトリを管理する機能」のことを指します。
上図の例では、ブランチA/B/Cがあり、それぞれが別のバージョンとして管理されます。(合体させることもできます。)
分岐したブランチは他のブランチに影響を与えないので、複数人が別々のブランチ上で同時に作業でき、不具合などが発生しても問題の切り分けが容易になります。
また、ローカル/リモートリポジトリ上で別々にブランチを追加(ブランチを切る)したり、個別で作業した後にブランチを一まとめにしたりすることもできます。
設定を変更しない限りは、Gitリポジトリを作成した際、デフォルトのブランチ名が自動的に「main(2021年6月6日まではmaster)」として作成されるので覚えておきましょう。
これだけは覚えておきたいコマンド名・用語集
この節ではGit / Githubを扱う上で頻出する、上記で説明したもの以外で覚えておきたいコマンド・用語をそれぞれ簡単に解説していきます。
なお、実際に打ち込むコマンドについては次節で取り上げていきます。
①initコマンド
ローカル上で空のGitリポジトリを作成するコマンドです。(「.git」フォルダができます)
すでに存在するリポジトリの初期化をしたい場合にも使うことができます。
特に変更しない限り、このリポジトリを最初にコミットする際、自動的に「main」という名前でメインブランチが切られます。
②cloneコマンド
リモートリポジトリをローカル上に複製するコマンドです。
特に指定しない限り、ローカルリポジトリに「origin」という名前が付き(紐づき)、ローカルに「リモート追跡ブランチ」及び「ローカルブランチ」が作成されます。
(例:origin = https://github.com/test/test.git)
③addコマンド
ワークツリーの変更内容をインデックスに追加してコミット対象にするコマンドです。
rmコマンドを使用することで、addコマンドで追加されたファイルを削除することができます。
④commitコマンド
インデックスに登録されたファイルをローカルリポジトリに記録するコマンドです。
commitコマンドで記録されたブランチは、resetコマンドで最新のcommitを取り消したり、revertコマンドで指定したコミット時点の状態にまで戻したりできます。
⑤pushコマンド
ローカルリポジトリの中身をリモートリポジトリに反映させるコマンドです。
push時にリモートリポジトリとブランチを指定することで、指定したリモートリポジトリの指定したブランチに反映できます。
⑥pullコマンド
リモートリポジトリの中身をローカルリポジトリに反映させるコマンドです。
以下のコマンドを組み合わせたものになります。
・fetchコマンド:リモートリポジトリの全ブランチをリモート追跡ブランチに反映させる。
・mergeコマンド:リモート追跡ブランチから作業ブランチに反映させる。(似たようなコマンドにrebaseコマンドがあります。)
・mergeコマンド:リモート追跡ブランチから作業ブランチに反映させる。(似たようなコマンドにrebaseコマンドがあります。)
⑦branchコマンド
ローカルリポジトリ内にブランチを作成したり、今あるブランチの一覧を表示できるコマンドです。
上記で詳しく説明しましたが、「バージョンごとにリポジトリを管理する機能」であるブランチを作成したり、表示したりしてくれます。
⑧checkoutコマンド
ワークツリーをローカルリポジトリ内にある特定のブランチに切り替えるコマンドです。
checkoutコマンドに-bオプションを付けることでブランチの作成とチェックアウトの両方を同時に行うこともできます。
なお、現在作業しているブランチの最新のコミットを示すポインタ(コミット)のことを「HEAD」と呼びます。(「.git/HEAD」に記録されます。)
⑨stashコマンド
ワークツリーで編集したファイルの内容を一時的に避難することができるコマンドです。
今回はコミットしたくないといったときや作業するブランチを間違えてしまったときに使用します。
⑩statusコマンド
指定したディレクトリ内の状態を一覧で表示するコマンドです。
新しく作ったファイルや変更したファイルなどの確認ができます。
ちなみに、実行後に表示される赤色で書かれているファイルがaddされていないファイル、緑色で書かれているファイルがaddされているファイルです。
⑪.gitignoreファイル
各リポジトリの履歴管理対象外とするファイルをリストで登録するファイルです
node_modulesなどの後でインストールできるような不要なフォルダなどを登録します。
⑫Fork機能
Githubに保存されているリポジトリを自分のアカウントのリポジトリにコピーする機能です。
ボタン一つで簡単にできるので、他の人が作ってくれた最高のコードを一式コピーしてありがたく利用しましょう!(無償で利用できるものに限る)
⑬Pull Request機能
ローカルリポジトリでの変更をリモートリポジトリに反映させて良いかを管理者に通知するGitHubの機能です。
この機能があることで、会社やチームでのコードレビュー・チェックを確実に行うことができます。
⑭Collaborator機能
Githubのコラボレーターは、リポジトリに対するプッシュ/マージなどのある一定の権限を持つ人を指します。
リポジトリのオーナーのようにすべての機能を利用することはできませんが、ほとんどの機能を利用できるようになるため、共同開発者としてコラボレーターを登録したい場合はこちらを参照して追加してみてください。
⑮Conflictエラー
複数人が同じリポジトリ、同じブランチ、同じファイル、同じ行を変更した際に発生するエラーです。
リモートリポジトリからとってきたファイルが、ローカルリポジトリ内にあるファイルと被っているときに起こります。(pullコマンドの際に出てきます。)
このエラーが出た際は、対象のファイルにリモートとローカルのリポジトリからとってきた両方の変更が表示されているので、修正後にcommit、pushを行うことで解決します。
覚えておきたいコマンド一覧
この節では備忘録を兼ね、私がよく利用するコマンドを一覧にしました。
Gitコマンドを使用する際の参考になれば幸いです。
コマンド | 説明 |
git init | カレントディレクトリに空のローカルリポジトリを作成し、「.git」という名前のディレクトリを生成する。 |
git clone “コピーしたいリポジトリ” “コピー先のディレクトリ(省略可)” | 指定したリモートリポジトリをローカル上にコピーする。 |
git add “ファイル名1” “ファイル名n” | 指定したファイルをインデックスに反映する。 ファイル名の部分を「.」にするとルートディレクトリ以下すべての変更ファイルが対象となる。 |
git commit -m “コミットメッセージ” | インデックスに登録のあるファイルをコミットメッセージを付けてローカルリポジトリへ保存する。 「-m」オプションを外すと、テキストエディタが起動してコミットメッセージの入力を求められます。 |
git push “アップロード先のリモートリポジトリ名” “アップロード先のブランチ名” | ローカルリポジトリをリモートリポジトリに反映させる。 マージ元もマージ先も省略可能だが、省略するためには「git config」での事前設定が必要。 |
git pull “マージ元のリモートリポジトリ/ブランチ名” “マージ先のローカルリポジトリ名” | 指定したローカルリポジトリに対し、リモートリポジトリの変更点をマージする。 共同開発でリモートリポジトリが変更された際に、個人のローカルリポジトリにその変更を取り込むために使われるケースが多い。 マージ元もマージ先も省略可能だが、省略するためには「git config」での事前設定が必要。 |
git fetch “リモートリポジトリ名” “ブランチ名” | 指定したリモートリポジトリのブランチをローカルリポジトリのリモート追跡ブランチにマージする。 |
git merge “ブランチ名” | リモート追跡ブランチから作業ブランチに変更点をマージする。 merge先のブランチに移動してから実行する必要がある。 |
git checkout “ブランチ名” | ローカル上で指定したブランチに切り替える。 |
git checkout -b “ブランチ名” “どこからブランチを切るか” | 指定したブランチ名で新しくブランチを切る。 |
git branch | ローカルリポジトリのブランチの一覧を表示する。(リモート追跡ブランチは表示されない。) 緑色に「*」がついているのが現在いるブランチ。 |
git branch -a | リモート追跡ブランチを含めたすべてのブランチを表示する。 「remotes/…」と表示されているブランチがリモート追跡ブランチ。 |
git branch “ブランチ名” | 新しくブランチを作成する。 |
git merge “マージさせたいブランチ名” | ブランチを合流させる。 merge先のブランチに移動してコマンドを実行する必要がある。 (viエディタが開きコミットメッセージを求められた場合は、「:wq」と入力してエンターでOK) ※設定されていれば「remotes/origin/test」からマージする場合は「origin/test」という記述だけでもOK |
git rebase “ブランチ名” | 指定したブランチに現在のブランチにおける変更点をマージしてコミットツリーを一列に合体させる。 ※マージさせたいブランチにチェックアウトして使用する必要がある。 |
git fetch “リモートリポジトリ” | リモートリポジトリの全ブランチをリモート追跡ブランチに反映させる。 |
git reset | 直前のコミットを取り消し、ローカルリポジトリへの変更を元に戻す。 |
git stash save “stashメッセージ” | ワークツリーで編集したファイルの内容を一時的に避難することができる。 |
git stash list | 避難したファイルを確認することができる。 |
git stash apply “復旧させたいstash名” | 避難したファイルを復旧させる。 |
git stash drop | 避難したファイルを削除する。 |
git revert “取り消したいコミットID” | 特定のコミットを取消す。 |
git status | 指定したディレクトリ内の状態を一覧で表示する。 新しく作ったファイルや変更したファイルなどの確認ができる。 |
git diff “差分を確認したいファイル名またはディレクトリ(省略可)” | ワークツリーとリモートリポジトリのファイルを比較してファイル内の差分箇所を表示する。 |
git tag “タグ名” | コミットに対してタグを付ける。 変更履歴の目印として利用する。 |
git log | ローカルリポジトリへのコミット履歴を確認する。 コミットID、変更者の氏名・メールアドレス、変更日時、コミットメッセージが確認できる。 |
さいごに
Git / Githubには共同開発のために必要な機能がすべて盛り込まれています。
使いこなせれば鬼に金棒です。
私自身、まだまだ理解が及んでいないところがあるので、残りもしっかり覚えていきたいところです・・・!
また、勉強の都度、この記事を更新していきたいと考えているのでよろしくお願いいたします。
なお、Gitについて詳しく学びたい方はこの本がおすすめです。(無料です。)
Gitについて勉強する際は最高の教科書になるはずです。