Help us understand the problem. What is going on with this article?

Gitコマンド〜SSH接続でリモートリポジトリにプッシュしてマージするまで〜

コマンドでコミットしたりラジバンダリ

これまで、一応gitを使っていたが、UI(TortoiseGitとかGitHubDectopとか)かつローカルでの管理だけだったので、Railsチュートリアルを通じて、コマンドかつより実践的なgit管理をできるようになろうと思う。

環境

OS: macOS Mojave
仮想環境: VirtualBox(CentOS)

初回のみ

gitインストール後1台のPCにつき1回だけ下記コマンドで設定を行う。

ターミナル
$ git config --global user.name "Your Name"
$ git config --global user.email your.email@example.com

コミットまで

git init

今度は、リポジトリごとに作成の必要な作業を行う。まず、Railsアプリケーションのルートディレクトリに移動し、新しいリポジトリの初期化を行う。

ターミナル
$ git init

git add -A

次にgit add -Aを実行し、プロジェクトのファイルをリポジトリに追加。

ターミナル
$ git add -A

このコマンドを実行すると、現在のディレクトリにあるファイルがすべて追加される。ただし、.gitignoreに記載されているパターンにファイル名がマッチする場合、そのファイルは追加されない。

git status

Gitにプロジェクトのファイルを追加すると、最初はステージング (Staging) という一種の待機用リポジトリに置かれ、コミットを待つ。安全のため、いきなりコミットしないようになっているの。ステージングの状態を知るにはstatusコマンドを使う。

ターミナル
$ git status

git commit

ステージングエリアで控えている変更を本格的にリポジトリに反映 (コミット) するには、commitコマンドを使う。

ターミナル
$ git commit -m "Initialize repository"

-mフラグを使うと、コミットメッセージをコマンドラインで直接指定できる。-mフラグを使わない場合はシステムのデフォルトのエディタが開き、そこでコミットメッセージを入力する 。
Gitにおけるコミットは、あくまでローカルマシン上での操作であることに注意。git pushコマンドで変更をリモートリポジトリにプッシュする方法については後ほど解説。

log

ちなみに、logコマンドでコミットメッセージの履歴を参照できる。

$ git log

ログがある程度以上長い場合は、qキーを押して終了。

誤ってディレクトリを削除してしまった場合

app/controllers/ディレクトリを削除してしまった

ターミナル
[vagrant@localhost hello_app]$ ls app/controllers/
application_controller.rb  concerns
[vagrant@localhost hello_app]$ rm -rf app/controllers/
[vagrant@localhost hello_app]$ ls app/controllers/
ls: cannot access app/controllers/: そのようなファイルやディレクトリはありません

Unixコマンドのlsでapp/controllers/ディレクトリの中身を表示した後、rmコマンドをうっかり実行してしまい、このディレクトリを削除してしまったとする。なお、ここで使っている-rfフラグは、「recursive」(サブディレクトリやその中のファイルもすべて削除する) と「force」(削除して良いかどうかをユーザーに確認しない) を指定するオプション。

現在の状態を確認。

ターミナル
[vagrant@localhost hello_app]$ git status
# On branch master
# Changed but not updated:
#   (use "git add/rm <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   deleted:    app/controllers/application_controller.rb
#   deleted:    app/controllers/concerns/.keep
#
no changes added to commit (use "git add" and/or "git commit -a")

ファイルがいくつか削除されたが、この変更が行われたのは現在の「作業ツリー」内のみなので、まだコミット (保存) されていない。つまり、以前のコミットをcheckoutコマンド (と、現在までの変更を強制的に上書きして元に戻すための-fフラグ) でチェックアウトすれば、簡単に削除前の状態に戻すことができる。

ターミナル
[vagrant@localhost hello_app]$ git checkout -f
[vagrant@localhost hello_app]$ git status
# On branch master
nothing to commit (working directory clean)
[vagrant@localhost hello_app]$ ls app/controllers/
application_controller.rb  concerns

削除されたディレクトリとファイルを無事復旧。

リモートリポジトリにプッシュする前に

Railsチュートリアルでは、Bitbucketを使っているが、Railsチュートリアルにも記載の通り、2019年1月よりGithubでも非公開リポジトリ(Private)を無料プランで作成できるようになっているので、流行りのGithubを使う。

SSH(Secure Shell)

SSHとは、セキュアな通信を行うためのプロトコル

SShを使うことにより、リモートサーバに安全にログインできたり、ファイルをセキュアに送受信することができる。SSHのログイン認証には"パスワード認証"と"公開鍵認証"がある。

公開鍵・秘密鍵を作成

ターミナル
$ ssh-keygen

詳しくはこちら

githubでリポジトリ作成

Privateを選択しREADMEはチェックを入れない
image.png

公開鍵をGithubにアップ

下記コマンドで出力された公開鍵をgithubにアップ。

ターミナル
$ cat ~/.ssh/id_rsa.pub

https://github.com/settings/keys

プッシュ

ターミナル
$ git remote add origin git@bitbucket.org:ユーザー名/hello_app.git
$ git push -u origin --all

リポジトリをプッシュするときに「Are you sure you want to continue connecting (yes/no)?」と表示されることがある、そのときは「yes」と入力。

image.png
できた。

Branch (ブランチ)

Gitは、ブランチ (branch) を極めて簡単かつ高速に作成することができる。ブランチは基本的にはリポジトリのコピーで、ブランチ上では元のファイルを触らずに新しいコードを書くなど、自由に変更や実験を試すことができる。通常、親リポジトリはmasterブランチと呼ばれ、トピックブランチ (短期間だけ使う一時的なブランチ) はcheckoutと-bフラグを使って作成できる。

リポジトリとは、ファイルやディレクトリの状態を記録する場所

ターミナル
$ git checkout -b modify-README
Switched to a new branch 'modify-README'
$ git branch
  master
* modify-README

2つ目のコマンド (git branch) は、すべてのローカルブランチを一覧表示する。「*」はそのブランチが現在使用中であることを表す。1番目のgit checkout -b modify-READMEコマンドで、ブランチの新規作成とそのブランチへの切り替えが同時に行われている。masterブランチはトピックブランチで行った変更に影響されないため、たとえブランチ上のコードがめちゃくちゃになってしまっても、masterブランチをチェックアウトしてトピックブランチを削除すれば、いつでも変更を破棄する事ができる。

トピックブランチ

トピックブランチとは、機能追加やバグ修正といったある課題に関する作業を行うために作成するブランチ

Edit (編集)

トピックブランチを作ったら、ローカルでREADE.mdを開き編集。

README.md
# Ruby on Rails Tutorial

## "hello, world!"

This is the first application for the
[*Ruby on Rails Tutorial*](https://railstutorial.jp/)
by [Michael Hartl](http://www.michaelhartl.com/). Hello, world!

Commit (コミット)

まずは、ブランチの状態を確認。

ターミナル
$ git status
# On branch modify-README
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   README.md
#
no changes added to commit (use "git add" and/or "git commit -a")

この時点で、git add -Aを実行することもできるが、git commitには現存するすべてのファイル (git mvで作成したファイルも含む) への変更を一括でコミットする-aフラグがあります。

  • git add -A 現在のディレクトリのすべてのファイルを追加
  • git commit -a 現存するすべてのファイル (git mvで作成したファイルも含む) への変更を一括でコミット
ターミナル
$ git commit -a -m "Improve the README file"

最後のコミット後に新しいファイルを追加した場合は、まずgit addを実行してバージョン管理下に置く必要がある。

Merge (マージ)
masterブランチにこの変更をマージ (merge) する。

ターミナル
$ git checkout master
Switched to branch 'master'
$ git merge modify-README

変更をマージした後は、git branch -dを実行してトピックブランチを削除すれば終わり

ターミナル
$ git branch -d modify-README

Push (プッシュ)

既に一度プッシュを行ったので、大抵のシステムではgit pushを実行するときにorigin masterを省略できる。

ターミナル
$ git push

image.png
プッシュできた。

参考

Railsチュートリアル
.3 Git サーバー - SSH 公開鍵の作成
GitHubでssh接続する手順~公開鍵・秘密鍵の生成から~
SSHなるものをよくわからずに使っている人のための手引書

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away