フォーク開発したい

$ gh repo fork OWNER/REPO

「フォーク」とは第三者のリポジトリを自分のアカウントにコピーする作業です。 これにより、自分のリポジトリを作業スペースとして、元の開発に安全に協力できます。

GitHub上のリポジトリはghコマンドでフォーク&クローンを作成できます。

注釈

GitLabにもフォーク機能はありますが、 フォークを活用した共同開発は、 どちらかといえばGitHubに根付いている文化のようです。

手動でフォークしたい

// GitHub上で「自分がフォークした」リポジトリ
$ git clone https://github.com/YOUR_USERNAME/REPOSITORY_NAME.git
$ cd REPOSITORY_NAME

// 「元のリポジトリ」をupstreamとして登録
$ git remote add upstream https://github.com/ORIGINAL_OWNER/REPOSITORY_NAME.git

$ git remote --verbose
origin    https://github.com/YOUR_USERNAME/project.git (fetch)
origin    https://github.com/YOUR_USERNAME/project.git (push)
upstream  https://github.com/ORIGINAL_OWNER/project.git (fetch)
upstream  https://github.com/ORIGINAL_OWNER/project.git (push)

// 事故防止:upstreamにpush禁止
$ git remote set-url --push upstream DISABLED

// 設定を確認
$ git remote --verbose
origin    https://github.com/YOUR_USERNAME/project.git (fetch)
origin    https://github.com/YOUR_USERNAME/project.git (push)
upstream  https://github.com/ORIGINAL_OWNER/project.git (fetch)
upstream  DISABLED

ブラウザなどでフォークしたリポジトリを、手動でクローンしてセットアップする手順です。 upstreamとして設定したオリジナルのリポジトリにgit pushできないようにすることで、誤操作を防ぎ、安全に管理できるようにしています。

元のリポジトリの最新状態を取得したい

// 作業ブランチをmainに切り替える
$ git switch main

// upstreamから最新情報を取得する
$ git fetch upstream

// upstream/main を 自分のmainに取り込む
$ git merge upstream/main

// 自分のリポジトリのmainを更新する
$ git push origin main

フォーク開発をしていると、元のリポジトリと、自分のリポジトリの間に差が生じます。 定期的にupstreamの変更を取り込み、乖離しすぎないように注意しましょう。

注釈

こまめに作業している場合は、とくに問題にならないかもしれませんが、しばらく放っておくとあっという間に乖離します。 乖離しすぎた場合は、フォークを作り直すのもひとつの選択肢だと思います。

$ git rebase upstream/main

元のリポジトリの変更を取り込むときには mergeの代わりにrebaseを使うこともできます。 どちらを使うかはリポジトリごとの管理ポリシーや開発方針を参考にして判断してください。

元のリポジトリへのプッシュを禁止したい

$ git remote set-url --push upstream DISABLED

// 他に
$ git remote set-url --push upstream NO_PUSH
$ git remote set-url --push upstream READONLY
$ git remote set-url --push upstream FORBIDDEN
$ git remote set-url --push upstream DENIED

元のリポジトリ(upstream)に間違えてプッシュしないための設定です。 プッシュ用のURLを無効なURLを設定します。 任意の文字列で構いませんが、 DISABLEDNO_PUSHREADONLY などがよく使われるようです。

ブランチを作成したい

$ git switch main
$ git pull upstream main
$ git switch --create feature/<new-branch-name>

$ git add <edited-files>
$ git commit -m "feat: add new implementation"

$ git push --set-upstream origin feature/<new-branch-name>

ブランチを整理したい

$ git switch main
$ git branch --delete feature/<merged-feature>
$ git remote prune origin

プルリクエストしたい

// 新しいブランチを作成して切り替え
$ git switch --create feature/<new-branch-name>

// 自分のフォークにプッシュ
$ git push -u origin feature/<new-branch-name>

// GitHub上で「Compare & Pull Request」

開発ブランチを 自分のフォーク にプッシュします。 リモートに開発ブランチがない場合は git push --set-upstreamします。 リモートブランチが存在する場合は git pushで大丈夫です。