LoginSignup
2
3

【初心者殺し】GitHub Flowの基本(OSS開発)をなんとか言語化してみた。

Last updated at Posted at 2023-07-22

前書き

HappinessChainの課題でGit週間でしたので、GitHub Flowを知識0状態から学んでアウトプットするために書きました。多分、ほとんどの初心者の方がこの流れがつかめないで混乱すると思います。(多分実際に開発しながら使わないと難しい)

ですが、基本的な流れだけでもつかめれば少しは楽になるので参考になればなと思います。
また 「リモートリポジトリも含めた全体の流れ」 にフォーカスしてますので、GitHub上でのリポジトリの作成の仕方ローカルでの作業内容などなどに関しては詳細を省かせていただきます。

GitHubを用いた開発フローまとめ

OSS開発.png

前準備として、新規ディレクトリ作成で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する」 という意味で削除される (編集済み)

最後に

とりあえず今の自分の理解はこのくらいの流れしかつかめていないので、また開発途中で気づいたことなどがあれば記載したいと思います。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3