ここでは、バージョン管理システム「Git」について初心者向けに紹介します。
私自身、使用しているのがVBA、Pythonも個人で使用という環境のため、バージョン管理なんて必要?ということがありました。
ただ、個人でwebサービスを公開するときに「Heroku」というサービスを利用としたときにGitを使う必要があることがわかり、勉強して見ようと思いました。
そのため、完全に初心者目線、なおかつ自分が必要なコマンドの紹介になります。
目次
Gitとは?
Gitはファイルのバージョン管理システムです。
htmlファイルでも、Pythonファイルでも、1回の作業だけで終わることは普通ありません。
何度も編集して完成していくと思いますが、その時間違った編集をしてしまい困ったという経験があると思います。
そういうときに編集前の状態のファイルがあると便利ですが、これまでのファイルを管理する方法を簡単にしているのが「Git」という仕組みです。
Gitを使わないファイル管理だと、ファイル名で管理していたり、フォルダごとにファイルを分けたりという方法があると思います。
そのとき、「20200601_〇〇.py」「20200602_〇〇.py」「20200602_〇〇修正.py」「20200602-1_〇〇.py」みたいに同じようなファイル名にしておくと、どれが最新なのかがわかりません。
これが個人で開発するなら、まだ自分だけの問題ですが、複数の人とチームで作業するとなると大変です。
そうした問題を解決してくれるの「Git」です。
Gitでよく出てくる用語
Gitでは専門用語がいくつも登場します。
初心者にはとっつきにくい用語ばかりなので、整理しておきます。
リポジトリ
変更履歴を記録する場所のこと。
大まかにローカルとリモートがあります。
ローカルリポジトリ:自分のPC上にある履歴データを保管する場所
リモートリポジトリ:自分のPCではない別の保管場所(GitHubなど)
ワークツリー
自分のPC上でファイルを操作しているところ。
Gitで管理している作業フォルダがあって、その中に編集しているファイルがあれば、そこがワークツリーのこと。
ステージ
コミットするファイルを準備する場所。
スナップショットを記録するために一時的に用意されているところで、ここにあるものをコミットすることで、ローカルリポジトリに保存がされます。
Gitでのファイル管理で意識しておきたいのは、ワークツリー→ステージ→ローカルリポジトリの3つです。
手元のファイルを編集したら、変更したことを記録するローカルリポジトリに保存をすればいいのですが、そうしないで一度ステージに変更履歴を保存します。
その理由は、変更したファイルが複数あるときに、変更履歴を残したいファイル内容だけを保存することができるからです。
コミット
スナップショットを記録すること。
コミットをしてはじめてローカルリポジトリに保存されます。
スナップショットとは、「Git」が管理しているすべてのファイルと、ファイルの情報を記録し、データベースに保存することです。
Gitでは「差分」ではなく「スナップショット」を保存しています。
どういうことかというと、管理しているファイルで編集がされていないファイルについても保存をしています。
ただし、編集していないファイルについては、以前のバージョン(今がバージョン2なら1)を参照することで、無駄なファイルを保存しないようにしています。
Gitでファイル管理をするワークフロー
Gitでファイルを管理するときの大まかな流れは次のようになっています。
ファイルを変更→ステージに追加→ローカルリポジトリに保存→リモートリポジトリに保存
ファイル変更
↓git add
ステージングエリア(控室)
↓git comit
ローカルリポジトリ
↓git push
リモートリポジトリ ← GitHubなど
Gitでよく使うコマンド
ここからは、Gitでよく使うコマンドを紹介します。
新規でバージョン管理をする(ローカルリポジトリ作成)
git init
実行すると「.git」ディレクトリが作成されます。
「.git」とは、ローカルリポジトリのこと。
ちなみに名前の頭に「.」があるのは、隠れファイル(フォルダ)のことです。普通に見えないファイル(フォルダ)です。
リポジトリのコピーを作成する
git clone <リポジトリ名>
たとえば、GitHub上にあるリポジトリをコピーしたい場合は、リポジトリ名のところに「https://github.com/atom/atom.git」のようにURLを入力します。
ステージに追加する
git add <ファイル名>
ファイルをステージに追加します。
git add <ディレクトリ名>
ディレクトリをステージに追加します。
git add .
ワークツリーのすべてを変更する場合は「.」としてaddします。
変更を記録(コミット)する
git commit
コミットコマンドを実行すると、エディターが立ち上がります。
そこにコミットメッセージを入力します。
入力内容は、変更内容の要点と理由です。
また、オープンソースなど公式なものにコミットする場合のメッセージの書き方は次のようになります。
1行目:変更内容の要約
2行目:空行
3行目:変更した理由
git commit -v
「-v」オプションを追加すると、変更した内容を確認することができます。
変更差分を確認する
git addする前
git diff
git diff <ファイル名>
git addした後
git diff --staged
変更履歴を確認する
git log
最近のコミットから表示されます。
一行で表示する場合は「–online」を付けます。
git log --oneline
ファイルの変更差分を表示する場合は「-p」の後にファイル名を付けます。
git log -p index.html
表示するコミット数を制限する場合は「-n」の後に表示する数を指定します。
git log -n <コミット数>
管理対象ファイルを確認する
git ls-files
gitで管理されているファイルが表示されます。
git ls-files --others
gitで管理対象外のファイルが表示されます。
git ls-files --others --exclude-standard
.gitignoreファイルに記載されているファイルを除外した管理対象外のファイルが表示されます。
ファイルの削除を記録する
ワークツリーとリポジトリから削除
git rm <ファイル名>
git rm -r <ディレクトリ名>
元に戻す場合は
git reset HEAD <ファイル名>
git checkout <ファイル名>
と入力します。
リポジトリから削除
git rm --cached <ファイル名>
パスワードがはいったファイルなどを間違えてリポジトリにあげてしまった場合などに使用します。
ファイルの移動
git mv <旧ファイル> <新ファイル>
上記コマンドは、「rm」した後に旧ファイルを削除し、新ファイルを「git add」しているのと同じです。
gitの管理からはずす
管理しているディレクリの中に「.gitignore」ファイルを作成し、そこに管理から外したいファイル名を指定します。
- ファイル名
- ディレクトリ名
などを記述します。
たとえば、「secret.txt」というファイルを管理したくない場合、「.gitignore」ファイルに「secret.txt」と入力します。
ディレクトリ名を除外する場合は「dir/」と入力します。
「#」から始まる行はコメントになります。
下記のようなファイルは、バージョン管理したくないファイルとして除外します。
- 自動生成されるファイル
- パスワードが記載されているファイル
ファイルへの変更を取り消す
git checkout --<ファイル名>
git checkout --<ディレクトリ名>
git checkout --.
「.」はすべてを取り消すときに使用します。
ステージした変更を取り消す
git reset HEAD <ファイル名>
git reset HEAD <ディレクトリ名>
git reset HEAD .
git addでステージに追加した変更内容を取り消します。
ただし、ワークツリー上の変更は取り消していないので、それも取り消す場合は、resetコマンドを実行した後にcheckoutコマンドも行います。
「HEAD」とは今いるブランチの最新のコミットのことを指します。
直前のコミットをやり直す
git commit --amend
リモートリポジトリにpushしたコミットはやり直ししてはいけない!
GitHubに関連するコマンド
ここからGitを使ったサービス「GitHub」を利用するときに使うコマンドを紹介します。
GitHubにプッシュする
リモートリポジトリ(GitHub)にローカルリポジトリを上げることを「プッシュする」と言います。
GitHubでリポジトリを新規追加する
ローカルリポジトリをプッシュするための場所をまず用意します。
GitHubにアクセスし、マイページの「Your Reporsitories」を選択。
「New」で新規追加します。
「Repository name」が下で紹介している「リモートURL」の部分になります。
リモートリポジトリに新規追加する
git remote add <リモート名> <リモートURL>
git remote add origin http://github/user/repo.git
「origin」とはショートカット名のことで、http以下の場所にリモートリポジトリを登録するという意味です。
「origin」というショートカットを登録しておくことで、次回からURLを指定せずにアップしたり取得ができるようになります
「origin」は慣用名なので、そのまま使用してOKです。
リモートリポジトリに送信(プッシュ)する
git push <リモート名> <ブランチ名>
git push origin master
ローカルリポジトリにコミットした内容を上記のコマンドでプッシュします。
masterというのはブランチのデフォルト名です。
「-u」を付けてpushすると次回からorigin masterをpushするときに省略することができます。
GitHubのリモートを表示する
git remote
オプション「-v」をつけると、URLを表示されます。
より詳細情報を知りたい場合は、showコマンドを利用します。
git remote show <リモート名>
showコマンドでは
- fetchとpullのURL
- リモートブランチ
- git pullの挙動
- git pushの挙動
を確認することができます。
リモートリポジトリは複数登録することができます。
GitHubのリモートから取得する
GitHubのリモートリポジトリから情報を取得する方法は「fetch」「pull」の2つがあります。
fetch
git fetch <リモート名>
リモートリポジトリからローカルリポジトリに保存されます。
ワークツリーには反映されません。
反映させるにはmergeコマンドが必要になります。
git merge origin/master
pull
git pull <リモート名> <ブランチ名>
リモート名とブランチ名を省略することもできます。
pullはfetchで行っていた作業(リモートリポジトリからローカル、ローカルからワークツリー)をまとめて行うことができます。
ただし、プルした場合は今いるブランチにマージされるため、プルしたものと今いるブランチが違う場合は注意が必要。
GitHubリモート名の変更・削除
リモート名の変更にはrenameコマンドを使用します。
git remote rename <旧リモート名> <新リモート名>
リモートを削除するにはrmコマンドを使用します。
git remote rm <リモート名>
学習で参考にしたサイトや本など
udemy
Git: もう怖くないGit!チーム開発で必要なGitを完全マスター
ほとんどここで学んだことをまとめています。
図式で説明してくれているので、初心者にもとてもわかり易いです。