【gitをソフト開発で使いこなそう!:第13回】プルリクエストを送ってみよう!
今回は、GitHubの大きな特色である「プルリクエスト」という機能について解説します。
これが出来るようになると、他の人がGitHub上で公開しているソースコードを編集することが出来るようになります。
プルリクエストとは?
プルリクエスト(プルリク・PRとも略される。)とは、GitHubに備わっているリポジトリの内容の変更をリクエスト出来る機能のことです。
プルリクエストの機能は、GitHubが独自に備えている機能です。gitに備わっている機能ではありません。
一つ例を挙げてみましょう。
誰かが、GitHub上にとあるソフトのソースコードを公開しているとします。
あなたが、このソフトのバグ(不具合)を見つけたため、公開されているソフトのソースコードを修正したいとします。
しかし、第10回で説明している理由で、プッシュ出来る人を普通、制限しているため、あなたが直接ソースコードを修正することは出来ません。
そこで直接ソースコードを修正出来る人に「こういう変更をしてくれ!」というリクエストを送ります。これが、プルリクエストです。
プルリクエストの送り方
フォークとクローン
今回は、下のリポジトリを例にしてプルリクエストを送ってみます。
上のリポジトリは書籍「わかばちゃんと学ぶGit使い方入門」のプルリクエスト練習用リポジトリとして公開されているものです。
ですが2020年4月現在、数百件以上のプルリクエストがマージされないまま、放置されている状況です。恐らくプルリクエストが受け入れられることは……ないでしょう。
そこで、プルリクエスト練習用のリポジトリを作成しました。下のリンクから移動することが出来ます。
気軽にプルリクエストの練習に使ってください。
プルリクエストを送りたいリポジトリに移動したら、画面右上の「Fork」というボタンを押してください。
このボタンを押すと、今表示しているリポジトリが自分のアカウントにコピーされます。(これをボタンの名前の通り、フォークと言います。)
フォークしたリポジトリの名前を見ると、elmas3/pull-request-practice
からterapotan/pull-request-practice
に変わっているのが分かります。(terapotan
は私のアカウント名です。)
さらにフォークしたリポジトリに変更を加えるために、リポジトリをローカル(自分のPCとか)にコピーします。
これをクローンと言います。
フォークしたリポジトリのClone or download
をクリックして、git@
から始まるアドレスをクリップボードにコピーしてください。
中身が空のフォルダを作成し、そこでGitBashを立ち上げて、次のコマンドを入力してください。
git clone <コピーしてきたgit@から始まるアドレス>
普通Windows上では、コピーと貼り付けのショートカットキーは「Ctrl+C」と「Ctrl+V」です。
ですが、GitBashでは「Ctrl+Ins(インサートキー)」と「Shift+Ins」がコピーと貼り付けのショートカットキーとなっています。
クローンが終わったら、下のコマンドを入力して作成されたフォルダに移動してください。(カレントディレクトリを新たに作成されたフォルダにする。)
cd ./<新たに作成されたフォルダの名前>
変更を加える
新たに作成したフォルダに移動したら、新しいブランチを作成します。
ブランチ名は何でもいいですが、今回はpullreqdev
としました。
git branch pullreqdev git checkout pullreqdev
「git checkout -b」と入力することで、ブランチの作成と作成したブランチへの、チェックアウトを同時に行うことが出来ます。
上の例であれば、「git checkout -b pullreqdev」と入力します。
新しく変更を加えます。これも、何でもよいのですが、今回は新しく下の内容のファイルを追加しました。
プルリク.txt
PullRequestTest
次のコマンドを実行してコミットします。
git add --all git commit -m "プルリクコミット"
git push
コマンドを実行して、変更をフォークしたリポジトリに反映します。
git push origin pullreqdev
第10回では、リモートリポジトリにプッシュする前に「git remote add~」を使って「origin」を追加していましたが、今回はしていません。
……ですが、上の「git push」コマンドは正常に実行されます。なぜ上手くいくのでしょうか。
それは、「git clone」コマンドを使ってローカルリポジトリを作成した場合、自動的にクローン先のリモートリポジトリ(今回の場合、フォークしたリポジトリ)のアドレスをoriginとして登録するようになっているからです。
プルリクエストを送る
新たにブランチを作成したら、プルリクエストを送りたいリポジトリのページを開いてください。
下の画像のような、メッセージが画面の上の方に表示されているはずです。
画像右端にある、Compare & pull request
をクリックしてください。
下のような画面が表示されます。
画像上の方にある、base repository
・head repository
……というのは、「head repository
からbase repository
へ、内容変更のリクエストを出す」という意味になります。
画像のような表示だと「terapotan/pull-request-practice
リポジトリのpullreqdev
ブランチから、elmas3/pull-request-practice
リポジトリのmaster
ブランチへ、内容変更のリクエストを出す」という意味になります。
何となく気づいた方もいらっしゃるかもしれませんが、プルリクエストというのは、「俺の作ったブランチをお前のリポジトリのブランチに、マージさせてくれ!」というリクエストです。
ですから、どこのブランチをどこのブランチへマージさせるのか、予め指定しておく必要があります。
画像中央に「プルリクエストのテストです。」と書かれている部分があります。
ここに、プルリクエストと一緒に送るメッセージを書き込みます。
プルリクエストと一緒に送るメッセージは、Markdownという書式で書くことが出来ます。
Markdownと呼ばれる書式で書くと、見出しや太字・箇条書きと言ったものを簡単に書くことが出来ます。この記事も、Markdownで書いています。
Markdownには、HTMLのように決まった規格があるわけではないため、エディタによって書く方法に若干の差があります。
ここではMarkdownについて詳しく解説しません。詳しいことが知りたい方は、参考文献をご覧下さい。
メッセージが書けたら、画像下にあるCreate Pull request
を押してください。
プルリクエストが作成されます。
後は、マージされるのを待つだけです。
マージされると、画像左上にあるOpen
という文字がMerged
に変わります。
(上の画像は、別のリポジトリでマージされた時のものです。)
次回予告
次回は、よくGitHubのリポジトリに登場するREADME.md
・LICENSE
・.gitignore
の3つのファイルについて解説していきます。
う-ん、よく分からん!
この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。
参考文献
Pro Git
git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com
GitHub公式マニュアル
GitHub公式の、プルリクエストについて解説した文章です。
Markdown関連
Markdownそのものについて詳しく知りたい方はこちら。
Markdownの書き方について知りたい方はこちら。
【gitをソフト開発で使いこなそう!:第12回】git fetchで引数を省略すると何が起こる?
今回は、リモートリポジトリから変更を取り込むコマンドである「git fetch」の使い方を解説していきます。
前回と同じく、リポジトリ名やブランチ名を全て省略したときの動作も扱います。
前提知識
今回の記事の説明をしっかりと理解するには、上流ブランチとリモート追跡ブランチという用語について理解している必要があります。
下の記事では、用語の解説を行っています。
用語の意味が分からない方は、ご覧になることをお勧めします。
git fetch
どんなコマンド?
リモートリポジトリから、変更を取り込むコマンドです。
下のような例を考えてみましょう。
リモートブランチmasterには、ローカルブランチmasterにはまだないコミットが追加されています。
上の図で言うとコミットB,Cの部分です。
この時git fetch
コマンドを使うと、コミットB,Cの部分をダウンロードすることが出来ます。
ここで注意しなければならないのは、git fetch
コマンドは、本当にただダウンロードするだけという点です。
上の図を見ると分かる通り、リモート追跡ブランチであるorigin/master
はコミットCへ動いていますが、ローカルブランチであるmaster
は動いていません。
前回のコラムで解説した通り、リモート追跡ブランチにチェックアウト(HEADを移動させる)ことは出来ませんから、このままではダウンロードしてきた分を編集することは出来ません。
編集出来るようにするには、git merge
コマンドを使って、origin/master
とmaster
をマージする必要があります。
コマンドの使い方
先ほど挙げた例で、git fetch
コマンドをどのように使うか見ていきましょう。
今、リモートリポジトリorigin
のリモートブランチmaster
をローカルリポジトリに取り込みたい(ダウンロードしたい)とします。
次のようにコマンドを入力すると、変更を取り込むことが出来ます。
git fetch origin master
値の意味は次の通りです。
git fetch <取り込みたいリモートリポジトリ名> <取り込みたいリモートブランチ名>
リモートリポジトリtest
のリモートブランチdevelop
のみを、ローカルリポジトリに取り込みたいときは、
git fetch test develop
というコマンドを実行します。
全て省略すると?
上の図のような状況(カレントブランチはmaster。masterブランチの上流ブランチは、myrepo/master。)で、
git fetch
のようにリモートリポジトリ名とリモートブランチ名を省略してコマンドを実行したとき、何が起こるのでしょうか。
前回と同じように、上の例を使って、リモートリポジトリ名とリモートブランチ名がどのように指定されるのか見ていくことにします。
リモートリポジトリ名
今回の例では、master
ブランチがカレントブランチになっています。
また、master
ブランチの上流ブランチは、リモート追跡ブランチmyrepo/master
に設定されています。
このように、上流ブランチが設定されている場合は、リモート追跡ブランチが追跡しているリモートリポジトリ名が、指定されます。
今回の例では、myrepo
がリモートリポジトリ名として指定されることになります。
上流ブランチが設定されていない場合は、origin
が指定されます。
(origin
が存在しない場合は、何も起こりません。)
リモートブランチ名
リモートブランチ名を省略した場合、リモートリポジトリ名のリモートリポジトリにある全てのリモートブランチの変更が取り込まれます。
今回、リモートリポジトリ名はmyrepo
が指定されています。ですから、リモートリポジトリmyrepo
にある、リモートブランチであるmaster
とdevelop
が取り込まれることになります。
リモートブランチ名だけ省略すると?
リモートブランチ名だけ省略した場合というのは、
git fetch myrepo
などのようにコマンドを入力することです。
この場合、リモートリポジトリmyrepo
にあるリモートブランチ全てが、取り込まれます。
マージしないと編集することは出来ない
本記事の最初でも解説した通り、git fetch
コマンドは本当にただダウンロードするだけです。
リモートリポジトリからダウンロードしてきた内容を基に編集するには、ローカルブランチとマージする必要があります。
実際にどうやるのか
下の図のように、既にリモートリポジトリmaster
の内容をダウンロードしてきた場合を考えます。
ダウンロードしてきた内容を指しているのは、リモート追跡ブランチorigin/master
です。
(リモート追跡ブランチは、git fetch
コマンドを実行したと同時に移動します。)
ですから、origin/master
とローカルブランチmaster
をマージすればいいことになります。
そうすれば、ローカルブランチmaster
上で取り込んできた変更を元に編集することが出来ます。
ローカルブランチmaster
にチェックアウト(git checkout master
)して、下のコマンドを実行します。
git merge origin/master
origin/master
の履歴が、ローカルブランチmaster
にまとめられました。
次回予告
git,GitHubでは、ある特別な名前をファイルにつけると特別な働きをするものがあります。
次回は、そんなファイルをいくつか紹介します。
う-ん、よく分からん!
この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。
参考文献
Pro Git
git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com
git用語解説マニュアル
git公式の用語解説マニュアルです。
上流ブランチ(upstream branch)や、コミット(commit)等の用語の意味について英語で書かれています。
git-scm.com
git fetch
git fetch
コマンドに関するgit公式マニュアルです。
【gitをソフト開発で使いこなそう!:第11回】git pushで引数を省略すると何が起こる?
今回は、「git push」コマンドについて解説していきます。このコマンドの動作自体はシンプルなのですが、ブランチ名などを省略したときの動作が複雑です。
その動作を詳しく解説していきます。
変更履歴
2020年4月18日 コラム:push.defaultを追加。
参考文献に、git-configのマニュアルを追加。
注意!:git push -fの使用は慎重に、慎重にを追加。
2020年4月22日 git push --delete
の動作説明を「リモートリポジトリを削除する」から「リモートブランチを削除する」に修正。
- 変更履歴
- リモートリポジトリとローカルリポジトリ
- ローカル/リモートブランチ・上流ブランチ・リモート追跡ブランチ
- git push
- 「git push」と入力したときの動作
- 上流ブランチを設定する
- 次回予告
- う-ん、よく分からん!
- 参考文献
リモートリポジトリとローカルリポジトリ
リモートリポジトリというと、ローカルリポジトリとは何か別の構造をしたもののように感じます。
ですが、実際にはリモートリポジトリの構造もローカルリポジトリと同じです。
上の四角がリモートリポジトリを表し、下の四角がローカルリポジトリを表しています。
ローカル/リモートブランチ・上流ブランチ・リモート追跡ブランチ
リモート追跡ブランチ
先ほどの図には、いくつかブランチがあります。
これらのブランチには、種類ごとに名前が付いています。
まずローカルリポジトリにあるブランチはローカルブランチ、リモートリポジトリにあるブランチはリモートブランチと呼ばれます。
ローカルリポジトリには、origin/master
という名前のブランチがあります。
このブランチは、リモートリポジトリorigin
のリモートブランチmaster
を追跡しています。
(origin
というのは、リモートリポジトリに付けられた名前です。単なる名前であるため、別にtest
でもmyrepo
でも構いません。今回の例では、origin
と名付けています。)
このようなブランチをリモート追跡ブランチと言います。
「追跡している」とは、どういうことでしょうか。
例えば下のような場面を考えてみましょう。リモートリポジトリが1つ、ローカルリポジトリが2つあるような場面です。
ここで、ローカルリポジトリBに変更を加えます。(コミットを行う。)
続いて、ローカルリポジトリBからリモートリポジトリorigin
に変更を反映(プッシュ)します。
すると、リモートリポジトリにあるmaster
ブランチが移動します。
ローカルリポジトリBにあるorigin/master
は、リモートリポジトリにあるmaster
ブランチを追跡しているため、master
ブランチの動きを追いかけるように、origin/master
も動きます。
またローカルリポジトリAも、「リモートリポジトリで起こった変更を取り込むコマンド」(次回解説します。)を使うと、ローカルリポジトリAにあるorigin/master
が、リモートリポジトリにあるmaster
の位置まで動きます。
今回の記事では、あまりリモート追跡ブランチを使っている意味がよくわからないかもしれません。
ですが、次回やる「リモートリポジトリの変更を、ローカルリポジトリに取り込む」ときに重要な役割を果たします。
git checkout origin/masterのようにして、リモート追跡ブランチに移動することは出来ません。
そのため、リモート追跡ブランチを普通のブランチのように使うことは出来ません。
ここからも、リモート追跡ブランチは特殊なブランチであることがわかります。
上流ブランチ
……また謎な用語が出てきました。
一番最初に挙げた例を使いましょう。
gitでは、あるリモート追跡ブランチをあるローカルブランチの上流ブランチと呼ばれるものに設定することが出来ます。
わかった。で、上流ブランチって何?――と思われるかもしれませんが、あまり上流ブランチの意味は考えず「gitには、上流ブランチというよくわからんものをローカルブランチに設定出来る機能がある」と割り切った方がいいです。
一応、参考文献に載せてあるgitのマニュアルには、上流ブランチについて解説されていますが、あまりピンと来ないと思います。
何でこんなの解説するの?
リモート追跡ブランチ、上流ブランチといういまいちピンとこない単語が二つも出てきました。
よくわからないものは、出来るだけ避けて通りたいものですが、この二つは次の解説するgit push
コマンドや次回出てくるコマンドの動作を説明する時に出てくるのです。
これを理解しておかないと、何を言っているのかさっぱり分からなくなってしまいます。
git push
ローカルブランチのmaster
の変更を、リモートブランチorigin
のmaster
に反映する時、gitでは次のコマンドを入力することで、変更を反映出来ます。(リモート追跡ブランチの図で出てきた【1:Push】の操作にあたる。)
git push origin master:master
上のコマンドの意味は、下の通りです。
git push <リモートブランチにつけた別名> <ローカルブランチの名前>:<リモートブランチの名前>
ですから、もしリモートリポジトリendにあるリモートブランチdevelopに、ローカルブランチmouseの変更を反映させたいとすると、
git push end mouse:develop
と入力すればいいことになります。
リモート追跡ブランチの移動
git push
コマンドを実行すると、リモートブランチが移動することになります。
リモート追跡ブランチは、リモートブランチと同期しているため、リモート追跡ブランチも移動することになります。
ブランチ名を省略する
最初に取り挙げた例では、次のようなコマンドを入力しました。
git push origin master:master
ローカルブランチの名前とリモートブランチの名前が同じです。
このような時、gitではmaster:master
をmaster
に省略することが出来ます。
git push origin master
複数のブランチを同時にプッシュする
先ほどの例では、master
ブランチ一つだけをプッシュしましたが、下のように空白区切りでブランチ名を書くことで、複数のブランチを一気にプッシュすることが出来ます。
git push origin master develop sample
リモートブランチを削除する
--delete
オプションを付けることで、リモートブランチを削除することが出来ます。
git push --delete origin master
プッシュしようとしている内容によっては、リモートリポジトリの履歴と競合(コンフリクト)してしまい、プッシュが上手くいかないことがあります。
このような時「-f」というオプション(git push -fのように入力する。)を付けるとプッシュすることが出来ます……が、絶対にやってはいけません。
競合した状態で、強制的にプッシュしてしまうとリモートリポジトリの履歴が上書きされてしまいます。
強制的にプッシュした本人は、何の問題もなく使えるのですが、このリモートリポジトリを使っている別の人が困ってしまいます。
リモートリポジトリの履歴が上書きされてしまうと、今度はその履歴と別の人のローカルリポジトリの履歴が競合(コンフリクト)してしまうからです。
変更を取り込もうにも、プッシュしようにもエラーが多発して、使用不能になってしまいます。
インターネット上で、いくつか「-fを使ってエラーを解決出来る」としている記事がありますが、それは上で言ったことを全て分かった上で、問題が起こらないと確信しているから解決できるとしているのです。
ここまでの説明を聞いて「なんかよくわからんなぁ」と思っている人は特に使うべきではありません。
ソフトが出す警告には、意味があります。無視しないようにしましょう。
でないと……とんでもないことが起こるかもしれません。
これで終わり?
git push
自体の動作の説明はこれで終わりです。
ですが、プッシュという操作はよく行われます。そのたびに長いコマンドを打つのは面倒です。
そこで、git push
コマンドには「リモートリポジトリの別名」や「ブランチ名」を省略出来る機能が付いています。
下のようにコマンドを入力しても、プッシュが行われるということです。
git push
……確かに便利なのですが、名前が全て省略された時の動作はかなり複雑です。
使い方によっては、プッシュしてほしくないブランチにプッシュしてしまうかもしれません。
以下で省略された時の動作を解説しますが、「読むのが面倒くさい!」と思うのであれば、とりあえず飛ばしておくのもいいでしょう。
「git push」と入力したときの動作
git push
と入力された時、省略されているのは
- リモートリポジトリ名
- ブランチの名前
の二つです。
この二つの値が、省略された場合どのように値が決まるのか見ていくことにしましょう。
リモートリポジトリ名――上流ブランチが設定されている場合
下の図のような例で、git push
を実行すると、どのような動きをするのか見ていきましょう。
myrepo/master
は、リモートブランチmaster
を追跡している、いわゆるリモート追跡ブランチです。
また、myrepo/master
はローカルブランチmaster
の上流ブランチ(と呼ばれるもの)に設定しておいてあります。
カレントブランチ(HEADが指し示しているブランチ)はmaster
にしておきます。
この状況で、
git push
と入力すると、まず初めにgitは、カレントブランチの上流ブランチを見に行きます。
今回カレントブランチの上流ブランチはmyrepo/master
に設定されています。
次に、その上流ブランチがどのリポジトリにあるリモートブランチを追跡しているのか見ます。このリポジトリ名が、リモートリポジトリ名を省略したときにセットされる名前です。
今回、上流ブランチはリモートリポジトリmyrepo
にあるブランチを追跡しています。
ですから、今回の例で指定される名前はmyrepo
ということになります。
上流ブランチが指定されていなかった場合は?
先ほどの例は、上流ブランチが設定されていた場合でした。
では、上流ブランチが設定されていなかった場合はどうなるのでしょう?
その場合、origin
という名前が指定されることになっています。
上流ブランチが設定されていなかった場合に指定される名前は、repoオプションを使って変更することが出来ます。
例えば、指定される名前をteraに変更したい場合次のようにします。
git push --repo=tera
リモートリポジトリ名――まとめ
リモートリポジトリ名が省略された場合、指定される名前は次のように決まります。
- カレントブランチに上流ブランチが設定されているか?
- (Yesの時):リモート追跡ブランチが、追跡しているリモートリポジトリ名が指定される
- (Noの時):repoオプションが指定されているか?
- (Yesの時):指定された名前が、設定される
- (Noの時):originが指定される
ブランチ名
続いてブランチ名ですが、プッシュするブランチを決める方法はいくつかあり、ユーザーが選ぶことが出来ます。
今回解説するのは、ユーザーが何も設定していない場合、デフォルトで設定される動作です。
gitでは、ユーザ名やメールアドレスなどの値やコマンドの挙動について設定出来る機能があります。
例えば、ユーザ名の場合user.nameという設定項目がありこれに対して、user.name=myusernameという値をセットすることで、ユーザ名がmyusernameに設定されます。
同じように、ブランチ名を省略した場合の挙動を決めるpush.defaultという名前の設定項目が存在します。
push.defaultには、simple・matching・nothing・current・upstreamという5つの値(文字列)を設定することが出来ます。(それぞれの設定値の挙動については、参考文献にあるpush.defaultをご覧ください。)
本文にあった「ユーザーが何も設定していない場合」というのは、push.defaultに何の値も設定していない場合、という意味になります。
push.defaultに値が設定されているか見るには、「git config -l」というコマンドを入力します。
もし設定されていれば、「push.default=simple」のように表示されるはずです。設定されていなければ、「push.default」という設定項目自体が表示されません。
「git push 省略」と検索してみると「git push」と打ってプッシュするのは危険だ!という記述がたまに見られます。
これは、Git2.0(2.0はバージョンを示します。)以前のGitでは、プッシュするブランチを決める方法をユーザーが決めていない場合、リモートブランチと同じ名前のローカルブランチをプッシュするという設定になっていたからです。
この設定だと、masterブランチだけプッシュしたくて「git push」と入力したのに、それ以外のブランチも、リモートリポジトリに同じ名前のブランチがあれば、プッシュされてしまう可能性があります。
Git2.0以降のGitでは、下で説明するような動作に変更されました。
今使っているGitが、Git2.0以降か確認したい場合は「git --version」とGitBashに入力してください。
「git version 2.xx.x.windows.x」のように表示されたら、Git2.0以降のGitです。
先ほどと同じ例を使って、ローカルブランチmaster
をカレントブランチにしているとき、git push
と入力すると何が起こるのか見ていきましょう。
まず、gitはカレントブランチ(今回の場合だとmaster
)の上流ブランチを見に行きます。
上流ブランチが設定されていない場合、プッシュは行われません。
加えて、この上流ブランチと同期しているリモートブランチの名前とカレントブランチの名前を比較します。
もし同じであれば、カレントブランチの内容を比較したリモートブランチにプッシュします。
異なる場合は、プッシュは行われません。
ローカルブランチmaster
をカレントブランチにしているとき、git push
と入力すると、下のコマンドが入力されるのと同じ動作を行います。
git push myrepo master
ブランチ名――まとめ
ブランチ名が省略された場合、プッシュの動作は次のように決まります。
なお、プッシュするリモートリポジトリ名は「リモートリポジトリ名――まとめ」で、取り挙げた手順で決定されます。
- カレントブランチに上流ブランチが設定されているか?
- (Noの時):プッシュは行われない。(エラーが出る。)
- (Yesの時):上流ブランチが追跡しているリモートブランチの名前と、カレントブランチの名前は同じか?
- (Yesの時):カレントブランチから、先ほど名前を比較したリモートブランチへプッシュする
- (Noの時):プッシュは行われない。(エラーが出る。)
上流ブランチを設定する
上で見たように、git push
と入力するだけで、プッシュが行われるようにするには、リモート追跡ブランチをあるローカルブランチの上流ブランチに設定しなければなりません。
origin/master
というリモート追跡ブランチを、master
というローカルブランチの上流ブランチに設定するには、次のコマンドを入力します。
git branch --set-upstream-to=origin/master
エラーが出る?
git push
とコマンドを入力したとき、次のようなエラーが出ることがあります。
fatal: The current branch master has no upstream branch. To push the current branch and set the remote as upstream, use git push --set-upstream origin master
ローカルブランチに上流ブランチが設定されていないことが原因です。
git push -uって何だ?
前回の最後で、下のようなコマンドを入力しました。
git push -u origin master
-u
というオプションがついています。
これは、「下のコマンド2つを同時に実行せよ」というオプションになります。
- git push origin master
- git branch --set-upstream-to=origin/master
master
ブランチをリモートリポジトリorigin
にプッシュして、origin/master
をmaster
の上流ブランチにしなさいという意味になります。
初めてローカルブランチをプッシュするとき、-u
オプションを付けておけば、いちいち上流ブランチを設定するコマンドを入力する必要がなくなります。
次回予告
次回は、リモートリポジトリから変更を取り込むコマンドであるgit fetch
とgit pull
について解説します。
う-ん、よく分からん!
この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。
参考文献
Pro Git
git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com
git用語解説マニュアル
git公式の用語解説マニュアルです。
上流ブランチ(upstream branch)や、コミット(commit)等の用語の意味について英語で書かれています。
git-scm.com
push.default
git-configで見ることが出来る設定値の意味について書かれた、git公式のマニュアルです。
ブラウザでCtrl+F
を押して、push.default
を検索すると、コラムで出てきたpush.default
の設定値の意味の説明に飛ぶことが出来ます。
【gitをソフト開発で使いこなそう!:第10回】GitHubにSSH接続してみよう!
前回は、GitHubの概要を解説しましたが、今回は実際にGitHubを使ってソースコードを公開する手順を解説します。
2020年6月23日、GitHubの操作方法(UI)が大きく刷新されました。
本連載第10回以降の操作方法の説明は、刷新される前に書かれたものです。大半の操作方法は同じと思われますが、実際の操作方法と異なる場合があります。
GitHubのアカウントを作成する
GitHubを使って、ソースコードを公開するには、まずGitHubのアカウントを作る必要があります。
上のリンクから、GitHub公式ページに移動し、「サインアップ」をクリックしてください。
後は、画面の指示に従えば登録出来るはずですが、上手くいかない場合は下のサイトを参考にしてみてください。
GitHubは無料で使うことも出来ますが、有料の料金プランを使うことでより機能が充実したGitHubを使うことも出来ます。
詳しくは、下のページをご覧ください。
GitHubでは、全世界に公開するリポジトリ(パブリックリポジトリ)と非公開にするリポジトリ(プライベートリポジトリ)の2種類のリポジトリを作成することが出来ます。
以前は、個人向けFreeプラン(名前の通り、無料でGitHubを使える料金プラン)でプライベートリポジトリを作成することが出来ませんでしたが、2019年1月からFreeプランでもプライベートリポジトリを作成出来るようになりました。
古い記事だと、「Freeプランでは、プライベートリポジトリを作成することが出来ない」と書かれている場合があるため、注意が必要です。
プッシュするための設定をする
前回の説明で「ローカルリポジトリから、リモートリポジトリへ変更を反映する」という作業がありました。
この操作のことをプッシュと言います。
GitHubを使う場合、上の説明のリモートリポジトリがGitHubに当たります。
すぐにGitHub上でリポジトリを作成して、プッシュしたい所ですが、いくつか設定の手順を踏まなければなりません。
プッシュ出来る人を制限する
プッシュとは、先ほども説明した通り、リモートリポジトリに変更を反映することです。
GitHub上でリモートリポジトリを作成すると、基本的にそのリモートリポジトリは全世界に公開されてしまいます。そのため、何も考えないと誰でもあなたが作成したリモートリポジトリに、プッシュすることが出来てしまいます。(もしかしたら、コンピュータウイルスを埋め込まれるかもしれない)
そこで、あなたしかあなたが作成したリモートリポジトリにプッシュ出来ないようにしておく必要があります。
GitHubでは、いくつかこれを出来るようにする仕組みが用意されていますが、今回はSSHを使います。
SSHとは?
SSH(Secure Shell)とは、ざっくり言うと誰かに勝手にプッシュされたり、通信している内容を盗み見られないようにするために決めたプロトコル(決まり事)のことです。
今回は、SSHの仕組みについて詳しく説明しません。
詳しい仕組みが知りたい方は、下の記事をお読みください。
2020年現在、デジタル署名やSSHの仕組みについて検索しても正しい情報はほとんど出てきません。これは、インターネットだけでなく入門者向けの書籍も同じような状況です。
下に、デジタル署名やSSHの正しい説明が書かれた記事を載せておきました。最終的にネット検索した記事を見る場合でも、まず下の二つの記事に目を通しておいたほうが良いと思います。
秘密鍵と公開鍵
GitHubでSSHの仕組みを使って、リモートリポジトリにプッシュするためには、秘密鍵と公開鍵という二つの鍵を作成する必要があります。
また、公開鍵はGitHub上に登録する必要があります。
以下、具体的な手順を見ていきましょう。
鍵を作る
まずGitBashを開きます。
GitBashの開き方を忘れてしまった方は、第2回の記事をご覧ください。
そこで次のコマンドを入力します。
ssh-keygen -t rsa -b 4096 -C "GitHubで登録する時に使ったメールアドレス"
すると、次のようなメッセージが出て入力を求められますが、全て何も入力せずにEnterキーを押してください。
Enter a file in which to save the key (/c/Users/you/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again:
最初の入力で求められたのは、鍵の名前です。指定しても問題ありませんが、名前を指定してしまうと鍵がある特定のフォルダに作成されません。
ある特定のフォルダに作成されないと、鍵を追加するための設定が余分に必要になります。
二つ目の入力で求められるのは、秘密鍵のパスフレーズです。
秘密鍵は名前の通り、秘密にしなければいけません。もし漏れてしまうと、自分以外の誰かが勝手にリモートリポジトリにプッシュすることが出来てしまいます。
そこで、もし秘密鍵が漏れたとしても誰かに悪用されないように、秘密鍵を使うのにパスワードのようなものをかけておきます。これをパスフレーズといいます。(今回の設定では、指定していません。)
公開鍵を登録する
公開鍵をGitHub上に登録します。
次のコマンドを入力して、公開鍵の内容をクリップボードにコピーします。
clip < ~/.ssh/id_rsa.pub
続いて、先ほど作成したGitHubアカウントにログイン(サインアップのボタンの隣にサインインボタンがある。そこからログインすることが出来る。)します。
ログイン出来たら、プロフィール画像のアイコンをクリックしSettings
をクリックします。
サイドバーから、SSH and GPG keys
をクリックします。
New SSH key
もしくは、Add SSH key
をクリックします。
先ほどクリップボードにコピーした公開鍵の内容をKey
に貼り付けます。
Add SSH key
をクリックします。これで、リモートリポジトリにプッシュ出来るようにするための設定は完了しました。
設定が上手くいったか確認する
下のコマンドを入力します。
ssh -T git@github.com
設定が上手くいっていれば、次のような表示が出るはずです。
Hi <あなたのユーザネーム>! You've successfully authenticated, but GitHub does not provide shell access.
リモートリポジトリを作成する
プッシュするリモートリポジトリを作成します。
作成したGitHubのアカウントにログインし、左サイドバーのNew
をクリックします。
すると次のような画面が表示されます。
Repository Name(リポジトリの名前)・Description(リポジトリの説明文。リポジトリ名の下に表示される。)を入力します。
その下にあるのは、作成したリポジトリを公開するか、非公開にするか選ぶボタンです。
Publicを選べば、リポジトリは公開され、Privateを選べば、リポジトリは非公開になります。
今回は、Privateにしています。
さらに下にあるのは、リポジトリを作成したときに最初から置いておくファイルを指定する欄です。今回は、何も設定しません。
全ての設定が完了したら、一番下のCreate repository
をクリックします。
プッシュする
ローカルリポジトリを作成する
ボタンをクリックすると、次のような画面が表示されます。
これで、GitHubにリモートリポジトリを作成することが出来ました。
ローカルリポジトリを作って、そこでの変更を今回作成したリモートリポジトリにプッシュしてみましょう。
適当なフォルダ(フォルダの中には、何も入れない)でGitBashを立ち上げます。
まず、新たなリポジトリを作成します。
git init
続いて、何かファイルを新たに作成してください。
ここでは、下の内容を書き込んだTest.txtというファイルを新たに作成します。
早くプッシュしたい
作成したファイルをステージングエリアに追加して、コミットします。
git add --all git commit -m "firstcommit"
リモートリポジトリにプッシュする
作成したローカルリポジトリをリモートリポジトリにプッシュするには、プッシュする先の場所(アドレス)を指定する必要があります。
(……そりゃあそうですよね。どこにプッシュしていいか分からないと、プッシュしようがないですから。)
GitHub上で作成したリポジトリのアドレスは、先ほど見せた画像の青枠で囲ったところに表示されています。
今回作成したリポジトリのアドレスは、下のようになっています。
git@github.com:terapotan/BlogTestRepository.git
このアドレスを、ローカルリポジトリ側に追加します。
もし「https」から始まるアドレスが表示されていたら、アドレスの左隣にある「SSH」というボタンをクリックすると、「git@」から始まるアドレスが表示されます。
今回追加するのは、「git@」から始まるアドレスの方です。
リモートリポジトリのアドレスを追加するにはgit remote
コマンドを使います。
下のコマンドで、git@github.com:terapotan/BlogTestRepository.git
というアドレスをローカルリポジトリに追加します。
git remote add origin git@github.com:terapotan/BlogTestRepository.git
git remote -v
と入力して、次のように表示されれば、追加されています。
origin git@github.com:terapotan/BlogTestRepository.git (fetch) origin git@github.com:terapotan/BlogTestRepository.git (push)
次のコマンドを入力すると、プッシュを行うことが出来ます。
git push -u origin master
先ほど表示したリモートリポジトリのページをリロードすると、確かにTest.txtが追加されているのが分かります。
git pushコマンドでは、プッシュする先のリモートリポジトリを指定する必要があります。
直接リポジトリのアドレスを指定しても、動作しますが、あの長いアドレスをいちいち打つのは面倒です。
そこで、「git remote add <名前> <リポジトリのアドレス>」とすることで、リポジトリのアドレスの別名を指定することが出来ます。
originと言う名前がよく使われているのは、gitがデフォルトで付けるリモート名(リポジトリのアドレスの別名)だからです。
そのため、originという名前に特別な意味があるわけではありません。
実際上の例でoriginをtestに変えても、動作します。
次回予告
次回は、git push
コマンドについて詳しく解説していきます。
う-ん、よく分からん!
この記事を読んで、疑問に思うことがあったときは、気軽にコメント欄や私のTwitterから質問してください。(すぐに答えを返せるとは限りませんが。)
参考文献
Pro Git
git,GitHubを使うにあたって必要なコマンドの使い方が詳しく解説されています。この連載を読んで分からないことや詳しく知りたいことがあったときはまずProgitを読んでみるといいでしょう。 git-scm.com
分散型と集中型バージョン管理
分散型バージョン管理と集中型バージョン管理のデメリットとメリットについて書かれています。
矢をよけろ!【サポート情報】
ここでは、矢をよけろ!のサポート情報を掲載しています。
矢をよけろ!の紹介記事はこちら。
更新履歴
- 2020/3/19:Ver1.0公開
お知らせ
お知らせがある場合は、ここにお知らせを掲載します。
矢をよけろ!
矢をよけろ!(サムネイル/スクリーンショット)
このゲームを遊んでみる
下のリンクから、ゲームをダウンロード出来ます。
キャッチフレーズ
画面のドロイド君を動かして、上から降ってくる矢から逃げ切れ!
どんなゲーム?
ドロイド君を動かして、上から降ってくる矢から、一定時間逃げます。
無事逃げ切ることが出来れば、ステージクリア!
ステージは、EASY,NORMAL,HARDの3種類。
NORMAL,HARDでは、アイテムが降ってくるかも……?
操作方法
- →,←矢印キー:ドロイド君を動かす
- スペースキー:ジャンプする
ソースコード
このゲームのソースコードをGitHub上で公開しています。
(素材ファイルが含まれていないため、ビルドすることは出来ません。)
サポート情報
矢をよけろ!に関するサポート情報は、下の記事からご覧ください。