GitHubは、Gitを利用したコードのバージョン管理やプロジェクトの管理、ページの公開などが行えるホスティングサービスです。一般的には、ローカルのGitと接続することでプロジェクトのチーム開発に用いられることが多いですが、タスクの管理やバグや開発予定のissue管理などでも活用されます。
この記事では、まずはGitHubの操作を学ぶ前に、GitHubのようなリモートリポジトリを操作するための基礎知識についてまとめます。
目次
リポジトリとは
Git管理下にあるフォルダ・ディレクトリのことを“リポジトリ”と呼びます。
個人のPC上で駆動する(実際にコードを書く)リポジトリを“ローカルリポジトリ”と呼びます。
一方で、Gitの運用では、チームやスポンサーなど、複数人数で開発されることが多いので、その場合、リポジトリの状態を共有保存する必要があります。このリポジトリを“リモートリポジトリ”と呼びます。
リモートリポジトリは、一般的にはGitHubやGitLabなどのホスティングサービスのことを指しますが、厳密にはインターネット上のサーバ管理下に存在している必要はありません。
PC上で、ローカルリポジトリとリモートリポジトリを作って仕様を把握する
PC上で、git_remote
とgit_local_1
、git_local_2
という3つのフォルダを作成します。
% ls -al
drwxr-xr-x 5 user staff 160 11 18 21:18 .
drwxr-xr-x@ 21 user staff 672 6 8 16:27 ..
drwxr-xr-x 2 user staff 64 11 18 21:18 git_local_1
drwxr-xr-x 2 user staff 64 11 18 21:18 git_local_2
drwxr-xr-x 2 user staff 64 11 18 21:18 git_remote
git_remote
フォルダをリモートリポジトリの役割をさせ、git_local_1
とgit_local_2
の2つのフォルダは、別の人が運用するローカルリポジトリの役割とさせましょう。
まずは、git_remote
でGitを始め、first.txtというファイルを作成してコミットします。
% cd git_remote
% git init
Initialized empty Git repository in /git_remote/.git/
% echo "1" >> first.txt # 1とだけ文字が入ったfirst.txtというファイルを作成します。
% git add .
% git commit -m "first commit"
[main (root-commit) bd5f608] first commit
1 file changed, 1 insertion(+)
create mode 100644 first.txt
Gitのコミットの基本操作については、こちらの記事をご覧ください。
git remote
でリモートリポジトリと接続する
git_local_1
フォルダでGitを始めてリポジトリにします。
% git remote add origin ../git_remote
上記コマンドはローカルリポジトリとリモートリポジトリを紐付けるコマンドで、origin
の部分はそのリモートリポジトリの名前空間(ローカル毎に好きに設定することができます。originとすることが多いです。)、../git_remote
の部分がリモートリポジトリのパスです。
このコマンドは、リモートリポジトリの存在や指定が間違っていてもエラーが発生しないので注意が必要です。
追加したリモートリポジトリは、git remote -v
と叩くことで確認することができます。
% git remote -v
origin ../git_remote (fetch)
origin ../git_remote (push)
% git remote add dummy ../hoge
% git remote -v
dummy ../hoge (fetch)
dummy ../hoge (push)
origin ../git_remote (fetch)
origin ../git_remote (push)
適当なリモートリポジトリを指定してもエラーがなく追加されてしまっていることがわかります。
git pull
でリモートリポジトリの内容を引っ張ってくる
リモートリポジトリで設定しただけでは、まだコミット内容は引っ張ってきていません。
先ほど追加したリモートリポジトリの名前空間を使ってリモートリポジトリの内容をプルします。
% git pull origin main
git pull
はリモートリポジトリから指定したブランチに指定するコマンドです。上記のコマンドでは、originと名付けられたリモートリポジトリから、mainブランチにプルしようとしています。
正常にリモートリポジトリが指定できていると、リモートリポジトリの最新のコミットを引っ張ってくることができます。
リモートリポジトリの設定が間違っているとエラーが発生する
先ほど、git remote
でわざと間違ったリモートリポジトリを設定しましたが、エラーは発生しませんでした。そのリモートリポジトリを指定して、プルを実行するともちろんエラーが発生します。
% git pull dummy main # わざと間違えてと登録したリモートリポジトリ
fatal: '../hoge' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
% git pull hoge main # 登録すらしていないリモートリポジトリ
fatal: 'hoge' does not appear to be a git repository
fatal: Could not read from remote repository.
Please make sure you have the correct access rights
and the repository exists.
どちらも、「そのリポジトリを読み込むことができません」という旨のエラーが表示されます。このエラーが発生した時は、リモートリポジトリのパスが正しいか、登録したリモートリポジトリの名前が正しいかを、再確認してもう一度、実行してみましょう。
git clone
でローカルリポジトリにコミットをクローンする
git_remote
リポジトリのコミットをgit_local_2
フォルダにクローンします。
% cd ../git_local_2
% git clone ../git_remote . # git_remoteのGitをgit_local_1にコピーします。
git clone
の次に指定している部分がリモートリポジトリのパスです。GitHubなどの場合は、HTTPSやSSHなどホスティングサービスが提供する内容によって提供します。
git clone
を叩き接続に成功すると、リモートリポジトリの設定(git remote
の設定)をせずに、リモートリポジトリの内容をローカルリポジトリに反映させることができます。
git push
でリモートリポジトリに送信する
ローカルリポジトリのコミットをリモートリポジトリに反映させるのは、プルと同様の方法で、コマンドを実行します。
% pwd
/git_local_1 # 現在、git_local_1ディレクトリにいます
% git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 240 bytes | 240.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
To ../git_remote
bd5f608..e2d44b5 main -> main
git push
の前には、ローカルリポジトリでコミット済みである必要があります。git status
でファイルのコミット漏れがないことを確かめましょう。
また、プッシュしたコミットは、コミット自体を編集することができません(すると整合性に問題が発生する可能性が高い)ので、プッシュ前にコミットの内容を確認しましょう。
コミットについて詳しくは、下記の記事をご覧ください。
その後の流れ
git_local_1
のローカルリポジトリがコミットした内容を、git_local_2
のローカルリポジトリに取り込みます。
% pwd
/git_local_2 # 現在、git_local_2ディレクトリにいます
% git status
On branch main
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.
(use "git pull" to update your local branch)
nothing to commit, working tree clean
git_local_2
リポジトリで、現在のgitの状況を確認すると、use "git pull" to update your local branch
(ローカルブランチをアップデートするためにgit pull
を実行してください。)と書いてあります。git pull
を実行しましょう。
% git pull origin main
From ../git_remote
* branch main -> FETCH_HEAD
Updating bd5f608..e2d44b5
Fast-forward
first.txt | 1 +
1 file changed, 1 insertion(+)
実行に成功するとgit_local_1
リポジトリで変更したコミットを取り込むことができていることがわかります。
Gitを用いた開発では、複数のローカルリポジトリで開発されコミットされたバージョンを適宜取り込んでバージョンを合わせることで、どのローカルリポジトリでも同じソースコードで開発を続けることができます。
git push
、git pull
だけでリモートにアクションする
プロジェクトのGit運用では、リモートリポジトリは、特定の1つだけになることが多いので、git push
、git pull
とリモートリポジトリの名前とブランチを省略したくなります。
設定をしないまま実行すると、ブランチやリモートの設定をするよう怒られます。
% git push
fatal: The current branch main has no upstream branch.
To push the current branch and set the remote as upstream, use
git push --set-upstream origin main
To have this happen automatically for branches without a tracking
upstream, see 'push.autoSetupRemote' in 'git help config'.
% git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.
git pull
If you wish to set tracking information for this branch you can do so with:
git branch --set-upstream-to=origin/ main
エラーメッセージによると、upstream
を設定しなさいとあります。特定のブランチを“上流に”設定しなさい。つまり、優先的にプッシュ・プルする設定をしなさい。ということです。
指定通り、--set-upstream
や--set-upstream-to=origin/main
と設定することもできますが、一度、-u
オプションをつけてプッシュすることでもupstream
に設定することができます。
この時、現在のブランチに変更がない(何もコミットされていない)状態でも問題ありません。
% git status On branch main nothing to commit, working tree clean % git push -u origin main branch 'main' set up to track 'origin/main'. Everything up-to-date % git push Everything up-to-date % git pull Already up to date.
一度、プッシュの際に-u
オプションをつけると、次回以降リポジトリとブランチをしてしなくても、Everything up-to-date
(全てアップデート済み)Already up to date
(既にアップデート済み)とコマンドの実行ができていることがわかります。
リモートリポジトリの名前やパスを変更する
git remote
で登録した名前やパスは、追加するとき、add
と入力した部分を変えるだけで簡単に変更できます。
% git remote -v
dummy ../hoge (fetch)
dummy ../hoge (push)
% git remote rename dummy hommy
% git remote -v
hommy ../hoge (fetch)
hommy ../hoge (push)
% git remote set-url hommy ../fuga
% git remote -v
hommy ../fuga (fetch)
hommy ../fuga (push)
% git remote rm hommy
% git remote -v
% # 何も表示されずに次のコマンドを求められます。
このようにリモートリポジトリの設定は後から好きに変更することができます。さらに詳しいgit remote
の機能は、git remote --help
と実行することで確認することができます。