Parallels のサイバーマンデー 25% OFF 12月5日まで安く買う方法

【Mac】個人開発でのGitとGitHubの使い方

GitとGitHubの使い方

あなたは GitHub をご存知だろうか。元 CHAGE and ASKA のASKA氏が最も恐れている謎の組織のことですね。

という冗談は置いといて、今回は Git とか GitHub ってチームで開発するときに使うものなんじゃないの?というあなたに、個人開発でも使いましょうよと無理強いするお話です。

目次

Gitとは

Git とは、テキストファイルの変更履歴を記録するためのバージョン管理システムです。いつ、誰が、何を変更したのかを記録しておくことにより、後から変更履歴を確認したり、ファイルを過去の状態に巻き戻したりすることができます。

プログラマが使うものというイメージがありますが、ウェブデザイナやライターさんも使えるツールです。

Gitの全体像

Gitの図解

安心してください。初心者の方はこの図をぜんぶ理解する必要はありません。最初は緑色の矢印の流れだけ解れば大丈夫です。Gitに慣れてきたら改めてこの図を見ると理解が深まることでしょう。

この図の上部にある四角いのはGitで扱う領域の概念で、下部にある矢印はデータの変更履歴がどのように各領域に反映されるかという流れをあらわしています。

ワーキングツリー作業ディレクトリ配下にあるファイル群を指します。プログラムのコードなどが書かれているファイルですね。あなたが実際にいじることができるファイルはここにあるものだけです。
リポジトリ変更履歴を置いておく格納庫です。ローカル(私のパソコン)とリモート(GitHub)にリポジトリがあります。
一般的にリモートリポジトリにはoriginという名前をつけます。
インデックス /
ステージングエリア
ワーキングツリーでファイルを変更したらgit addコマンドでその変更をインデックスに反映します。
ブランチ変更履歴の流れを分岐する機能です。パラレルワールドの世界線を作るみたいな感じです。
git commitコマンドでインデックスに登録されている変更履歴をローカルブランチに反映します。さらにgit pushコマンドでローカルブランチをリモートブランチに反映します。
一般的にデフォルトのブランチ名はmainです。
リモート追跡ブランチリモートブランチの状態をローカルに保存したものです。
チーム開発においては、他のメンバーによってリモートブランチが変更されれば、git pullgit 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

Git のデフォルトのブランチ名は以前はmasterでしたが、2021年6月から mainが使われるようになりました。人権問題に配慮してということだそうです。

GitHubのアカウント作成

リモートリポジトリとして GitHub を使います。アカウントを作成しましょう。

STEP

GitHubのウェブサイトにアクセスして、右上の [Sign up] をクリックします。

GitHubのアカウント作成01
STEP

メールアドレス、パスワード、ユーザ名を入力していきます。

製品のアップデートやお知らせをメールで受け取りますか?と聞かれるので “y” か “n” で答えて [Continue] します。

GitHubのアカウント作成02
STEP

あなたがロボットではないことを証明します。

私の場合は、複数の画像から渦巻銀河を選択する問題が出題されました。もし渦巻銀河がわからなかったら人間とみなされないようです。怖い。

GitHubのアカウント作成03
STEP

見事人間だと証明されると、launch code がメールで送られてくるので、入力します。

GitHubのアカウント作成04
STEP

以上で GitHub のアカウント作成が完了しました。お疲れサマンサ。

GitHubのアカウント作成05

個人用アクセストークンの作成

個人用アクセストークン(Personal access token)はローカルから GitHub に接続するときの認証で使用します。

以前はパスワードで認証できましたが、2021年8月にパスワード認証は廃止されました。

STEP

GitHub にサインインして、右上のドロップダウンメーニューから「Settings」を選択します。

個人用アクセストークンの作成01
STEP

左サイドメニューの「Developer settings」をクリックします。

個人用アクセストークンの作成02
STEP

左サイドメニューの「Personal access tokens」をクリックして、[Generate new token]をクリックします。

個人用アクセストークンの作成03
STEP

パスワードを入力して[Confirm]をクリックします。

個人用アクセストークンの作成04
STEP

「Note」でこのトークンに適当な名前をつけます。

「Expiration」はトークンの有効期限です。期限が切れたらまた作成しなければならないので、私は「No expiration」を選んじゃいました。セキュリティリテラシーが低い奴めと罵るがいい。

「Select scopes」で、このトークンでアクセス可能な範囲を選択します。repo、admin:repo_hook、delete_repo の3つを選択すればOKです。

入力が終わったら[Generate token]をクリックします。

個人用アクセストークンの作成05
STEP

トークンが発行されました。このページを閉じるとトークンは二度と確認できなくなりますので、キーチェーンなりBitwardenなりに保存しておきましょう。

個人用アクセストークンの作成06

目的別Gitの使い方

リモートリポジトリの作成

リモートリポジトリはプロジェクトを開始するときに一回だけ作成します。

GitHubにサインインして、 [Create repository] をクリックします。

リモートリポジトリの作成01

次の画面で Repository name (リポジトリ名)を付けます。命名規則はありませんが、ケバブケース(英数小文字とハイフン)で付けることが多いようです。

このリポジトリを公開するなら Public を、非公開ならば Private を選択します。

入力が終わったら [Create repository] をクリックします。

リモートリポジトリの作成02

以上でリモートリポジトリの作成が完了しました。

リモートリポジトリの作成03

ローカルリポジトリの作成方法が記載されていますので、続けて作成していきましょう。

ローカルリポジトリの作成

ローカルリポジトリはプロジェクトを開始するときに一回だけ作成します。

まず、プロジェクトの作業ディレクトリを作成しましょう。普通はリモートリポジトリと同じ名前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の流れ

変更をインデックスに追加する (git add)

ワーキングツリー内のファイルを変更したら、まずはその変更をインデックスに追加します。下記のいずれかのコマンドを実行します。

% git add <ファイル1> <ファイル2> ...  #指定したファイルを追加
% git add -A  #新規作成、変更、削除されたすべてのファイルを追加
% git add -u  #変更、削除されたすべてのファイルを追加
% git add .   #新規作成、変更されたすべてのファイルを追加

私は、いちいちファイルを指定するのが面倒なのでgit add .を使ってます。ファイルを削除したときのみgit add -Aですね。

変更をローカルブランチにコミットする (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のブランチ

ブランチの作成

ローカルリポジトリの作成(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 に戻す

コミットIDはgit logで確認できます。

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を範囲で指定
reset と revert の違い

git resetは取り消したことが記録に残りません。変更履歴ごと抹消します。

git revertは取り消したということを記録するための新しいコミットが作成されます。

resetとrevetの違い

リモートリポジトリの変更を取得

まず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 fetchgit mergeをまとめて行うコマンドもあります。

% git pull origin main

個人開発では、リモートリポジトリの取得はあまり使わないかも知れませんね。ファイルを変更するのは自分だけですからね。他の誰かがこっそり変更してたら怖いです。

ああ、休日は別荘で開発しますというブルジョワジーな方は使うのかも。

変更履歴の確認

% git log

git logにはいろいろなオプションがあるので、別の機会に詳しくやりたいと思います。

GitとGitHubの使い方

この記事が気に入ったら
いいね または フォローしてね!

シェアしてね

コメント

コメントする

目次