ドグサレ初心者のへっぽこビッグウェーブ

地球の底辺にいるゴミがプログラミングとか音楽とかを語るクソブログ

【朗報】俺氏、gitを学び始める

複数端末でプロジェクトを管理(コード書く人は同じだけど)する必要が生じたので、gitとgithubを学ぶ必要が生じる。

とりあえず学ぶのは大変なので必要最低限のことを教えてもらいます。
思い出しながら書いてるから抜け漏れあったりなかったり。

gitの導入、ローカルでのプロジェクト管理

rails入れてるんだったら、その中にgitはすでに入っているぽい。

とりあえずは、ローカルでgit管理をする方法を学ぶ。

導入〜initial commit

git init
$ git init
Initialized empty Git repository (pass...)

これでプロジェクトにリポジトリが作成されました。ワオ。

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なので、以下コマンドで。初心者だから一応復習しときなさい。

  1. i押してinsert状態にしてからコミット名書く
  2. esc押してinsert抜ける
  3. :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へのアップロード

他のPCとリポジトリを共有するために、githubを使う。

<アカウント連携は以前やったけど内容があいまい>

アカウント作成

まぁよくあるサービスみたく作ればOK。

秘密鍵、公開鍵を作成する

githubssh連携するために鍵を作る必要あり。
基本的には「~/.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リポジトリを作る

githubトップの「+new repository」ボタンからリポジトリを作成すればOK。

  • Repository nameは基本的にプロジェクト名と一緒で。
  • Privateリポジトリは、クローズドにするにはお金がかかるもよう。ミニマムで7ドル/5リポジトリ

リモートリポジトリを追加

ローカルのリポジトリに、リモートリポジトリ(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

んで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」なるものが追加される。
http://g.s9t.jp/data/08ab3464d0492c59484856042225de59.png

このタブの左側アイコンにある「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

は必要っぽい。