あなたは GitHub をご存知だろうか。元 CHAGE and ASKA のASKA氏が最も恐れている謎の組織のことですね。
という冗談は置いといて、今回は Git とか GitHub ってチームで開発するときに使うものなんじゃないの?というあなたに、個人開発でも使いましょうよと無理強いするお話です。
Gitとは
Git とは、テキストファイルの変更履歴を記録するためのバージョン管理システムです。いつ、誰が、何を変更したのかを記録しておくことにより、後から変更履歴を確認したり、ファイルを過去の状態に巻き戻したりすることができます。
プログラマが使うものというイメージがありますが、ウェブデザイナやライターさんも使えるツールです。
Gitの全体像
安心してください。初心者の方はこの図をぜんぶ理解する必要はありません。最初は緑色の矢印の流れだけ解れば大丈夫です。Gitに慣れてきたら改めてこの図を見ると理解が深まることでしょう。
この図の上部にある四角いのはGitで扱う領域の概念で、下部にある矢印はデータの変更履歴がどのように各領域に反映されるかという流れをあらわしています。
ワーキングツリー | 作業ディレクトリ配下にあるファイル群を指します。プログラムのコードなどが書かれているファイルですね。あなたが実際にいじることができるファイルはここにあるものだけです。 |
リポジトリ | 変更履歴を置いておく格納庫です。ローカル(私のパソコン)とリモート(GitHub)にリポジトリがあります。 一般的にリモートリポジトリには origin という名前をつけます。 |
インデックス / ステージングエリア | ワーキングツリーでファイルを変更したらgit add コマンドでその変更をインデックスに反映します。 |
ブランチ | 変更履歴の流れを分岐する機能です。パラレルワールドの世界線を作るみたいな感じです。git commit コマンドでインデックスに登録されている変更履歴をローカルブランチに反映します。さらにgit push コマンドでローカルブランチをリモートブランチに反映します。一般的にデフォルトのブランチ名は main です。 |
リモート追跡ブランチ | リモートブランチの状態をローカルに保存したものです。 チーム開発においては、他のメンバーによってリモートブランチが変更されれば、 git pull やgit fetch でリモート追跡ブランチを更新する必要があります。個人開発においては、あまり気にしなくてよいと思います。 |
最初にすること
Gitのインストール
Mac に Git をインストールするには主に下記の3つの方法があります。
- コマンドライン・デベロッパツールをインストールする
- Homebrew でインストールする
- Xcodeをインストールする
Xcode またはコマンドライン・デベロッパツールをインストールするとGit が付属しています。ただしこれらに付属する Git はバージョンがちょっと古いです。Homebrewでインストールするならば最新のバージョンを使えます。
コマンドライン・デベロッパツールをインストールする方法
ターミナルで下記のコマンドを実行してみてください。
% git -v
これは Git のバージョンを確認するコマンドです。バージョンが表示されたら、すでに Git はインストールされています。
Git がインストールされていなければ「”git”コマンドを実行するには、コマンドライン・デベロッパツールが必要です。」というウインドウが表示されるので、素直に従いましょう。
Homebrewでインストールする方法
どうしても最新版の Git が使いたいんじゃという新しもの好きのあなたは Homebrew でインストールしましょう。次のコマンドでインストールできます。
% brew install git
Homebrew のインストールがまだの方はこちらの記事をどうぞ。
Xcodeをインストールする方法
Xcode は App Store からインストールできます。でも、サイズの大きいアプリですから Git のためだけにインストールするのはおすすめしません。
Gitの初期設定
次のコマンドで名前とメールアドレス、デフォルトのブランチ名を設定します。
% git config --global user.name "Kadenokouji Masawo"
% git config --global user.email ******@oopsoop.com
% git config --global init.defaultBranch main
設定の確認。
% git config --list
credential.helper=osxkeychain
user.name=Kadenokouji Masawo
user.email=******@oopsoop.com
init.defaultbranch=main
GitHubのアカウント作成
リモートリポジトリとして GitHub を使います。アカウントを作成しましょう。
GitHubのウェブサイトにアクセスして、右上の [Sign up] をクリックします。
メールアドレス、パスワード、ユーザ名を入力していきます。
製品のアップデートやお知らせをメールで受け取りますか?と聞かれるので “y” か “n” で答えて [Continue] します。
あなたがロボットではないことを証明します。
見事人間だと証明されると、launch code がメールで送られてくるので、入力します。
以上で GitHub のアカウント作成が完了しました。お疲れサマンサ。
個人用アクセストークンの作成
個人用アクセストークン(Personal access token)はローカルから GitHub に接続するときの認証で使用します。
GitHub にサインインして、右上のドロップダウンメーニューから「Settings」を選択します。
左サイドメニューの「Developer settings」をクリックします。
左サイドメニューの「Personal access tokens」をクリックして、[Generate new token]をクリックします。
パスワードを入力して[Confirm]をクリックします。
「Note」でこのトークンに適当な名前をつけます。
「Expiration」はトークンの有効期限です。期限が切れたらまた作成しなければならないので、私は「No expiration」を選んじゃいました。セキュリティリテラシーが低い奴めと罵るがいい。
「Select scopes」で、このトークンでアクセス可能な範囲を選択します。repo、admin:repo_hook、delete_repo の3つを選択すればOKです。
入力が終わったら[Generate token]をクリックします。
トークンが発行されました。このページを閉じるとトークンは二度と確認できなくなりますので、キーチェーンなりBitwardenなりに保存しておきましょう。
目的別Gitの使い方
リモートリポジトリの作成
リモートリポジトリはプロジェクトを開始するときに一回だけ作成します。
GitHubにサインインして、 [Create repository] をクリックします。
次の画面で Repository name (リポジトリ名)を付けます。命名規則はありませんが、ケバブケース(英数小文字とハイフン)で付けることが多いようです。
このリポジトリを公開するなら Public を、非公開ならば Private を選択します。
入力が終わったら [Create repository] をクリックします。
以上でリモートリポジトリの作成が完了しました。
ローカルリポジトリの作成方法が記載されていますので、続けて作成していきましょう。
ローカルリポジトリの作成
ローカルリポジトリはプロジェクトを開始するときに一回だけ作成します。
まず、プロジェクトの作業ディレクトリを作成しましょう。普通はリモートリポジトリと同じ名前sample-project
にしますよね。
% mkdir sample-project
作成したディレクトリに移動して、何か適当にファイルを作成します。ここではREADME.mdというファイルを作成しました。
% cd sample-project
% echo "# sample-project" >> README.md
そしていよいよローカルリポジトリを作成します。
% git init
Initialized empty Git repository in /Users/********/sample-project/.git/
% ls -a
. .. .git README.md
ls -a
してみると.git
という隠しディレクトリが作成されているのがわかります。ここにファイルの変更履歴が保存されます。
変更履歴の保存
Git で変更履歴を保存する流れは次のようになります。
変更をインデックスに追加する (git add)
ワーキングツリー内のファイルを変更したら、まずはその変更をインデックスに追加します。下記のいずれかのコマンドを実行します。
% git add <ファイル1> <ファイル2> ... #指定したファイルを追加
% git add -A #新規作成、変更、削除されたすべてのファイルを追加
% git add -u #変更、削除されたすべてのファイルを追加
% git add . #新規作成、変更されたすべてのファイルを追加
変更をローカルブランチにコミットする (git commit)
上記のインデックスへの追加は仮登録みないなもんです。次のコマンドで正式に変更をブランチに登録します。
% git commit -m "コミットメッセージ"
コミットメッセージにはどんな変更をしたかを書きます。
-m
を指定しなかった場合はエディタが開いて複数行のコミットメッセージを記入することができます。
変更をリモートブランチに転送する (git push)
ローカルブランチの内容をリモートブランチ(GitHub)に転送します。
% git remote add origin https://github.com/<ユーザ名>/<リポジトリ名>.git
% git push origin main
Username for 'https://github.com': kdmasawo
Password for 'https://kdmasawo@github.com':
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 255 bytes | 255.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To https://github.com/kdmasawo/sample-project.git
* [new branch] main -> main
1行目でリモートリポジトリのURL(https://github.com/<ユーザ名>/<リポジトリ名>.git
)に名前(origin
)をつけています。このコマンドは最初の1回のみ実行してください。以降、リモートリポジトリはorigin
という名前で参照することができます。
2行目でローカルのmain
ブランチをリモート(origin
)の同名のブランチに転送しています。Usernameを聞かれたらGitHubのユーザ名を、Passwordを聞かれたら個人用アクセストークンを入力します。
変更履歴の分岐(ブランチ)
ブランチとは変更履歴の流れを分岐する機能です。パラレルワールドの世界線を作るようなものです。
プロジェクトの変更履歴を分岐することによって、安定したブランチ(main)に影響を与えることなく、開発用のブランチ(develop)で作業をすることができます。
main から分岐して develop ブランチを作成し、develop ブランチでの作業が完了したら、その変更を main ブランチに統合します。
ブランチの作成
ローカルリポジトリの作成(git init
)をしたときに、すでに初期ブランチmain
が作成されています。このブランチを元に、新しくdevelop
というブランチを作成します。
% git branch develop
ブランチの一覧
次のコマンドでブランチの一覧を確認することができます。肛門マーク(*
)がついているのが現在のブランチです。
% git branch
develop
* main
ブランチの切り替え
ブランチの切り替えとは、指定したブランチの最後のコミット内容をワーキングツリーに反映することです。
% git checkout develop #ブランチの切り替え
Switched to branch 'develop'
% git branch #ブランチの一覧表示
* develop
main
ブランチの統合
develop
ブランチで開発をすすめ、一段落したら(ちゃんと動くことを確認したら)main
ブランチに統合します。
% git checkout main #統合先のブランチに移動
Switched to branch 'main'
% git merge develop #統合元のブランチを指定してマージ
Updating xxxxxxx..xxxxxxx
Fast-forward
README.md | 3 +++
1 file changed, 3 insertions(+)
ブランチの削除
ブランチを削除するには次のようにします。
% git branch -d develop #developブランチを削除
Deleted branch develop (was xxxxxxx).
% git branch #ブランチの一覧表示
* main
変更履歴の取り消し
addする前の変更を取り消す
% git checkout <ファイル名> #特定のファイルの変更を取り消す
% git checkout <ディレクトリ名> #特定のディレクトリの変更を取り消す
% git checkout . #カレントディレクトリのすべての変更を取り消す
addを取り消す
add後、commit前の変更を取り消します。
% git reset --mixed HEAD #addだけを取り消す
% git reset --hard HEAD #addとワーキングツリーの変更を取り消す
HEAD
とは現在のブランチの最新のコミットを指します。上記の例は最新のコミットの状態にリセットするということになります。
commitを取り消す
指定したコミットまで巻き戻します。
% git reset --soft HEAD^ #1つ前のcommitに戻す
% git reset --mixed HEAD^ #1つ前のcommitに戻す addも戻す
% git reset --hard HEAD^ #1つ前のcommitに戻す addとワーキングツリーも戻す
HEAD
は最新のコミットを指しますが、HEAD^
は1つ前のコミットを指します。上記の例は1つ前のコミットの状態にリセットするということになります。
もうお気付きでしょう。HEAD^^
は2つ前のコミットを指します。なので、次のようになります。
% git reset --hard HEAD^^ #2つ前のcommitに戻す
% git reset --hard HEAD^^^ #3つ前のcommitに戻す
% git reset --hard HEAD^^^^ #4つ前のcommitに戻す
コミットIDで指定することもできます。
% git reset --hard xxxxxxx #コミットID xxxxxxx に戻す
resetを取り消す
間違ってリセットしてしまったら、次のようにしてリセットを取り消せます。
% git reset --hard ORIG_HEAD
commitを打ち消す
指定したコミットの内容を打ち消す新しいコミットを作成します。
% git revert HEAD #最新のcommitを打ち消すcommitを作成する
% git revert xxxxxxx #コミットID xxxxxxx を打ち消すcommitを作成する
% git revert xxxxxxx yyyyyyy #複数のcommitを指定
% git revert xxxxxxx..yyyyyyy #複数のcommitを範囲で指定
git reset
は取り消したことが記録に残りません。変更履歴ごと抹消します。
git revert
は取り消したということを記録するための新しいコミットが作成されます。
リモートリポジトリの変更を取得
まずgit fetch
してリモートリポジトリの内容をリモート追跡ブランチに記録します。
% git fetch origin main #originからmainブランチの変更履歴を取得する
From https://github.com/kdmasawo/sample-project
* branch main -> FETCH_HEAD
次にgit merge
で、これをローカルブランチやワーキングツリーに反映します。
% git checkout main #ブランチを切り替える
% git merge origin #リモート追跡ブランチ(origin)をローカルブランチ(master)とワーキングツリーに反映
上記のgit fetch
とgit merge
をまとめて行うコマンドもあります。
% git pull origin main
個人開発では、リモートリポジトリの取得はあまり使わないかも知れませんね。ファイルを変更するのは自分だけですからね。他の誰かがこっそり変更してたら怖いです。
ああ、休日は別荘で開発しますというブルジョワジーな方は使うのかも。
変更履歴の確認
% git log
git log
にはいろいろなオプションがあるので、別の機会に詳しくやりたいと思います。
コメント