ZATYのBLOG

お問い合わせする

【Gitを学ぶ】リモート・ローカルリポジトリについてちゃんと理解する/remote/push/pull/

GitHubは、Gitを利用したコードのバージョン管理やプロジェクトの管理、ページの公開などが行えるホスティングサービスです。一般的には、ローカルのGitと接続することでプロジェクトのチーム開発に用いられることが多いですが、タスクの管理やバグや開発予定のissue管理などでも活用されます。

この記事では、まずはGitHubの操作を学ぶ前に、GitHubのようなリモートリポジトリを操作するための基礎知識についてまとめます。

リポジトリとは

Git管理下にあるフォルダ・ディレクトリのことを“リポジトリ”と呼びます。

個人のPC上で駆動する(実際にコードを書く)リポジトリを“ローカルリポジトリ”と呼びます。

一方で、Gitの運用では、チームやスポンサーなど、複数人数で開発されることが多いので、その場合、リポジトリの状態を共有保存する必要があります。このリポジトリを“リモートリポジトリ”と呼びます。

リモートリポジトリは、一般的にはGitHubやGitLabなどのホスティングサービスのことを指しますが、厳密にはインターネット上のサーバ管理下に存在している必要はありません。

PC上で、ローカルリポジトリとリモートリポジトリを作って仕様を把握する

PC上で、git_remotegit_local_1git_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_1git_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 pushgit pullだけでリモートにアクションする

プロジェクトのGit運用では、リモートリポジトリは、特定の1つだけになることが多いので、git pushgit 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と実行することで確認することができます。