XCode+Githubでソースコード管理 (ユーザー編)

先ほどに続き、XCodeGithubでのソースコード管理です。
ただし今回は、既にGithubにあるプロジェクトを編集したいユーザー用手順^ ^


おおまかな流れは、こんな感じ。

  1. Githubでfork
  2. forkしたリポジトリをローカルにclone
  3. cloneしたリポジトリでbranchを作成
  4. branchへの編集をローカル・リポジトリにcommit
  5. pull request


1. Githubでfork


これは何度も出てきてるので、お手の物ですね。
ブラウザ上で数クリックで完了します。



このアドレス使うので、メモ。




2. forkしたリポジトリをローカルにclone


これも簡単です^ ^


まずXCodeを起動。



さっきメモしたアドレスを入れます。
認証でしばらく"Next"ボタンがグレーアウトされたままですが、気長に。



Nameは何も入れずにNext。



保存場所を指定。



clone中。




clone完了!



ローカルにcloneされていることを確認。




3. cloneしたリポジトリでbranchを作成


たくさんプロジェクトが入っているので、適当に1つ選んで開きます。



オーガナイザを開きます。



ここでもcloneされていることを再確認。



昨日のブログでも書いた通り、masterはrebase用なので編集しません。
まずは作業用のブランチを作成します。
通常は変更ごとにブランチ(トピック・ブランチ)を作ります。



今回はとりあえずなので、testSpikeとします。
本当は変更が何かわかりやすい名前にしましょう^ ^;


"Automatically switch to this branch"にチェックをつけると、
ブランチ作成後にそのブランチにチェックアウトしてくれます。


ちゃんとブランチ作成されました。



ターミナルでも確認出来ます。

takuto-2:EasyGallery takuto_1981$ pwd
/Users/takuto_1981/Documents/iPhone App Dev/iOS-Sample-Code/EasyGallery
takuto-2:EasyGallery takuto_1981$ git branch
master
* testSpike
takuto-2:EasyGallery takuto_1981$ git remote
origin


ところでXCode上でブランチを切り替える方法がわかりません> <;
仕方ないのでターミナルで、以下のように切り替えてます。
もし知ってる人いたら教えて下さい^ ^;

takuto-2:EasyGallery takuto_1981$ git checkout master
Switched to branch 'master'
takuto-2:EasyGallery takuto_1981$ git branch
* master
testSpike


4. branchへの編集をローカル・リポジトリにcommit


変更テストとして、適当にコメントを追加します。


ローカル・リポジトリにcommitします。



もう1個、ローカル・リポジトリにcommitしてみます。



5. pull request


まず、testSpikeをリモート・リポジトリにpushします。


先ほど登録したリモート・リポジトリが自動的に選ばれます。


Githubで、リモート・リポジトリへのpush成功を確認。




さて、最初にローカル・リポジトリへの編集中にfork元のリポジトリが更新されているかもしれません。
ということで、最新のリポジトリとのマージを行います。


まず、fork元のリポジトリのアドレス確認。
当然ですが、自分の管理しているリポジトリではないのでRead Onlyです。



XCodeでも出来るかもしれませんが、こっからは面倒なのでターミナル操作です。


まずはリモート・リポジトリの登録です。
fork元のリポジトリにupstreamという名前をつけます。

takuto-2:EasyGallery takuto_1981$ git remote add upstream git://github.com/xcatsan/iOS-Sample-Code.git
takuto-2:EasyGallery takuto_1981$ git remote
origin
upstream


次にupstreamのmasterから最新のものをpullします。

takuto-2:EasyGallery takuto_1981$ git checkout master
Switched to branch 'master'
takuto-2:EasyGallery takuto_1981$ git branch
* master
testSpike
takuto-2:EasyGallery takuto_1981$ git pull upstream master
From git://github.com/xcatsan/iOS-Sample-Code
* branch master -> FETCH_HEAD
Already up-to-date.
takuto-2:EasyGallery takuto_1981$ git branch
* master
testSpike
takuto-2:EasyGallery takuto_1981$ git push origin master
Everything up-to-date


今回はfork元が更新されていなかったので"Already up-to-date"でした。


説明のために、ここで更新があったという前提で話を進めます。


git rebaseで、fork元への更新とローカルでの更新をマージします。
# とは言え、今回は派生もとの変更がないので、以下のように何も行われません。

takuto-2:EasyGallery takuto_1981$ git checkout testSpike
Switched to branch 'testSpike'
takuto-2:EasyGallery takuto_1981$ git rebase testSpike master
First, rewinding head to replay your work on top of it...
Fast-forwarded master to testSpike.


マージした(つもりの)testSpikeをpushします。

takuto-2:EasyGallery takuto_1981$ git push -f origin testSpike
Everything up-to-date


とりあえずこれでpull requestの準備完了です。
ただし、あまりに大量にcommitが含まれる場合は、マージすると履歴が煩雑になってしまいます。
このような場合は、commitを1つにまとめましょう^ ^
commitを1つにまとめる方法については、先日書いた以下を参照下さい。


ソースコード管理をする(ユーザー編)
http://d.hatena.ne.jp/takuto1981/20111231/1325297172


さて、あとはpull requestすれば完了です!



出来た!