Git及びGitHubについて基本知識


概要

 初心者にも分かるようにGit及びGitHubの構造・用語説明・基本操作についてまとめてみた。mainブランチ?originってよく見るけど何?クローン?っていう方には見ていただきたい。本記事ではgit-flow開発をベースに書かれている。git-flowの構築についてはこちらを参考にしてほしい。

gitの全体像

 git、githubの全体像を画像に示す。ローカルリポジトリは、各パソコンの環境であり、リモートリポジトリは、GitHubなどのソースコード管理Webサービスである。ローカルリポジトリは、さらに実際にソースコートを編集することができるローカルブランチ(作業ブランチ)、リモートブランチの情報を保持し、ローカルブランチとリモートブランチの受け渡しの役割を担うリモート追跡ブランチが存在する。

origin、mainブランチについて

 “main” ブランチは、リリース可能な品質が保証されたブランチを表すことが多い。"main"がよく使われている理由は、ただ単に $ git initがデフォルトで作るブランチ名がそうだからというだけのこと。 "origin"は、リモートリポジトリのURL(GitHUbなど)を置き換えた値である。名前が “origin” なのは、$ git clone を実行した際のデフォルト名が"origin"であるため。 変更したければ、クローンする際に$ git clone -o booyah とすると、デフォルトのリモートブランチは "booyah/main" となる。

クローンとは?

 クローンは、リモートリポジトリをローカルリポジトリに保存すること。実行するとカレントディレクトリ直下にクローンしてきたプロジェクトが生成される。

shell
$ git clone [リモートリポジトリのURL]
# 具体例
$ git clone https://github.com/author/repository

リモート追跡ブランチを更新

 fetchコマンドで、リモートリポジトリURLにアクセスし、まだ手元にないデータをすべて取得し、リモート追跡ブランチを更新する。
 デフォルトであれば、originがリモートブランチURLを表す。$ git remote -vで、originのURLの値を見ることができる。引数をつけなければ、デフォルト値となる(この場合origin)。

shell
$ git fetch [リモートブランチURL]
# 具体例
$ git fetch origin
# originの場合は、省略することができる
$ git fetch

ローカルブランチ、リモート追跡ブランチの確認

 $ git branch -aを実行することで、ローカルブランチとリモート追跡ブランチを確認することができる。ここではdevelopfeatureがローカルブランチであり、接頭語がremotes/origin/であるブランチがリモート追跡ブランチである。

shell
$ git fetch         # リモート追跡ブランチの更新
$ git branch -a     # リモート追跡ブランチとローカルブランチを表示
* develop
  feature
  foo
  remotes/origin/HEAD -> origin/develop
  remotes/origin/develop
  remotes/origin/feature/foo
  remotes/origin/feature/hoge

ローカルブランチがどのリモートブランチを追跡しているのかの確認

 ローカルブランチは、リモート追跡ブランチと紐づいている必要がある。前章の例では、ローカルブランチのdevelopと、リモート追跡ブランチのremotes/origin/developが紐づいている。どれが紐づいているか以下のコマンドで確認することができる。

shell
$ git branch -vv

リモート追跡ブランチをローカルブランチに保存し作業を進める

 リモートリポジトリにはあって、ローカルリポジトリにはない、ブランチが存在する場合がある。そのブランチをローカルに落としてきて作業の続きをしたい場合の方法を記述する。

shell
$ git checkout -b [ローカルブランチ名] [リモート追跡ブランチ名]

# 具体例
$ git checkout -b issue32 remote/origin/issue32
# 省略版(ローカルブランチ名はissue32で作成される)
$ git checkout --track origin/issue32

新しく機能追加を行う

 既存の最新ブランチに新しく機能を追加をして作業をやり始める方法を記す。git-flowではdevelopブランチが最新ブランチになるため、まずは、developブランチに移動する。git pullで、最新の状態に更新する(詳しくは次章参照)。そして、新しく機能追加をするための作業ブランチを切り、移動し、作業を始めることができる。

sehll
$ git checkout develop             # 開発ブランチに移動
$ git pull                         # 最新の状態に更新
$ git checkout -b [作成ブランチ名]  # developブランチから作業ブランチを切り、移動

git pullとは?

 git pullは、git fetchおよびgit mergeを一つのコマンドにしたものである。最新の状態に更新したいローカルブランチに移動し、git pullを実行すると、リモートリポジトリ上の最新のリモートブランチに更新される。
 git mergeでは変更箇所を統合することであり、ここではリモートブランチの内容をローカルブランチに統合している。

shell
$ git checkout develop     # 更新したいブランチへ移動
$ git pull                 # 最新の状態に更新(git fetch + git merge)

git pushとは?

 git pushでは、ローカルブランチで作業した内容をリモートブランチに反映させるためのコマンドである。ローカルブランチに紐づいたリモート追跡ブランチがあればgit pushだけで、リモートブランチに反映される。無い場合は、作る必要があり、オプション--set-upstream(-u)をつけることで、リモート追跡ブランチの作成及び、リモートブランチへの反映をすることができる。これは初回だけであり、次回以降は、$ git pushだけでリモートブランチに反映される。
 git pushしたら、GitHub上で、プルリクエストを作成するわけであるが、プルリクエストが承認されいざマージする際に、コンフリクトが生じる可能性がある。それをあらかじめ対策するために以下の記事を書いたので参考にしてほしい。

shell
$ git push      # ローカルブランチをリモートブランチへ反映

# ローカルブランチに紐づくリモート追跡ブランチがない場合
$ git push -u origin [ローカルブランチ名]
# 具体例 
$ git push -u origin feature

 ローカルブランチに紐づくリモート追跡ブランチがない場合、いちいちローカルブランチ名をコピーするのは、めんどくさい。そこで以下のコマンドでも代替できる。HEADは、現在のブランチの先頭、つまり、コミットの一番新しいものを指している。 そこからブランチ名を取得できるので、ローカルブランチ名を入力することと同じになる。

# git push -u origin [ローカルブランチ名] と同じ
$ git push -u origin HEAD

他メンバーのプルリクエストをローカルで動作確認

1.ローカルにプルリスエストされたブランチを作成する。 

shell
$ git fetch origin pull/[プルリクエストID]/head:[ローカルへの保存ブランチ名]
# 具体例
$ git fetch origin pull/21/head:feature/issue/21/get_api

2.ローカルに作成されたブランチに移動する。

shell
$ git checkout [ローカルへの保存ブランチ名]
# 具体例
$ git checkout feature/issue/21/get_api

コマンドについてのオプションの意味など調べる

 コマンドのオプションでなにかがわからないことがしばしばある。その時に活用するのが、$ git helpコマンドだ。オプションがどういった機能をするのかも書かれているため、意外と便利である。

shell
$ git help [コマンド名]
# 具体例
$ git help branch

終わりに

 git,githubについて簡単にまとめた。
間違っている個所があればコメントお願いします。

参考