【朗報】俺氏、gitを学び始める
複数端末でプロジェクトを管理(コード書く人は同じだけど)する必要が生じたので、gitとgithubを学ぶ必要が生じる。
とりあえず学ぶのは大変なので必要最低限のことを教えてもらいます。
思い出しながら書いてるから抜け漏れあったりなかったり。
gitの導入、ローカルでのプロジェクト管理
rails入れてるんだったら、その中にgitはすでに入っているぽい。
とりあえずは、ローカルでgit管理をする方法を学ぶ。
導入〜initial commit
git status
$ git status
statusを使うと、ファイルがどんな状況か分かる。まだリポジトリは空なので、「Untracked files:」と全てのディレクトリやファイルが赤く表示されてるはず。
git add
$ git add .
でとりあえず初回は全ファイルをaddしてみる。んで、もっかいstatusでみてみると、
$ git status On branch master Initial commit Changes to be committed: ....
となり、「new file:」と緑色で書かれたファイルがバーっと並ぶ。これが今gitにaddされてて、これからcommitしますよーって一覧。
commitされたら基本戻せないと考えた方がよいみたいなので、まずそうなファイルはここで確認。
プロに確認すると、以下がいらないファイルとのこと。
- .idea #rubymineの個人設定などが入っている。PJteamなどで共有すべきでないファイル
- .DS_Store #finderの表示情報などのメタファイル。不要。
これらはgitで管理する必要がないので、「.gitignore」というファイルで指定しておけばよいみたい。
[ .gitignore ]
... /.idea .DS_Store
で。一回addしちゃったものをどうやって消そうかな、という時は rm。
$ git rm --cached -r .
オプションとして--cachedをつけることでファイルを残したまま管理対象から外せる。これをつけないと、ファイルごと削除しちゃうので注意。(上の例でやっちゃうと、プロジェクト内のファイル全部消えるという地獄になる)
んでリムった後にgit statusしなおすと、add前と同じ状況になってるはず。
.gitignoreを書き換えてからrmしようとすると怒られるので、一旦addしたときの状態に戻してからrm → .gitignoreへの追記をすること。
ダイジョブな感じになったので、もっかいgit add → git status。不要なファイルがなくなっていればOK。
さぁcommit初体験。
git commit
$ git commit
すると、vimが立ち上がり「コミット名を言え!言うんだ!」と言われるので書く。
vimなので、以下コマンドで。初心者だから一応復習しときなさい。
- i押してinsert状態にしてからコミット名書く
- esc押してinsert抜ける
- :wqで保存終了
初回なのでコミット名は「initial commit」としておく。
コミット完了!
git statusすると「特になんもねえよ」と言われるはず。
git log
これまでにコミットした内容を確認するにはログを見る。
$ git log ...これまでのコミットが最新のものを先頭に並ぶ...
ちなみに "-p" オプションをつけると、コミット内容も見ることができます(抜けるときはqをタイプ)
コミットの更新、そしてgit diffは重要
テストとして、適当なファイルを書き換えて保存してみる。んでgit statusすると、
$ git status On branch master Changes not staged for commit: ...
という感じで、変更されたファイルを教えてくれる。
git diff
具体的にファイルの中身がどう変わったか、っていうのは、git diffで教えてくれる。
$ git diff ... ...(変更点がばーっと出てくる)
addする前には、ここでgit diffをきちんと読んでどんな変更があるかをちゃんと把握することが超重要。
だそうです。
ちなみに、-uオプションをつけることで、「unified」形式というフォーマットで表示できる。変更点がたくさんある場合はこれで見ると見易いのだそう。(抜けるときはqをタイプ)
addするときは一つづつ
さっきは"."を使ってまるっと全部addしちゃったけど、想定外のものもaddしちゃう可能性もあるので、
基本的にはファイルを指定してaddすること。
git statusすればファイル名が出てくるので、確認できたファイルのアドレスをコピって
$ git add ファイル名
で貼り付ければOK。んで全部問題なくaddできれば、コミットする、みたいな。
git checkout
もし「あーなんかいろいろ変えちまって訳わからんくなった!もっかいやりなおす!」みたいなことになったときの呪文。
$ git checkout ファイル名
とすることで、commitされたファイルの状態に戻すことができる(上書きされる)。
とりあえず、ローカルでコミットしていく方法の基礎としてはこんな感じ。
githubへのアップロード
<アカウント連携は以前やったけど内容があいまい>
アカウント作成
まぁよくあるサービスみたく作ればOK。
秘密鍵、公開鍵を作成する
githubとssh連携するために鍵を作る必要あり。
基本的には「~/.ssh」ディレクトリに置かれているので、まず自分が鍵を持っているか確認。なければ以下コマンドで作る。
$ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/Users/user/.ssh/id_rsa): # 作成される場所。問題なければEnter Enter passphrase (empty for no passphrase): # ssh接続するときに入れるパスフレーズの入力 Enter same passphrase again: # パスフレーズの確認。再入力する
そうすると、~/.sshディレクトリに以下ファイルができてるはず。
catコマンドで中身出力してみる。
$ cat ~/.ssh/id_rsa.pub ssh-rsa ...文字列がたくさん...
これが公開鍵。
githubに公開鍵を登録
以下はブラウザでgithubを開いて実施。
- settings画面のメニューにある「SSH keys」を押下
- 「Add SSH key」を押下
- フォームが出てきたら、タイトルとKeyを設定
- Titleはなんの鍵かわかるようにしとく(接続するPCの名前とか)
- Key:はcatコマンドで出した文字列をまるっとコピペ
最後に接続を確認するため、以下を打ち込む。
$ ssh git@github.com
なんかいろいろワーニングでたりするかも知れないけど、「Hi hogege! ...」と挨拶されたらとりあえず認証OK。
リモートリポジトリを追加
ローカルのリポジトリに、リモートリポジトリ(github)を追加する。git remoteコマンド。
リモート先のURLは、githubのリポジトリのページにある「SSH clone URL」をコピペする。
$ git remote add origin git@github.com:hoge
- 「origin」は短縮ネーム。いちいちgitコマンドでURLを指定しなくても、これを打てばよいということ。なぜoriginなのかはgitがデフォルトで決めたからだそうです。
- 「git@github.com:hoge」はリモート先のURL。
これで、ローカルのgitとgithubが連携できた。
githubにpushする
これで心置きなくgithubにアップロードすることができるようになりましたので、やってみる。
git push
とにもかくにもアップロードするにはpushコマンド。
$ git push -u origin master
- "-u"オプションは初回のpushコマンドだけ必要。こうすると、次回から「git push」だけで自動的にケツに「origin master」をつけてpushしてくれるのだそう。
んでpushしてからgithubのリポジトリページをリロードしてみると。。。
あ、よくgithubで見るフォルダのリンクがいっぱいならんでる!みたいな状態でアップロードが確認できるはず。
こんな感じでpush!push!push!していけばいいのね。
まぁとりあえず、一人でやる分には今回みたいな別端末で作業するようなことなければローカルのgit管理だけで十分なんだけども。
Rubymineでもgitが簡単に使える
プロから聞くと、Rubymineは高いだけあって、gitの機能も充実しているとのこと。ほほう。
Rubymineにgitを適用する
プロジェクトにgit入れたとき、RubymineのEvent Logに以下のようなリンクが書かれる。
Unregistered VCS root detected The directory /プロジェクトのアドレス is under Git, but is not registered in the Settings. Add root Configure Ignore
ここで「Add root」をぽちっと。
するとツールボタンに「Version Control」なるものが追加される。
このタブの左側アイコンにある「Preview Diff」を使うと、ファイルごとに変更前後を並べて見ることができる。
これめっちゃくちゃ便利。ターミナルでコマンド打つより全然早い。いやほんとすごいぞRubymine。高いだけあるぞRubymine。
で、ファイル名の部分を右クリックして「Commit Changes...」を押すと、コミット画面に。
コミットメッセージを入れて、「Commit」ボタンを押せば完了。あらお手軽ね。
さらになんと!「Commit」ボタンにオンマウスすると出てくる「Commit and Push...」をすれば、pushも同時にやってくれるのだ!やばいぞRubymine。もっててよかったRubymine。
(このとき、Rubymineから「SSHのパス教えて」と「Rubymineにパス保存しとくよ」的なこと言われるけどとりあえずパスワード設定すればいいので省略)
githubからプロジェクトを共有する
さて、pushしてgithubに置いたので、別端末でも作業ができるようにしてみる。
鍵を共有する
本当であれば公開鍵つかって承認やらなんやらあるみたいだけど、手元に端末あるので、元の端末で作った鍵「id_rsa」「id_rsa.pub」をコピって別端末の~/.sshに置く。
メールとかだと危ないので、Airdropつかった。すごいぞmac。
プロジェクトをローカルに持ってくる
プロジェクトを置きたいディレクトリに移動し、よくアプリを落とすときにも使うcloneコマンド。
git clone
$ git clone リポジトリのSSH clone URL
ディレクトリにプロジェクトファイルが展開される。
git branch
cloneしたものがどういうbranch構造なのか確認する。(現状はまだbranch作ってないけど一応覚えとく)
$ git branch * master
また、git logで変更点を確認したりもする。(特に他人がいるプロジェクトでは重要)
git pull
一度cloneした後に変更内容を持ってくるにはpullで。
pullするとローカルのコミットされてない内容も上書きされてしまうので、pullする前には必ずgit statusで編集中のものがないかを確認するべし。
$ git status # pullする前は編集中の内容がないか確認する $ git pull origin master $ git log # pullしたときは変更履歴を確認するように習慣づける
こんなところでしょうか。ふう。
あ、あとrailsの場合、gemfileは入っていないので、
- gem install bundler #Gemfileを処理するツール
- bundle install #Gemfileの中にかいてあるライブラリを全部いれる
- rake db:migrate
は必要っぽい。