Gitのコマンド一覧 チーム開発編

2019-02-28

フォークしてブランチを切ってプルリク出して…と,Git を使ってチーム開発するときの作法は色々あると思いますが,一例としてご覧ください.(GitHub を利用)

事前準備

フォークする

GitHub 上でプロジェクトトップページ右上の [Fork] ボタンを押し,自分のアカウントでプロジェクトをフォークします.

フォークせずにブランチを切るだけで管理する場合もあるようですが,そこは恐らく流派です.

ローカルに複製する

terminal
$ git clone https://github.com/USER/FORKED.git

フォークしたプロジェクトのトップページ右上 [Clone and download] で URL を取得し,(origin の) ローカルリポジトリを作成します.

リモートリポジトリの登録

リモートリポジトリはチームで共通のリポジトリ (upstream) と個人のリポジトリ (origin) の二つを用意します.前者はフォーク元のプロジェクト,後者はフォークしたプロジェクトです.

後者は git clone した時点でリモートリポジトリに登録されているので,前者を登録します.

terminal
$ git remote add upstream https://github.com/USER/UPSTREAM.git

ちなみに,後者のリモートリポジトリ名は origin です.

認証

pull, push など事あるごとにパスワードを聞かれます,少なくともリモートリポジトリがプライベートであれば.毎回入力するのはめんどくさいので HTTPS 通信ではなく SSH 通信に切り替えます.

公開鍵・秘密鍵生成

SSH での通信には GitHub に登録する公開鍵と自分で保管する秘密鍵が必要です.

ssh-keygen を使います.Windows では Git for Windows をインストールするとついてくる Git Bash から実行できます.

インストール中の設定項目とその内容は以下の通りです.

  • Choosing the default editor used by Git: Vim
  • Adjusting your PATH environment: Git from the command line and also from 3rd-party software
  • Choosing HTTPS transport backend: Use the OpenSSL library
  • Configuring the line ending conversions: Checkout as-is, commit as-is
  • Configuring the terminal emulator to use with Git Bash: Use MinTTY
  • Configuring extra options: Enable file system caching, Enable Git Credential Manager

コマンドが使えるようになったか確認して,鍵を生成します.

terminal
# ssh-keygen が使えるか確認
$ which ssh-keygen
/usr/bin/ssh-keygen

# ディレクトリ移動
$ cd ~/.ssh

# 生成 (パスフレーズは ENTER で OK)
$ ssh-keygen -t rsa -b 4096 -C "mail-address@example.com" -f ~/.ssh/id_rsa

# 公開鍵の内容をクリップボードにコピー
# (Windows)
$ clip < ~/.ssh/id_rsa.pub
# (macOS)
$ pbcopy < ~/.ssh/id_rsa.pub

生成のタイミングでパスフレーズは不要です(普通は秘密鍵を一台でしか持っていないため).設定した場合は,以下のように設定するとパスフレーズの入力を省略できるようです.

terminal
$ ssh-add ~/.ssh/id_rsa

生成したら GitHub 上で公開鍵を登録します.[Settings] > [Personal Settings] > SSH and GPG keys で [New SSH key] を押し,Title に id_rsa, Key にコピペしたら [Add new key] を押します.

テスト接続

terminal
$ ssh -T git@github.com
...
Are you sure you want to continue connecting (yes/no)? yes
Hi USER! you've successfully authenticated, but GitHub does not provide shell access.

上記のように実行出来たら登録完了です.

URL の修正

リモートリポジトリには https://github.com/... で登録されているので,これを変更しなければ HTTPS 通信になります.登録し直してもいいですが,いくつも存在すると手間がかかるので ~/.gitconfig で一気に変更します.(Vim でなくてもいいのでテキストエディタで変更してください)

terminal
$ vim ~/.gitconfig

[url "git@github.com:"]
        InsteadOf = https://github.com

ちなみに,個別に変更する方法は以下のようになります.

terminal
$ git remote set-url origin git@github.com:USER/FORKED.git

運用

ようやく設定終わりました.執筆疲れてきました.

基本的にソースコードの編集はローカルリポジトリから origin に push し,origin から upstream に PR (プルリクエスト) する形で行います.

リポジトリは upstream, origin, ローカルの三種類,ブランチはそれぞれ別で切ることができるので少し複雑な感じですが,心配ないです.

terminal
# ローカルリポジトリ master ブランチに移動
$ git branch task1

# ローカルリポジトリ task1 ブランチに移動
$ git checkout task1

... 作業 ...

# 作業内容をローカルリポジトリ task1 ブランチに追加
$ git add .

# 作業内容をローカルリポジトリに反映
$ git commit -m "hoge"

# リモートリポジトリ origin にいずれかで反映
# origin に task1 ブランチがない & ローカルに task1 ブランチがある
$ git push --set-upstream origin task1
# origin にブランチがある & ローカルにブランチがある
$ git push

「リモートリポジトリ task1 ブランチに反映」の部分ではリモートリポジトリ origin にブランチが登録されていないのでオプションを設定していますが,既にブランチがある場合は実行できません.

ローカルにブランチがなく,リモートにブランチがある場合は,先にブランチを持ってくる必要があります.

terminal
# origin にブランチがある & ローカルにブランチがない
$ git branch task1
$ git checkout task1
$ git fetch origin
$ git merge origin/task1

リモートの origin を更新してから GitHub を開くと upstream (/master) に対して PR できるようになっています.[Compare & pull request] を押してコンフリクトしてなければ,タイトル,変更内容などを書き,PR します.

あとは他の人がチェックしてマージされるのを待つのみです.

参考