フォーク開発したい
$ 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を設定します。
任意の文字列で構いませんが、
DISABLED、
NO_PUSH、
READONLY
などがよく使われるようです。
ブランチを作成したい
$ 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で大丈夫です。