pull reqを上げたら、reviewから「コードは良さそう!最新のmain branchだけ反映しといて」って言われて「???」となった人向けの解説記事です。
チームで日々開発してきてGitに慣れている先輩目線だと当たり前になってしまい、説明すらしないことが多いですが、開発初心者やこれまでチームでの開発をしてこなかった開発者は混乱することも多いと思うので、書いておきます
branchが「遅れてる」ってどういうこと?
チーム開発では複数の開発者が同時に開発します。しかし、同時に開発を行うと同じファイルを別々の開発者が変更したかった時など不都合が生じます。
そこでGitを使って、branchを分けて開発することで互いを意識することなく開発できるわけです。
この時に、main branchにすでに反映されている変更(コミット)が自分のbranchに反映されていない時に「遅れている」というわけです。
実際の開発の各段階でGitがどういう状態にあるのか?を整理していきましょう。
自分のlocal PCをmy local
、他の開発者のlocal PCをtheir local
と言いましょう。
最初は、remote
(GitHubなど)からgit clone
してくることで、my local
・their local
共に、main branchが作られます。
それぞれのlocal PCでbranchを切り、そのブランチで開発を行いコミットしていきます。
(自分はmy-feat
というbranch、他の開発者はtheir-feat
というbranchを作ったとします)
それぞれ開発が完了したのでgit push
して、それぞれの変更をremote
にuploadしました。
このタイミングではまだremote
のmain
branchには何も変更がないです。
ここで、それぞれの変更をmain
branchに取り込むために、their-feat
branchとmy-feat
branchからpull reqが作られます。
さて、自分のpull req(my-feat
→main
)がmergeされる前に他の開発者のpull req(their-feat
→main
)がmergeされたとします。
ここで、main
branchに新しく作られたcommitはmy-feat
には存在していません。これが「branchが遅れている」という状態です。
この状態だと、自分のpull req(my-feat
→main
)はmergeできたりできなかったりします。他の開発者が同じ箇所を変更している場合などはconflictが発生して、mergeできません。
また、チームの方針として必ずmain branchを反映してからmergeするというルールになっていることも多いと思います。
そこで「最新のmain branchを反映しといて」って言われるわけです。
最新のmain branchを反映する方法
まず、自分のlocal PCにmain branchの最新の状態を持ってくる必要があります。
git fetch
コマンドでdonwloadしてきましょう。
$ git fetch
すると、origin/main
というbranchにremoteのmain
の最新の状態が反映されます。
参考: 【初心者向け】git fetch、git merge、git pullの違いについて
次に、このorigin/main
branchをlocalのmy-feat
branchにmergeしていきます。
$ git merge origin/main
(もしmy-feat
branchにいない場合は、最初にgit checkout my-feat
しましょう)
my-feat
branchの先頭にorigin/mainをmergeしたcommitが作られます。
ここで、my-feat
をremoteにpushしてあがれば、remoteのmy-feat
branchに最新のmain
branchが反映されました。
$ git push origin my-feat
こうなれば、main
branchへのpull reqをmergeできるようになります。