GitHubにXcodeから初めてソースコードを公開する方法【Swift】【Xcode6】【初心者】

環境
OS X Yosemite10.10
Xcode6.1.1
iOS SDK 8.1
git version 1.9.3 (Apple Git-50)

#知識レベル
* gitとGitHubの違いもよくわからなかった。趣味でのプログラミングしかしていないが、仕事でチーム開発するにはgitの知識が必要らしい、という認識。
* GitHubは公開されているソースコードをダウンロードするときに何度か（10回程度）訪れている。毎回`Download Zip`のボタンを押すだけ。
* ターミナルをほとんど使えない（ググらずに使えるのはcdとlsコマンドぐらい。）
* 数カ月前にドットインストールのgit入門の7回目（全22回）まで視聴。なんだか難しそう、という認識。
* Swiftで新しいプロジェクトを作成する際、git管理するかという確認があり、そこにはチェックしておいたほうが良いらしいというネットの知識。


#手順
##1.GitHubのアカウント作成
https://github.com/
ユーザーネームやパスワードを設定して簡単にアカウントが作成できる。

##2.ターミナルを起動
アプリケーション -> ユーティリティ -> ターミナル.app

##3.gitの初期設定
ターミナルに以下を入力していく。
`git --version`でgitのバージョン確認
ユーザーネーム、GitHubに登録したメールアドレスを入力
`git config --global user.name "XXXXX"
git config --global user.email "XXXXX@Xmail.com"`
`git config --list`で現在の設定を確認

##4.SSH鍵の設定
以下を入力
`mkdir ~/.ssh/github`
`ssh-keygen -t rsa -C "XXXXX@Xmail.com" -f ~/.ssh/github/id_rsa`

次のように表示される
`Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): //ここでパスワード入力
Enter same passphrase again: //パスワード再入力
Your identification has been saved in /Users/YOURNAME/.ssh/github/id_rsa.
Your public key has been saved in /Users/YOURNAME/.ssh/github/id_rsa.pub.
The key fingerprint is:
XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX XXXXX@Xmail.com
The key's randomart image is:
+--[ RSA 2048]----+
|           o o.o |
|         o o.oo..|
|        o.oo.....|
|       o + o o. .|
|       o o. ... .|
|      o o.oo.  o |
|        o o.oo   |
|               . |
|        o o      |
+-----------------+`

`ls ~/.ssh/github`を入力すると
`id_rsa	　　id_rsa.pub`と表示される。

`cat ~/.ssh/github/id_rsa.pub`を入力すると公開鍵が見られる。
`ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCd+t0ooWFXDrEFuRkLAoMJYralIRhClJ/WB499zJziIAazzPCJdWiri2S+p03OUl1CBH+zR3z0AbDsxEM+KROLE5dNusexwmEaeCFxqJI51XWs70rVpKw8BAs1UonB9ZDeHjSq7m4NHtyAp5MQqFv9zZ7g+oHrjVfe5ebz8SEL5dNVkGC0aHa+uCXAwzwEm3h6q9WLQ6tpaM5PzfY1atu2AiauC4pypecUjdzvIveYSbKc2k4UurO2q/6krjMJ+hDIOFfhGxYZRzzR51phnIW2w9vq6fCzeCRrIC/3k1UlhHBon6JUYc5qW9cz9qauuSO+ImHy3dPWxKww8Falnz2H XXXXX@Xmail.com`

##5.SSH鍵の登録
GitHubにログイン
右上の設定ボタン -> 左カラムのSSH keys -> Add SSH key


![001.png](https://qiita-image-store.s3.amazonaws.com/0/63942/54e82438-2423-b15f-7a37-cf59c44e7276.png)

<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/948a6068-e1d5-eabd-3122-3828de92cf41.png" width=450>


titleとkeyを入力　-> Add key -> 先ほど設定したパスワードを入力

![003.png](https://qiita-image-store.s3.amazonaws.com/0/63942/4d5b00b8-5abc-feef-1334-09d40682ddde.png)


これで登録完了。

##6.登録されているかを確認
`ssh -T git@github.com -i ~/.ssh/github/id_rsa`を入力

以下が表示される。

`The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is 16:27:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX.
Are you sure you want to continue connecting (yes/no)? `

`yes`  を入力

`Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Identity added: /Users/YOURNAME/.ssh/github/id_rsa (/Users/YOURNAME/.ssh/github/id_rsa)
Hi uqtimes! You've successfully authenticated, but GitHub does not provide shell access.`

キーチェーンによるパスワード入力を求められた場合、SSH鍵作成の際のパスワードを入力。
「パスワードをキーチェーンに保存」にチェック。

##7.GitHub.comへのアクセスを簡単にする
上記の`ssh -T git@github.com -i ~/.ssh/github/id_rsa`でもアクセスできるが、それをもっと簡単にするため、ファイルを編集する。

`vim ~/.ssh/config`と入力

ファイルの編集画面になるので、以下
`Host github.com
IdentityFile ~/.ssh/github/id_rsa`
をコピーして貼り付け、保存する。これは、vimでの編集に慣れた人なら簡単にできるが、私は調べながらドキドキしながらやった。
丁寧に説明すると

* 編集画面が開いたらアルファベットの「i」を押す。
* 画面下に--INSERT--と出ていればOK.
* その状態で`ctrl+V`で貼付け。
* escキーを押す
* 画面下の--INSERT--が消えた状態で`:wq`と入力。

これで編集完了。

`ssh -T git@github.com`を入力し
`Hi uqtimes! You've successfully authenticated, but GitHub does not provide shell access.`と表示されればOK.


##8.GitHubのレポジトリを作成
画面右上のプラスマークからNew repositoryを選択

![005.png](https://qiita-image-store.s3.amazonaws.com/0/63942/107b078e-fa5b-ec55-4af9-ee3a56310bd9.png)


Remository nameと Description（概要）を記入。
Publicにチェック。
initialize this repository with a READMEにチェックは入れないこと。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/7444ccf7-dba3-3c7b-9775-6fb82e9c1329.png" width=450>


SSHのアドレスが表示されるので、右側の`Copy to Clipboard`をクリックしコピーしておく。
このとき、HTTPSでなく、SSHのアドレスを選択すること。
![006.png](https://qiita-image-store.s3.amazonaws.com/0/63942/8d4beff1-0c96-9feb-81d3-a29c511a4f91.png)


##9.Xcodeで新規プロジェクトを作成
プロジェクトの保存先を選ぶときに、`Source Control:Create local git repository for this project`にチェックを入れる。

![007.png](https://qiita-image-store.s3.amazonaws.com/0/63942/fba189ab-fa4c-17d7-4dff-29363b20553a.png)


##10.GitHubのレポジトリを登録
メニューバーのSource Control -> YOURREPOSITORY NAME -> Configre YOURREPOSITORY NAMEを選択

![008.png](https://qiita-image-store.s3.amazonaws.com/0/63942/9ceea42e-0bb4-20e1-0338-cba177f6726f.png)

Remotsのタブを開き、左下のプラスボタンからAdd Remoteを選択 -> Done

![009.png](https://qiita-image-store.s3.amazonaws.com/0/63942/8ef673cd-6363-5bbe-f5fc-86ad7bead6c7.png)

名前を入力し、Addressに先ほどGitHubでクリップボードにコピーしたSSHアドレスを貼り付け。

![010.png](https://qiita-image-store.s3.amazonaws.com/0/63942/730772a6-5747-6243-4ee7-cc754a28c0ec.png)

無事に登録が終わるとリモートリポジトリが表示される。

![011.png](https://qiita-image-store.s3.amazonaws.com/0/63942/174652c2-3b31-dfcc-d93e-b8982c705274.png)


##11.ソースコードを公開
開発を行う。プロジェクトにファイルを追加したり、コードを加えたりする。
Xcodeの左側、ナビゲーションエリアにのファイル名の横に、変更された場合「M」、追加されたファイルの場合「A」が表示される。

<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/a9bc2016-c5a3-a538-ec20-f6a5747a8a8e.png" width=300>


まとまった変更が終わったら、commitを行う。
Xcodeのメニューバー -> Source Control -> Commit

<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/1c517360-2c36-78db-d567-ef081ba37b96.png" width=300>

画面左側で、変更履歴を保存するファイルにチェックが入っていることを確認し、下部にコミットの内容を入力。
ここは必須で、空白のままだとエラーが出る。
変更履歴の書き方は、他の人が見てもわかりやすいように
**1行目 : コミットでの変更内容の要約**
**2行目 : 空行**
**3行目以降 : 変更した理由**
とすると良いらしい。

![021.png](https://qiita-image-store.s3.amazonaws.com/0/63942/570579eb-9c1f-6830-2297-cfa84b7a9352.png)

※コミット画面の左下にあるオプションをオンにすることで、同時にリモートプッシュが出来る。(tottokotkdsさんより、コメントにて教えていただきました。)

<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/7ab0153e-e4c3-ef70-452b-aeb040e99de1.png" width=300>


変更履歴も含め、GitHubに公開する。
Xcodeのメニューバー -> Source Control -> Pushを選択

<img src="https://qiita-image-store.s3.amazonaws.com/0/63942/3c650af4-d4cb-2f32-4725-da2d75163d46.png" width=300>

先ほど作ったリモートリポジトリが選択されていることを確認し、Pushを押す。

![025.png](https://qiita-image-store.s3.amazonaws.com/0/63942/40aea4c6-3e04-1b70-8bb6-dc8cb2b2e742.png)


Push successfulと表示されれば完了！

![026.png](https://qiita-image-store.s3.amazonaws.com/0/63942/e42a54ed-245d-9228-8146-bd55fff99e6d.png)

GitHubのリポジトリページを確認すると、自分のソースコードが公開されていることがわかる。

![027.png](https://qiita-image-store.s3.amazonaws.com/0/63942/d5b9d5a2-5b93-8150-ffbc-13503bfc2fcc.png)




#苦労した点
##リモートリポジトリが登録できない。
手順10で、GitHubのリポジトリアドレスを登録しても、commitもPushもできない状態に。スペルミスだろうか、何が違うのだろうかと何度もやり直した。
結論としては、コピーするアドレスがhttpsから始まるものだったため、つながらなかったようだ。
`git@github.com`から始まるSSHのアドレスをコピーすること。

##Pushできない
もう一つ悩まされたのが、pushしようとしても以下のポップが出てできないエラー。

![030.png](https://qiita-image-store.s3.amazonaws.com/0/63942/9ea14992-42de-4ca7-fbaa-24b2799b4562.png)

`Working copy out of date.`
`Try pulling from the remote to get the latest changes, then push again.`
とあるので、pullしようとしても、
`"NAME/master" is not a valid remote branch to pull from. Please choose a different remote branch.`
とエラーが出る。commitもできず、原因がわからなかった。
いろいろ調べたところ、手順８でGitHubにレポジトリを作成する際、**initialize this repository with a README**にチェックを入れ、.gitignoreとライセンスを選択したのが原因らしい。
もう一度新しいリポジトリを作りなおし、チェックを外した状態でpushすると、問題なく公開できた。

ただし、これだとライセンスを自動で明記できないので、問題があるかもしれない。
リポジトリ作成後にライセンスファイルを自動で追加できる機能があれば良いのだが、、、。
もし、もっと良い方法があったら教えていただけると嬉しいです。

#参考サイト
[そもそもGitHubとは一体何か？](http://jp.techcrunch.com/2012/07/15/20120714what-exactly-is-github-anyway/)
[ドットインストールgit入門 (全22回)](http://dotinstall.com/lessons/basic_git)
[githubストーリー 〜そのコードgithubで公開しませんか？〜](http://www.physicaloid.com/2014/05/github%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AA%E3%83%BC-%E2%80%95-%E3%81%9D%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89github%E3%81%A7%E5%85%AC%E9%96%8B%E3%81%97%E3%81%BE%E3%81%9B%E3%82%93%E3%81%8B%EF%BC%9F/#cap5)
[XcodeからGitHubのリポジトリを使う方法](http://uqtimes.blogspot.jp/2012/05/xcodegithub.html)
[Gitの基本 変更を記録するコミット](http://www.backlog.jp/git-guide/intro/intro1_3.html)
[Can't push/pull to/from brand new repository hooked up to Xcode](
http://stackoverflow.com/questions/14452245/cant-push-pull-to-from-brand-new-repository-hooked-up-to-xcode)

#その他
##なぜGitHubに挑戦しようと思ったか
　数カ月前からgitは気になる存在でした。JavaScriptを勉強していたとき、公開されたプラグインのファイルをGitHubから丸ごとダウンロードさせてもらうことが複数回ありました。また、求人要項の必要とされるスキル欄に「gitの知識」と書かれていることも。今どきのプログラマにとって必須知識なのか！と思い、ドットインストールで入門動画を見てみました。
　しかし、ターミナル操作に難がある私がそれを見ても、いまいち腑に落ちず、使うことのメリットもよくわかりません。特に必要に迫られていないため勉強のモチベーションも高まらず、放置していました。
　最近Swiftを勉強し始め、Qiitaやブログでソースコードを公開している方がGitHubにもプロジェクト丸ごと公開していることが多いとわかりました。ソースコードの一部を読むよりも、GitHubからプロジェクト全体をダウンロードしたほうが全体像を把握できます。簡単にシミュレーターで実行確認もできます。その便利さに大きな魅力を感じました。
　私自身、youtubeやQiitaに簡単なサンプルを投稿するようになり、プロジェクト全体を共有するのはGitHubが良いだろうと。こんな経緯で挑戦してみました。

##これから取り組みたいこと
* ドットインストールのgit入門を最後まで見る
* CommitとPushのタイミングを知ったり、branchなどもわかる状態になる
* ターミナルから自在に操作できるようになる（Xcodeからの公開はきっと比較的容易だろうから。）
* GitHubを介した他のプログラマとのつながりを持つ


間違いや不明点、より良い方法などありましたら、遠慮無くご指摘ください。最後までお読み下さり、ありがとうございました。