前書き
HappinessChainの課題でGit週間でしたので、GitHub Flowを知識0状態から学んでアウトプットするために書きました。多分、ほとんどの初心者の方がこの流れがつかめないで混乱すると思います。(多分実際に開発しながら使わないと難しい)
ですが、基本的な流れだけでもつかめれば少しは楽になるので参考になればなと思います。
また 「リモートリポジトリも含めた全体の流れ」 にフォーカスしてますので、GitHub上でのリポジトリの作成の仕方やローカルでの作業内容などなどに関しては詳細を省かせていただきます。
GitHubを用いた開発フローまとめ
前準備として、新規ディレクトリ作成でgit initして移動しておく。
mkdir my_project
cd my_project # これを実施しないと別の場所にcloneしてしまう
git init
①リモートリポジトリをGitHubnに追加
これはGitHubのサイトで実施する。作成したときにつくられるURLを必ず確認する
②リモートリポジトリをローカルにclone
git clone リポジトリURL # ここでGitHub URLを使う
③フォーク元リポジトリをローカルリポジトリに設定
git remote add upstream フォーク元リポジトリURL
これによりフォーク元リポジトリをローカルリポジトリの2つ目のリモートリポジトリ(upstream) として設定する
※1つ目はorigin
※OSSフォーク元のリモートリポはupstreamとすることが一般的
※ローカルリポジトリのbranchに対応しているリモートリポジトリのbranchを上流branchという。
また、git branch -vv
でローカルbranchに対応している上流branchを確認できる
④ローカルリポジトリでtopic branchを作成して開発を進めてcommitしていく
全体の流れの記事ですので詳細は省きますが、基本的に開発はmainではなく開発用のブランチを切って進めていく
⑤push前に確認すること
-
Aパターン
もしここでフォーク元のリモートリポジトリのメインブランチがcommitされて伸びているならば、先にローカル名ンに統合する必要がある。そのためにgit checkout main
でHEADを移動して、ローカルリポジトリのメインブランチにgit pull upstream main
を行う。
その後、git checkout topic
ブランチでHEADを開発ブランチに移動させてから
git rebase main
でローカルリポのトピックブランチをメインブランチにrebaseする
git checkout main # メインブランチに移動
git pull upstream main # フォーク元の最新変更を取得
git checkout topic-branch # トピックブランチに戻る
git rebase main # トピックブランチをメインブランチにリベースする
-
Bパターン
フォーク元のリモートリポジトリのメインブランチがcommitされておらず綺麗な状態であれば、このまま⑥に進む
⑥リモートリポジトリに現段階のローカルリポジトリの開発を反映させるためにpushする
git push -u origin ローカルブランチ名(:リモートブランチ名)
※push -u オプションは上流ブランチの設定なので最初のみ
※リモートブランチ名がローカルブランチ名と同じ名前でいい場合は( )内は省略可能
ただし、Aパターンで説明したように、フォーク元のリモートリポジトリのメインブランチが伸びていた場合はローカルでリベースしているため、git push -f origin
トピックブランチ名とする必要がある。
rebaseによりエラーが発生するので、強制的にプッシュするために-f(--force)オプションを使用。
また、rebase中にコンフリクトが発生した場合は、ファイルを修正してgit addしてからgit rebase --continue
を実行して続行。
⑦リモートリポジトリ内で反映した内容をmergeしてもらうためにpull requestを出す
こちらもGitHubサイト上で実施。しっかりとわかりやすくコメントを記載すること。
⑧pull requestが通ったらリモートリポジトリでmergeされる
⑨そのmergeされた状態をローカルリポジトリにpull(fetch&merge)する
※fetchはローカルリポジトリのHEADの位置は変わらないまま、リモートリポジトリのコミット履歴をとってくるので、fetchした後はローカルリポジトリのmain branchをfetchしたリモートリポジトリの最新のcommitに移動する必要がある。(※FETCH_HEADはfetchしてきたブランチと同じコミットをさしている)
git checkout main # mainに切り替えて
git merge #Fast forwardになる
上記を一発で行うのがpullコマンドで、メインが特に変更されていないなら、以下のようにpull rebaseする
git pull origin main --rebase
⑩開発に使用したtopic mergeを削除する
git push --delete origin feature(リモートリポジトリのbranch名)
git push origin :feature(リモートリポジトリのbranch名)
2行目のコマンドはpushするbranchを記載してない (originの後、:の前の部分)ので、「何もないものをリモートリポジトリのbranchにpushする」 という意味で削除される (編集済み)
最後に
とりあえず今の自分の理解はこのくらいの流れしかつかめていないので、また開発途中で気づいたことなどがあれば記載したいと思います。