ATSU Tech Blog

Ruby on Rails, Pythonなどの記事を書いています。

git addとcommit、pushの関係をわかりやすく解説する【Gitコマンド解説①】

以下のGitコマンド、よく出てきますよね。

$ git add 
$ git commit 
$ git push

このコマンドを打つことで、ソースコードを書き換えてGithubを更新してくれる。プロフィールに草が生えるからうれしい。今日のプログラミングはおしまい。

しかしここで、「git addとcommitの関係は? git pushってどういう意味?」と聞かれると、すらすらと答えられない人も多いのではないでしょうか。草が生えて喜んでるのにそんなこと聞くなよ、と。プログラミングを始めたころは、私もなんとなくこのコマンドを使っていました。

今日は、git addとcommit、pushの関係をわかりやすく解説していこうと思います。

リモートリポジトリとローカルリポジトリって?

Gitコマンドを理解するためには、まず「リモートリポジトリローカルリポジトリの関係」を理解する必要があります。

リポジトリとは、ファイルやディレクトリの履歴を管理する場所のことです。

自分のパソコン内でバージョン管理するために作成したリポジトリローカルリポジトリといいます。リモートリポジトリはネット(主にGithub)にファイルをアップロードした状態でファイル管理するものです。

Image from Gyazo 画像引用:https://backlog.com/ja/git-tutorial/intro/02/

チーム開発の場合、個人がローカルリポジトリで開発を進めて、リモートリポジトリで開発したコードを共有する、という流れです。リモートリポジトリはネット上でファイルが共有されているので、プルリクエスという、自分のソースコードに対するレビューをもらったりして、開発を進めていきます。

図にあるように、ローカルリポジトリの内容をリモートリポジトリに送信(アップロード)すること「push」と呼びます。

$ git push

これでgit pushの意味が分かりましたね。

git add とgit commitのちがいとは?

git addとcommitはローカルリポジトリ内で使用するコマンドです。

ソースコードを書き換える流れを、図に表すと以下のようになります。

Image from Gyazo 画像引用:https://backlog.com/ja/git-tutorial/intro/04/

ワークツリーとは、実際に作業している場所(ディレクトリ)のことを指します。ここでああでもあい、こうでもないと試行錯誤して開発を進めるわけですね。

そのあとソースコードが完成したら、リポジトリに更新する必要があります。このソースコードの更新作業を「commit」と呼びます。

ここでワークツリーとリポジトリの間には、インデックスというスペースがあります。これはコミットするファイルを準備するところです。ワークツリーからインデックスに登録することを「add」と呼びます。

※ちなみに、なんでインデックスが必要なの?いきなりワークツリーからリポジトリにコミットで良くない?と思った方もおられるかもしれません。

インデックスの役割としては、変更点をいきなりコミットすると更新されてほしくない箇所も更新する恐れがあるからです。色々変更を加えたけど、ファイルAとBを変更したとき、Aだけコミットしたいことがあります。インデックスにAだけを登録することで、変更して欲しいファイルだけコミットすることができるんですね。

コミットに含めたい変更を選別する作業を行うのがインデックスの役割です。

これで、git add とgit commitの違いがわかったかと思います。このあとpushコマンドを使って、ローカルリポジトリの内容をリモートリポジトリに送信(アップロード)する流れになります。

まとめ

git addとcommit、pushの関係をまとめると

1.git addコマンドで、インデックスにコミットしたいファイルを登録する。
2.git commitコマンドで、インデックスにあるファイルを更新する。
3.git pushコマンドで、ローカルリポジトリの内容をリモートリポジトリに送信する

この3つを押さえておきましょう。

そのほかにもpull、clone、mergeコマンドなど、良く出てくるGitコマンドがあるのですが、それは次回の記事で解説したいと思います。


この記事の説明がわかりやすかった!ここ間違ってるよ!次こんな記事を書いて欲しい!などあればコメント、DMよろしくお願いします。LGTMもぜひ。

Twitterもやってますので、フォローしていただけたらうれしいです。 卓球、心理学、哲学、Webサービス、好きな音楽、カメラ、登山、ランニング、読んだ本などなんでもつぶやいてます。

https://twitter.com/atsushi101011

Rubyにおける「クラス」と「オブジェクト」の関係について分かりやすく解説してみる

Rubyの勉強を始めて、すぐに出てくる重要キーワード。それは「クラス」「オブジェクト」です。

Rubyにおいて重要な概念だと分かってるけど、なんとなくの理解で学習が進んでいってしまうことも多いのではないでしょうか。

  • クラスはよく使うけど理解が浅い

  • 「クラス」と「オブジェクト」の関係がいまいち掴めない

  • どうやって「オブジェクト」を作れば良いかわからない



今日はこのような方に向けて、記事を書いていこうと思います。

「クラス」と「オブジェクト」の関係について

クラスとは「もの」を作るときの「設計図」です。

オブジェクトとは設計図をもとに作られる「もの」です。

クラスとオブジェクトの関係を図に表すと以下になります。

Image from Gyazo

クラスが「人間」 オブジェクトが「たろう」「花子」「Michael」です。

クラスである「人間」には(名前,出身)という設計図が描かれています。

この設計図を使って、「名前:たろう,出身:東京」のオブジェクトを作っています。

つまり、 設計図である「クラス」をもとに、ものである「オブジェクト」を作ることができます。これが「クラス」と「オブジェクト」の関係です。

ここで、たろうに性別や年齢を加えたい場合は、人間クラスを(名前,出身,性別,年齢)という設計図にすればいいわけです。

クラスの作り方

ここからは、実際にコード書いてクラスとオブジェクトの理解をさらに深めていきましょう。

まずクラスの作り方についてです。試しにUserクラスを作ってみましょう。user.rbというファイルを作成して、以下のように記述します。

class User 
end

これだけでUserクラスの完成です。簡単!

オブジェクトの作り方

irb(書いたプログラムを実行できるコマンド)を開いて、先ほどのUserクラスを使って、オブジェクトを作っていきます。

> require './user.rb' #user.rbのコードを読み込むコマンド
>Michael = User.new

User.newを使って、Michaelというオブジェクトを作ることができました。これまた簡単!

オブジェクトから、原型となるクラスを確認する方法

全てのオブジェクトはその元となるクラスを持っています。つまりMichaelはUserクラスを持っているはず。それが本当かどうか確認します。

>Michael.class
=>User

classというメソッドを使って、オブジェクトが持つクラスを確認することができます。エラーが出たとき「このオブジェクト、何のクラスを持ってるんだっけ?」となりがちなので覚えておきましょう。

(補足)いまはUserクラスに設計図(名前,出身など)が何も書かれていません。今回の記事は「クラス」と「オブジェクト」の関係について理解する記事なので、設計図の書き方は省略です。また記事にしたいと思います。

まとめ

「クラス」と「オブジェクト」の関係について理解が深まったでしょうか。なんとなくの理解でプログラミング学習を進めてしまいがちですが、少しずつ理解を深めながら、Ruby勉強を進めていきましょう。

この記事の説明がわかりやすかった!ここ間違ってるよ!次こんな記事を書いて欲しい!などあれば、ぜひコメント、DMよろしくお願いします。

Twitterもやってますので、フォローしていただけたらうれしいです。 卓球、心理学、哲学、Webサービス、好きな音楽、カメラ、登山、ランニング、読んだ本などなんでもつぶやいてます。

twitter.com

gem gretelの使い方 ~パンくずリストを作ってみよう~

gem 'gretel'

このgemを使って、パンくずリストを作っていこうと思います。

パンくずリストってなんぞや??

Image from Gyazo

ホームページのすみっこで見られる、ページの階層ですね。Webサイト内で、どの位置にいるのかがわかる機能です。

「ユーザー」を押すとユーザーページへ、「ホーム」を押すと最初のページへ飛ぶことができます。(ハンバーガーメニューとかパンくずリストとか、プログラミングの世界は、遊び心があって良いですよね。)

gem 'gretel'を使う

こちらのGithubのREADMEをご覧ください↓↓

github.com

gem 'gretel'をbundle installしたあと、

$ rails generate gretel:install

こちらのgenerateコマンドを使って、config配下にbreadcrumb.rbというファイルが生成されます。

それではbreadcrumb.rbに作りたいパンくずリストの設定を記述していきます。

breadcrumb.rbにパンくずリストの設定を記述

Image from Gyazo

先ほどのリストを試しに作っていきます。

#breadcrumb.rb

crumb :dashboard do
  link ' Home', dashboard_path
end

crumb :users do
  link 'ユーザー', users_path
  parent :dashboard
end

crumb :user do |user|
  link 'プロフィール', user_path(user)
  parent :users
end

上記のような記述になります。書き方としては、

crumb :"シンボル名" do
  link 'パンクズに表示したい名前', URL
  parent :"一つ上の階層名"
end

このように当てはめていきます。parentは一つ上の階層がなければ(今回ならHome)記述しなくてOKです。

breadcrumb.rbの設定をこれで完了です。

viewファイルに記述していく

それぞれのviewファイルにbreadcrumbを記述していきます。

#Homeのviewファイル
<% breadcrumb :dashboard %>
#ユーザーのviewファイル
<% breadcrumb :users %>
#プロフィールのviewファイル
<% breadcrumb :users, @user %>

プロフィールのviewファイルで気をつけることは、

breadcrumb.rbにもあるように、プロフィールページはuser_path(user)というURLに飛ぶので、どのidのURLに飛んで欲しいのか(今回なら@user)を記述しないとエラーが出てしまいます。

あとはCSSなどで、ページの好きな位置にパンくずを表示すればOKです。とても簡単。。!

パンくずリストはヘッダーの下などに記述することが多いかと思いますので、部分テンプレートに分けておくのが便利かと思います。

gem gretelを使って、パンくずリストを作ってみよう

Image from Gyazo

一見むずかしそうな機能が、とても簡単に作れることが分かったと思います。

便利なgemを駆使しながら、より使いやすいRailsアプリケーションを作っていきましょう!

form_withを使って、ユーザーが新規作成される仕組みを理解する

webサービスで新規登録やユーザログインのときに使われる、form_withというヘルパーメソッド。

Railsチュートリアルなどで突然登場して、なんとなく使い方が分かってるけど説明はできない「曖昧状態」になっていませんか。

ぼくもまさにそのひとり。

今回は、form_withを使って、ユーザーが新規作成される仕組みを理解する記事を書いていこうと思います!

そもそも「フォーム」とは?

  • nameとvalueがペアになってサーバに送られる

  • nameとvalueはinputやselectやradioなどに付与される

  • action属性に指定されたURLに対して入力値が送られる

引用記事: https://qiita.com/DaichiSaito/items/cd66115569b0a75f1bfa#11-%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0%E3%81%A8%E3%81%AF%E3%81%8C%E6%9B%96%E6%98%A7

この3つをはじめてみたとき???という感じでした。

例を挙げて説明してみます。

railsチュートリアルから以下のコードを引っ張ってきました。

<%= form_with(model: @user, local: true do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.submit "Create" %>
    <% end %>

これがHTMLソースに変換されると

<form accept-charset="UTF-8" action="/users" class="new_user"
      id="new_user" method="post">
  
  <label for="user_name">Name</label>
  <input id="user_name" name="user[name]" type="text" />

  <input  name="commit" type="submit"
         value="Create" />
</form>

※local: trueとは? local: trueがない場合、Rails5ではAjaxによる送信という意味になる。 HTMLとしてフォームを送信する場合にlocal: trueが必要になります。

例えば、フォームの名前に「たろう」と入力されると

  <input id="user_name" name="user[name]" type="text" value="たろう" />

このようになります。

そしてformタグのaction属性に指定されたURL("/users" )に対して、nameとvalueが送られます。

コントローラ

    @user = User.new(params[:user])

params[:user]というのは、送られてきたnameに対応しています。今回であればname="user[name]" value="たろう"が送られてきているので、@userというインスタンスにname:"たろう"が格納されます。

form_withのしていること

<%= form_with(model: @user, local: true do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>

整理すると、

  • model: @user・・・入力値を格納するインスタンスとaction属性を指定("/users")

  • local: true・・・HTMLとしてフォームを送信する場合にlocal: true必要

  • <%= f.label :name %>・・・フォームのラベルを決めている

  • <%= f.text_field :name %>・・・HTMLに変換されるとname="user[name]" type="text"になる

何が起きているかわからないとなってしまうform_withですが、 HTMLコードに分解して考えると、理解しやすいですね。 ブラウザの開発者ツールからHTMLソースを見る癖をつけていきましょう。

gem draperを使用して、decoratorを導入する方法

目的

gem draperを使用して、decoratorを導入する。 このGemを導入するときに詰まった部分をメモとして残す。

開発環境

Ruby 2.6.4 ・Rails 5.2.3

参考資料

Decoratorの役割とDraperについて Draperの使い方 まとめ Rails Viewの表示のためにDecoratorを用意してHelperとModelを助ける

導入手順

①gem 'draper'をインストールする。

まずはGemをインストールします。

gem 'draper'

以下の2行をターミナルに入力すれば、draperを使うことができます。

$ bundle install
$ rails generate draper:install

②デコレーターを作成

まず、app/decorators/user_decorator.rb を作成します。

$ rails generate decorator User

今回はフルネームを呼び出すメソッドを作っていきます。 last_nameとfirst_nameは、事前にUserモデルのカラムに追加してあります。

class UserDecorator < Draper::Decorator
  delegate_all

  def full_name
    "#{object.last_name} #{object.first_name}"
  end
end

③ 作ったメソッドをViewファイルで呼び出す。

現在ログインしているユーザー(current_user)をフルネームで表示します。

#メソッドを使いたいViewファイルにて

<%= current_user.decorate.full_name %>

以上の手順でgem 'draper'を使って、decoratorを導入できました。 この流れでエラーが出てしまった場合は、参考資料など見ながら解決してみてください。

日本語対応のためのGem 'rails-i18n'の使い方

目的

Gem 'rails-i18n'を使って、日本語対応させること。 このGemを導入するときに詰まった部分をメモとして残す。

開発環境

Ruby 2.6.4 ・Rails 5.2.3

参考資料

Rails 国際化 (i18n) API

Railsのi18nによる日本語化対応

[I18n::InvalidLocaleData ロケールファイルを翻訳できない] (https://qiita.com/niwa1903/items/10154b8cbe1cd0416495)

導入手順

①gem 'rails-i18n'をインストールする。

gem 'rails-i18n', '~> 5.1'
$ bundle install

RailsのGemをインストールするときの、いつもの流れです。

②デフォルトの言語を日本語に設定する。そしてi18nの複数ロケールファイルが読み込まれるようpathを通す。

module App
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2

    # 2行追記:デフォルトのlocaleを日本語(:ja)にする.
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  end
end

モジュールの中に2行追記してください。この記述がないと、Gemをインストールしても日本語対応してくれないようです。

③localesフォルダの中にja.ymlファイルを作る

・modelの日本語対応

ja:
    activerecord:
     models:
       user: 'ユーザー'
       board: '掲示板'
     attributes:
       user:
         email: 'メールアドレス'
         password: 'パスワード'
         password_confirmation: 'パスワード確認'
         last_name: '姓'
         first_name: '名'

model全体に対応させるときはmodelsの階層を作り、 カラム名を対応させるときはattributesの階層を作ります。

・view,controllerの日本語対応

ja:
   users:
     new:
       title: 'ユーザー登録'
       to_login_page: 'ログインページへ'
     create:
      success: 'ユーザー登録が完了しました'
      fail: 'ユーザー登録に失敗しました'

view/ja.ymlに記述することで、controllerにも適応されます。 ただ、インデントをきっちり2つずつにして階層構造を作らないと、日本語適用されないよう。

ja.ymlの書き方については、以下のRailsガイドの記事が参考になります。 探索の「遅延」(lazy lookup)

④viewやcontrollerで、設定した日本語を表示させる

ja:
  books:
    index:
      title: "ほげほげ"

上記のような階層構造になっていれば、以下のようにして、app/views/books/index.html.erbビューテンプレート内部でbooks.index.title値にアクセスできます。

<%= t '.title' %>  または  <%= t ('.title') %>

省略せずに書くと以下になります。

<%= t 'books.index.title' %>

これでGem 'rails-i18n'を使って、日本語対応できるはずです!

Githubにpushしても、contributionsに反映されない時の対処法

ローカル環境からGithubにcommit、pushできても、contributionsに反映されない。。。

いわゆる草が生えないっていうやつです。

自分もこの問題にぶち当たったので解決策を書いておきます。

参考資料 https://findy-code.io/engineer-lab/github-contributions-rule

ローカル環境でのgitに、GitHubアカウントでのメールアドレスが追加する必要がある

だいたいの人が、メールアドレスが追加されていなかったり、一致してなかったりして、contributionsに反映されないようです。メールを確認する方法は以下です。

$ git config --global user.email

このコマンドでローカル環境でのgitに登録されているメールアドレスが確認できます。このとき、何も表示されていない場合はGitにメールアドレスが登録されていないです。

GitHubアカウントでのcommitから、メールを確認する方法

Githubのcommitからも、メールが登録されているか確認できます。

手順は ①リポジトリのコミットを確認できるページにアクセス。確認したいコミットをクリック。 ②その飛んだURLの一番後ろに「.patch」をつける ③ページ一番上の「From」の部分を確認します。設定できていればメールアドレスが表示されます。

ローカル環境でのgitに、GitHubアカウントでのメールアドレスが追加する方法

設定ができていない人はターミナルから下記のコマンドで設定ができます。

git config –-global user.email “email@example.com“

このコマンドでメールアドレスを追加後に、再度commit、pushして見てください。contributionsに反映されるはずです。また、リポジトリのコミットを確認できるページでもcommitしたアカウントが変更されているはずです。

以上参考になれば幸いです。