こんにちは,米国データサイエンティストのかめ(@usdatascientist)です.
Github入門連載第4回目です.今回はpull reqestの作成とmergeを記事にします!(Git動画講座はこちら)
*前回の記事はこちら
目次
いままでの振り返り
ちょっと前回までで長くなったので今まで何をしたのか振り返りましょう.
第一回:Githubに登録し,my-first-repoというリモートリポを作成しました.
第二回:Gitを使ってローカルリポを作成しました.
第三回:update-readmeというbranchを作成し,README.mdを更新し,add, commitをしました.
今回は,第三回での変更内容をmasterブランチに反映するということをやります.せっかく変更したのにmasterにそれが更新されなかったら意味ないからね!
ローカルリポからリモートリポに変更内容をpushする
第二回で説明したとおりローカルで変更した内容をリモートリポに反映させることをpushすると言います.
という声が聞こえてきそうですが,masterブランチというのは他のメンバーが修正する可能性のあるブランチです
もちろん,今は練習なのでだれも修正しませんがw
誰かが修正するブランチを自分のローカルで更新するのはNGです.
だって,自分が作業しているブランチに誰かがローカルで更新してたら「え?そんなの知らないけど」ってなりますよね?他人のローカルリポなんて見れませんから.
masterブランチというのはチーム全員でちょくちょく更新するいわば共有ブランチです.
共有のブランチをローカルリポで更新するわけにはいきません.共有のブランチはリモートリポで更新します.
それでは,my-first-repoリポジトリでupdate-readmeブランチにcheckoutして,update-readmeに移動しましょう.
1 |
$ git checkout update-readme |
ここでpushする前に気を必ずしてほしいことがあります.
それは...
pushする前に必ずpullするということです!!(超超重要)
これ,超重要です.
第二回でも説明しましたが,リモートリポの変更をローカルリポに反映させることをpullすると言います.
リモートリポで変更がされたかどうかなんて,わからないですよね?
なので,pushの前に毎回かならずpullする癖をつけましょう.今回の例では例えばすでにREADME.mdが誰かに更新されていて,ローカルリポのREADME.mdが古い可能性がありますよね?
誰かが更新していたら,それを一度ローカルリポに反映し,pushするのです.
場合によっては誰かが同じ箇所を修正している可能性もあります.その場合はローカルリポでどちらかの修正を削除します.このようなケースをmerge conflictと言います.
mergeというのは,あるbranchを別のbranchにmergeすることを意味しますが,pullというのは実は
1.データをとってくる 2.mergeする
という二つのことを裏では行なっています.(この「1.データをとってくる」ことをfetchといいます)
pullというのは,リモートリポからfetchして,自分のリポにmergeをすることです.
(merge conflictについてはまた別の機会にきちんと説明しますね.)
それでは以下のコマンドでpullします.
1 2 3 4 |
$ git pull origin master From https://github.com/usdatascientist/my-first-repo * branch master -> FETCH_HEAD Already up to date. |
$ git pull {repository} {branch} です. {repository} は,当然 https://github.com/{username}/my-first-repo ですが,gitにすでに省略コードなるものがあり, $git remote -v で確認することができます.が,基本 origin なので覚えなくていいです.
1 2 3 |
$ git remote -v origin https://github.com/usdatascientist/my-first-repo (fetch) origin https://github.com/usdatascientist/my-first-repo (push) |
なので $ git pull origin master はoriginのmasterブランチからpullをするということです.
(大抵常に最新状態にあるbranchはmasterなので今回masterからpullしてますが,これはチームによって異なります.開発用のbranchを別で設けていたりもしますし)
さて,pullしたあとの出力は,’Already up to date’ということでとくにmergeするものはありません.当然ですね,練習なので今は誰もmy-first-repoを更新する人なんていませんからw
それではpushします.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
git push origin update-readme Username for 'https://github.com': usdatascientist Password for 'https://usdatascientist@github.com': Enumerating objects: 5, done. Counting objects: 100% (5/5), done. Writing objects: 100% (3/3), 280 bytes | 280.00 KiB/s, done. Total 3 (delta 0), reused 0 (delta 0) remote: remote: Create a pull request for 'update-readme' on GitHub by visiting: remote: https://github.com/usdatascientist/my-first-repo/pull/new/update-readme remote: To https://github.com/usdatascientist/my-first-repo * [new branch] update-readme -> update-readme |
$ git push {Repository} {ブランチ名} です. {Repository}名 はpullの時と同じくoriginでOKです.
ここで,直接masterにpushするのではなく,ローカルリポのブランチと同じ名前のupdate-readmeを指定するようにしましょう.
usernameとpasswordを聞かれるので正しく入力すると,pushされます.
githubのリポページをみてみよう!
自分のgithubのリポページにアクセスしてみましょう.https://github.com/{USERNAME}/my-first-repoでアクセスできます.
するとこんな感じになっていると思います.
むむ,なにやら黄色いものが見えますね.
これは,
「update-readme」というbranchに更新があるからmasterと比較(Compare)してよかったらpull request出してね
というgithubからのメッセージです.
‘Compare & pull request’をクリックすると,
‘Open a pull request’というページになりました.
pull requestというのは「この変更をpullしてね」という要求(Request)を出すものです.
ここではbase:masterになっているので「よいよいmasterブランチさん,私のbranchをpull(つまりfetchしてmerge)してくれ」と依頼を出すのです.
pull requestを出そう!
pull request (日本だとプルリク, アメリカだとprとかPRって略します.)を実際に作ってみましょう!
といっても簡単です. ‘Leave a comment’のところにコメントを書いて,変更箇所に問題がなければ’Create pull request’をクリックすればOKです.
チームによってはReviewerをつけたり,色々ルールが追加されますが今回は省きます!
すると以下のページに遷移します.
実際の現場では自分で出したプルリクを自分でMergeするケースはない(Reviewerをつけてるケースなんかはある)ですが,今回は練習ということで,チームのメンバーがプルリクを出したという想定で...
実際にはプルリクを出した後,メンバーに「プルリクだしたからレビューしてね」とか「プルリクだしたからマージしてね」とか言ったり,プルリクと同時にメールが飛んだりslackのbotがpostしたりします.
(ちなみにこのページへはpull requestのタブからこれます.)
Merge(もしくはReview)する立場の人はまず’File changes’タブで「このpull requestが何の変更なのか」を確認しましょう.
問題がなければ’Merge pull request’ボタンを押して’Confirm merge’を押してmergeします.コメントをつけてあげると親切かもしれません.
リポのページにもどって,README.mdが更新されていることを確認しましょう.これで変更がmergeされました.
ローカルリポをpullしよう!
リモートリポが更新された状態ですからね,ローカルリポのmasterブランチを更新しましょう!
まずmasterブランチにcheckoutして
1 2 3 |
$ git checkout master Switched to branch 'master' Your branch is up to date with 'origin/master'. |
masterからpullしましょう.
1 2 3 4 5 6 7 8 9 10 11 12 |
$ git pull origin master remote: Enumerating objects: 1, done. remote: Counting objects: 100% (1/1), done. remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (1/1), done. From https://github.com/usdatascientist/my-first-repo * branch master -> FETCH_HEAD 165c9e3..95e8099 master -> origin/master Updating 165c9e3..95e8099 Fast-forward README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) |
はい. $subl README.md でREADME.mdを開いてみてください.更新されてるでしょ?^^
まとめ
いやーーーーーーーーーー
長い!!
長かったですねぇ
お疲れ様でした.
取り合えずこれで,基本的なGitの使い方終了です!
これをできればプログラミング学習中に自分でリポ作ってGit運用してという「一人Git」ができるようになります.
基本的な流れは
リポ作って⇨クローンして⇨branch作って⇨ファイル修正して⇨addでstagingして⇨commitして⇨(一応)pullして⇨pushして⇨pull request出して⇨mergeして⇨ローカルリポでpull
というのが大まかな流れです.が,一人Gitするときはbranch作ったりpull request出したりはしなくていいかもですね.必要に応じて使い分けましょう.
他にもversionを戻したりブランチ消したりmerge conflictしたり色々やることはあるけど,その時々で覚えればいいです.
わからなくなったらいつでも本ブログに戻って読み直してみてください.何回もやっているうちに長いように思えるこのサイクルも一瞬でできるようになります.マジで.
本ブログでは他にもプログラミング初心者のためになる情報を色々と記載しておりますので,是非みていってください!
Twitter(@usdatascientist)のフォローもお願いします!ご要望なども受け付けております.
それでは!
もっとGitHubの練習をしたい!という人はDataScienceHubへ!
DataScienceHubではGitHubを使ったコンテンツを実施しています.GitとGitHubを使って様々な課題を提出したり,コーディングレビューを受けることができます.
失敗してもOKな環境で,実際のフローに近いやり方でGitHubを使うことができます.わからないことがあったら自由に質問していただける,Git練習には最高な環境だと思うので是非活用してください.