カテゴリー別アーカイブ: GitHub

Pull Requestをとりこむ

Pull Requestが送られてきた場合, 「Merge pull request」のボタンで自動的にマージするのは危険です.

Merge pull request
Merge pull request

そこで, 下記のような手順で安全にPull Requestをとりこみます.

1. コードレビュー

2. 受信側のローカルリポジトリを最新にする

$ git clone 受信側のリモートリポジトリ

あるいは,

$ git pull 受信側のリモートリポジトリ

3. 送信側のリモートリポジトリを取得する

$ git remote add PR送信者 PR送信者のリモートリポジトリ

4. マージ用のブランチを作成

$ git checkout -b pr1

5. マージする

$ git merge PR送信者/ブランチ名

6. 動作を確認する (問題があれば以降の手順はおこなわない)

7. メインのブランチにマージする

$ git checkout master
$ git merge pr1

8. 変更をpushする

$ git push

GitHub SSH公開鍵の登録

1. 秘密鍵・公開鍵のペアを作成

$ ssh-keygen
  • 鍵を保存するディレクトリ (Mac だと, /Users/ユーザー名/.ssh/id_rsa)
  • パスフレーズ (+ パスフレーズ確認)

以上の入力をします.

2. GitHubに公開鍵を登録する

作成した公開鍵 (id_rsa.pub) の内容をGitHubに登録します.

まずは, 公開鍵の内容をコピペするために, クリップボードにコピーします. (~/.ssh/id_rsa.pubの部分は鍵を作成したときのディレクトリに読み替えてください)

$ pbcopy < ~/.ssh/id_rsa.pub

GitHubに公開鍵を登録します. GitHubのProfileページからSSH keysのメニューを選択します.

GitHub Profile
GitHub Profile

Add SSH keyボタンをクリックします.

GitHub Profile SSH keys
GitHub Profile SSH keys

Titleには公開鍵のための任意の名称を入力します (MacBook Airなど). Keyのテキストエリアに先ほどクリップボードにコピーした公開鍵の内容をペーストします. 最後に, Add keyボタンをクリックすれば完了です.

GitHub Profile SSH keys Add key
GitHub Profile SSH keys Add key

3. SSH接続

$ ssh -T git@github.com

秘密鍵・公開鍵を作成したときに設定したパスフレーズを入力すれば接続できて, 以下のようなメッセージが表示されます.

Hi username! You've successfully authenticated, but GitHub does not provide shell access.

git / GitHub masterブランチの削除

GitHubのリポジトリで, Webサイトだけ欲しい場合, つまり, gh-pagesのブランチのみが欲しい場合, masterブランチは削除しておきたい場合も多々あると思います.

ローカルリポジトリ, つまり, gitでmasterブランチを削除するのは簡単です.

まずは, masterブランチ (削除したいブランチ) 以外のブランチにチェックアウトします.

$ git branch
* gh-pages
   master

あとは, branchのd (delete) オプションを利用して削除するだけです.

$ git branch -d master

次は, GitHub (リモートリポジトリ側) のmasterブランチを削除します.
まず, GitHubの対象リポジトリのsettingsメニューでデフォルトのブランチをgh-pages (あるいは, 削除対象のブランチ以外) に設定しておきます.

GitHub settings
GitHub settings
GitHub settings Default branch
GitHub settings Default branch

あとは, ローカルリポジトリからGitHubに対してmasterブランチを削除するように指示する必要があります.

$ git push origin :master

 

このコマンドでGitHubのmasterブランチが削除されます.
ちなみに, このコマンドの意味は,

$ git push [プッシュ先のリポジトリ] [ローカルのブランチ]:[リモートのブランチ]

対応関係は以下のようになります.

  • [プッシュ先のリポジトリ] -> origin
  • [ローカルのブランチ]            -> 空のブランチ
  • [リモートのブランチ]            -> (GitHubの) masterブランチ

つまり, ローカルの空のブランチを, (GitHubの) masterブランチにシンクロさせることによって, GitHubのmasterブランチを削除しているわけですね.

参考 : 復習 Git: GitHub のブランチを削除する.

GitHub Pull Request の基本

昨日に引き続き, 今日もHTML5 ROCKSのリポジトリにPull Requestしました.

(備忘録的な意味もこめて, ) Pull Requestを送る手順をメモしておきます.

1. Pull Requestを送るリポジトリをFork

これは, gitの機能ではなく, GitHubの機能です. リポジトリをForkすることで, 自分の思うように変更が可能になります. Forkするには, 対象のリポジトリのGitHubのページの右上にある「Fork」ボタンを押すだけです.

 

GitHub Fork
GitHub Fork ボタン

2. Forkしたリポジトリをclone

Forkしたリポジトリをローカルの開発環境であつかうために, cloneしてきます. 注意していただきたいのは, Forkしたリポジトリをcloneしてください

$ git clone [Forkしたリポジトリ]

3. 開発用のブランチを作成

masterブランチはいわゆるトピックブランチ (最新の状態で, 常に正常に動作する. 戻りたいときの目印的な役割) としておいたほうがいいので, 新たにブランチを作成します. ブランチ名は適当に決めてください. とりあえず, ここではmy-workとします.

$ git branch
* master
$ git branch  my-work
$ git branch
* master
   my-work
$ git checkout my-work
   master
* my-work

また, checkoutに-bオプションをつければ, ブランチの作成とチェックアウトを同時にできます.

$ git checkout -b my-work

4. git add / git commit

上記の手順までできていれば, あとはふつうにgitでバージョン管理するようにリポジトリを更新していくだけです. Forkしたリポジトリなのでどんな変更をしようが問題ないですし, トピックブランチ (masterブランチ) があるので, いつでも開始状態に戻ることが可能です.

5. リモートブランチの作成

リポジトリの更新をGitHubのForkしたリポジトリに反映するには, GitHub側にもブランチを作成する必要があります.

$ git push origin my-work
$ git branch -r
 remotes/origin/HEAD -> origin/master
 remotes/origin/my-work
GitHub branch
GitHub branch

ブランチをGitHubにも作成すると, リポジトリのページでbranchの切り替えができるはずです.
そこで, リポジトリを更新したbranchであるmy-workに切り替えると, 更新した内容が反映されているはずです.

6. Pull Request

いよいよ最後の手順です. ここまでの作業は言わば自分だけに影響することだったので, そんなに神経質になる必要もなかったのですが, Pull Requestは更新したリポジトリをFork元のリポジトリの制作者に依頼するわけなので, 少し慎重になりましょう.

Pull Request
Pull Request

Pull Requestをするには, Forkした自分のリポジトリの「Pull Request」ボタンを押します.
すると, Pull Requestを送るためのページに切り替わります.

Create Pull Request
Create Pull Request

テキスト入力の箇所は, Pull Requestをした理由を記載します.

「Commits / File Changed」タブで, Pull Requestに含まれるコミットやファイルの差分を確認できます.

以上を確認して問題がなければ, 「Create pull request」ボタンを押します. これで, Fork元のリポジトリの制作者に通知されます.

あとは,  Fork元のリポジトリの制作者が確認をして問題がなければmergeしてくれて, 自分にもその通知が届きます.

* リポジトリのアップデート

Fork + clone してきたリポジトリのmasterブランチはトピックブランチにしておくとメモしましたが, そのままの状態で最新の状態に保たれるわけではないので, 定期的にアップデートして最新の状態にすることが必要です.

1. アップデート用のリモートリポジトリを作成

アップデート用のリポジトリ名をupstreamとします.

$ git remote add upstream [Fork元のリポジトリ]

ここでのポイントは, Fork元のリポジトリを指定することです. そうでないと, 最新のリポジトリの状態を参照することにならないからです,

2. 更新

更新するために, トピックブランチであるmasterブランチにチェックアウトします.

$ git checkout master

そして, 最新のリポジトリのデータを取得します.

$ git fetch upstream
   remote: Counting objects: 14, done.
   remote: Compressing objects: 100% (12/12), done.
   remote: Total 14 (delta 7), reused 6 (delta 2)
   Unpacking objects: 100% (14/14), done.
   From https://github.com/html5rocks/www.html5rocks.com
   13498ed..2cfc907  master     -> upstream/master
    //... etc

最後に, 取得した最新のリポジトリのデータをトピックブランチ (masterブランチ) にマージします.

$ git merge upstream/master
   Updating 0dd88ed..2cfc907
   Fast-forward
   CALENDAR.md                                        |  2 +-
   content/tutorials/webaudio/intro/en/index.html     |  2 +- 
   content/tutorials/webaudio/intro/ja/index.html     | 35 ++++++++-----
   .../webaudio/intro/static/js/filter-sample.js      |  3 +-
   .../webaudio/positional_audio/ja/index.html        | 58 ++++++++++++----------
    5 files changed, 59 insertions(+), 41 deletions(-)
    // ...etc

ちなみに, 既に最新の状態である場合には, 「Already up-to-date」と表示されます.

$ git merge upstream/master
   Already up-to-date.

以上が, Pull Requestを送る基本となります. 最初は手順が多そうに感じますが, やってみると案外そうでもないです.
Pull Requestは敷居が高そうで実はそうでもなく, でも素晴らしい機能なのでどんどん利用しましょう.

オープンソースとPull Request

HTML5 ROCKSの位置オーディオと WebGL の統合のデモがThree.jsとWeb Audio APIのAPI変更により動作しなくなっていたのを自分で改修していたのですが, 元々の制作者により対応されました.

それにともない, 記事のサンプルコードも修正されたのですが, 日本語版の記事のサンプルコードが古いままだったので,

  1. リポジトリをFork
  2. Forkしたリポジトリをローカル環境にclone
  3. 作業用のブランチを作成 (masterはトピックブランチにしておくため)
  4. 修正したものをcommit / push
  5. Pull Request

何気にGitHubのPull Request機能を使うのは初めてでしたが, こんな些細なことでもオープンソースに貢献できるんだなと思いました.

今まで, オープンソースに貢献するというとすごく敷居が高いイメージがあったのですが, 最初はこういった些細な修正から始めることでいいんだなと思いました. そして, GitHubのPull Request機能がそれを可能にしてくれます.

これを機に, ソーシャルコーディングにもどんどんチャレンジしてオープンソースに貢献していきたいです.

GitHub Pages (gh-pages) のブランチをローカルにcloneする

GitHubのSettingsからページを作成して, 既にgh-pagesのブランチが存在する場合…

$ git remote -v
origin	https://github.com/****/****.git (fetch)
origin	https://github.com/****/****.git (push)

$ git fetch origin
remote: Counting objects: 14, done.
remote: Compressing objects: 100% (12/12), done.
remote: Total 14 (delta 1), reused 8 (delta 0)
Unpacking objects: 100% (14/14), done.
From https://github.com/****/****
 * [new branch]      gh-pages   -> origin/gh-pages

$ git branch
* master

$ git checkout -b gh-pages --track origin/gh-pages
Branch gh-pages set up to track remote branch gh-pages from origin.
Switched to a new branch 'gh-pages'

$ git branch
* gh-pages
  master

以上.