Edited at

Gitの使い方メモ

学習履歴


■はじめに

自動デプロイ環境を作くろうと思って、Docker と Git を勉強し始めた。

ここでは、Git について備忘を残しておく。


■前提条件

GitHub に登録ずみ

Git インストール済み


■環境

OS: Mac

Editor: Atom


■Gitとは

Git は、ファイルのバージョン管理をするためのツールだ。

ファイルのバージョンを記録できれば、何時・誰が・何を変更したのか、管理することが可能になる。


■GitHubとは

GitHubとは、コードのホスティングサービスだ。

Git でファイルやファイルの変更履歴を管理するが、それをオンライン上で行えるようにできる。


■Atomエディタの自動起動

Git では、 git commit コマンドを押下すると指定したエディタが自動で立ち上げることができるが、Mac かつ Atom の場合は、エディタ側でも設定が必要だ。

Atom エディタを開いて、「command + shift + P」 でコマンドパレッドを開き、

「Window:Install Shell Commands」 を実行することで、terminal から

自動で立ち上がるようになる。


■Gitコマンド

先に学習したコマンドの一覧を以下に記載する。

コマンド名
役割

git init
ローカルリポジトリの作成

git clone <リポジトリ名>
Git リポジトリのコピーを作成

git add <ファイル名>
変更をステージに追加

git add <ディレクトリ名>
変更をステージに追加

git add .
変更をステージに追加

git commit
変更を記録(コミット)

git commit -m "メッセージ"
変更を記録(コミット)

git commit -v
変更を記録(コミット)

git status
現在の変更状況の確認

git diff <ファイル名>
git add する前の変更差分を確認

git diff --staged
git add した後の変更差分を確認

git log
変更差分の確認

git log --online
一行で表示

git log -p hoge.html
ファイルの変更差分を表示

git log -n <コミット数>
表示するコミット数を制限

git rm <ファイル名>
ファイルの削除を記録(ファイルごと削除)

git rm <ディレクトリ名>
ファイルの削除を記録(ファイルごと削除)

git rm --cached <ファイル名>
ファイルの削除を記録(ファイルを残す)

git mv <旧ファイル><新ファイル>
ファイルの移動を記録

git remote add origin <リモートリポジトリのURL>
リモートリポジトリ(GitHubを新規作成)

git push <リモート名> <ブランチ名>
リモートリポジトリへ送信

git config --global alias.ci commit
コマンドにエイリアスをつける

git config --global alias.st status
コマンドにエイリアスをつける

git config --global alias.br branch
コマンドにエイリアスをつける

git config --global alias.co checkout
コマンドにエイリアスをつける

.gitignoreファイル
管理しないファイルをGitの管理から外す(コマンドではない)

git checkout -- <ファイル名 or ディレクトリ名>
ファイルへの変更を取り消す

git checkout -- .
全変更を取り消す

git reset HEAD <ファイル名 or ディレクトリ名>
ステージに追加した変更を取り消す

git reset HEAD .
全変更を取り消す

git commit --amend
直前のコミットをやり直す

git remote
リモートの表示

git remote -v
対応するURLを表示

git remote add <リモート名> <リモートURL>
リモートリポジトリを新規追加

git feach <リモート名>
リモートから情報を取得(フェッチ)

git pull <リモート名><ブランチ名 or git pull>
リモートから情報を取得してマージ(プル)

git remote show  <リモート名>
リモートの詳細情報を表示

git remote rename <旧リモート名><新リモート名>
リモート名を変更

git remote rm <リモート名>
リモートを削除

git branch <ブランチ名>
ブランチを新規作成

git branch
ブランチの一覧を表示(-a をつけると全ブランチを表示)

git checkout <既存ブランチ名>
ブランチを切り替える

git merge <ブランチ名> or <リモート名/ブランチ名>
変更履歴をマージ

git branch -m <ブランチ名>
ブランチ名を変更

git branch 0d <ブランチ名>
ブランチを削除

git rebase <ブランチ名>
履歴を整えた形で、変更を統合

git pull --rebase <リモート名> <ブランチ名>
マージコミットを残さずGitHubの情報を取得

git rebase -i <コミットID(HEAD~3)>
複数のコミットをやり直す

git rebase i- HEAD~3
コミットの並び替え、削除、分割、まとめる

git tag
タグの一覧を表示

git tag -a [タグ名] -m "[メッセージ]"
タグを作成(注釈付き)

git tag [タグ名]
タグを作成(軽量番タグ)

git tag [タグ名][コミット名]
後からタグ付けをする

git show [タグ名]
タグのデータを表示

git push [ブランチ名][タグ名]
タグをリモートリポジトリ(GitHub)へ送信

git stash
作業を一時避難する

git stash list
避難した作業を確認

git stash apply
最新の作業を復元

git stash apply --index
ステージの状況も復元

git stash apply [スタッシュ名]
特定の作業を復元

git stash drop
最新の作業を削除

git stash drop [スタッシュ名]
特定の作業を削除

git stash clear
全作業を削除


■Gitのバージョン確認

Git がインストールされているか確認しよう。

$ git version

git version 2.14.3 (Apple Git-98)

バージョンが出てきたら Git は既にインストールされている。

(Mac では、デフォルトでインストールされているらしい)


■Git の初期設定

ターミナル上から GitHub を登録する。

# --global オプションをつけることで、どのディレクトリにいても共通の設定にできる

# ユーザ名登録
$ git config --global user.name "githubに登録したユーザー名"

#メールアドレス登録
$ git config --global user.email "メールアドレス"

# エディタを登録(ここでは、Atom)
$git config --global core.editor "atom --wait"

# 登録確認(個別)
$ git config user.name
$ git config user.email
$ git config core.editor

# 登録確認(リスト)
$ git config --list

# Gitのコンフィグファイルは、ホームディレクトリ配下に格納されている
$cat ~/.gitconfig


■Gitの利用の流れ

Git の利用の流れは、以下のようになる。

<Gitの利用の流れ(自分がアップロードする場合)>

1. ワークツリー内でファイルを編集する

2. ステージに変更を記録する

3. ローカルリポジトリにアップ

4. リモートリポジトリ(GitHub)にアップロードする

<Gitの利用の流れ(他人のファイルをダウンロードする場合)>

1. リモートレポジトリ(GitHub)からファイルをダウンロード

2. ローカルレポジトリにアップ

3. ワークツリーに記録を反映

用語
意味

ワークツリー
ファイルを編集する作業場のディレクトリ

ステージ
コミット(スナップショットを記録)する変更を準備する領域

ローカルリポジトリ
スナップショットを記録する自分のPCの履歴データ領域

リモートリポジトリ(GitHub)
オンライン上の履歴データ領域


■ローカルレポジトリ作成

Git によるバージョン管理を始めよう。

まずは、ローカルリポジトリを作成する必要がある。

# 作業ディレクトリを作成

$ mkdir git_study
$ cd git_study

# ローカルリポジトリ作成
$ git init

$ls -a
.git #{隠れフォルダ}

$ls .git/
HEAD config hooks objects
branches description info refs

.git ディレクトには、Git に必要なほとんどのファイルがほとんど含まれている。


■GitHub上にあるプロジェクトからGitを開始する

他の人が作成しているプロジェクトから Git を開始する流れを見ていこう。

ここでは、 Atom を例にする。

GitHub 上の Atom のページから URL を取得する。

取得したら練習用のディレクトリを作成して、atom のリポジトリを取得しよう。

# テスト用のディレクトリを作成

$ mkdir git_atom_study
$ cd git_atom_study
# atomのリポジトリを取得
$ git clone https://github.com/atom/atom.git


■ステージに追加

ステージは、ローカルリポジトリへファイルを送信する準備をするための領域だ。

<Gitの流れ>

ワークツリー -> ステージ -> ローカルリポジトリ ----internet---- > リモートリポジトリ(GitHub)

そのため、必ずステージにファイルを追加する必要がある。

ステージに記録したい内容だけアップロードすることで、ローカルリポジトリに反映するファイルに不要なファイルが混じらないようにすることができる。

変更したファイルをステージに追加するには、以下のコマンドを使用しよう。


ステージ.追加コマンド

$ git add <file name>

$ git add <dir name>
$ git add . #{ワークツリーの内容全て追加}

$ cd git_study

$ vim index.html
<h1>Git チュートリアル</h1>

# ステージに追加する
$ git add .


■ステージに記録した内容をローカルリポジトリに反映

ステージに追加したら次は、ローカルリポジトリに反映する。

$ git commit

$ git commit -m "<message>"
$ git commit -v

# コミット

$ git commit

# Atom エディタが自動で立ち上がる
メッセージを打ち込んでセーブし、Atom エディタを閉じる


■Gitの状況を確認する方法

コミットやステージに追加する前にどのファイルが変更されたかを確認する必要がある。

# 何の変更もないとき

$ git status
On branch master
nothing to commit, working tree clean

# index.html ファイルに変更を加える
$vim index.html
<h1>Git チュートリアル</h1>
<p>git status</p>

# 再び、ステータスを表示
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")

# index.htmlをステージに追加
$ git add index.html

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: index.html

$ git commit
git status コマンドを追記

$ git status
On branch master
nothing to commit, working tree clean


■変更履歴の確認

Git の変更履歴を確認することもできる。

$ git log

# 一行で表示
$ git log --oneline

# ファイルの変更差分を表示
$ git log -p index.html

# 表示するコミット数を制限
$ git log -n <コミット数>

$ git log
commit 7e90e9cd369693435737152c55a0dde232444473 (HEAD -> master)
Author: hogehoge
Date: Mon Apr 16 06:06:14 2018 +0900

git status コマンドを追記

commit fe883edf1e07750e6d1ceea8570d50f42f9aad23
Author: hogehoge
Date: Mon Apr 16 06:06:14 2018 +0900

Inital commit


■変更差分を確認

# git add する前の変更差分

$ git diff
$ git diff <ファイル名>

# git add した後の変更差分
$ git diff --staged

# index.htmlファイルを編集

$ vim index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>

# git addする前の変更差分を確認
$ git diff
diff --git a/index.html b/index.html
index 583b238..8c079bb 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,3 @@
<h1>Git チュートリアル</h1>
<p>git status</p>
+<p>git diff</p>

# ステージに追加
$git add index.html

# ステージとコミットのの変更差分を確認
$ git diff --staged
diff --git a/index.html b/index.html
index 583b238..8c079bb 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,3 @@
<h1>Git チュートリアル</h1>
<p>git status</p>
+<p>git diff</p>


■ファイルの削除を記録

ファイルの削除を記録することができる。

# ファイルごと削除

$ git rm <ファイル名>
$ git rm -i <ディレクトリ名>

# ファイルを残したいとき
$ git rm --cached <ファイル名>

# index.htmlファイルを削除する

$ git rm index.html
rm 'index.html'

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

deleted: index.html

# ファイルを元に戻す
$ git reset HEAD index.html
Unstaged changes after reset:
D index.html

$ git checkout index.html

# リポジトリから削除するが、ワークツリー上で、ファイルを残す
# git rm --cached index.html
rm 'index.html'

$ ls
index.html

$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

deleted: index.html

Untracked files:
(use "git add <file>..." to include in what will be committed)

index.html

# 元に戻す
$ git reset HEAD index.html


■ファイルの移動を記録

Git では、ファイルの移動も記録できる

$ git mv <旧ファイル> <新ファイル>

# 以下のコマンドと同じ
$ mv <旧ファイル> <新ファイル>
$ git rm <旧ファイル>
$ git add <新ファイル>

# 事前確認

$ ls
index.html
$ git status
On branch master
nothing to commit, working tree clean

# index2.htmlとファイル名を変更する
$ git mv index.html index2.html
$ ls
index2.html
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

renamed: index.html -> index2.html

# 元に戻す
$ git mv index2.html index.html
$ ls
index.html
$ git status
On branch master
nothing to commit, working tree clean


■GitHubにプッシュ

ローカルのリポジトリ情報をオンライン上のGitHubにアップすることをプッシュと呼ぶ。

# リモートリポジトリ(GitHub)を新規追加する

# originというショートカットで、urlのリモートリポジトリを登録する {urlは都度書き換えが必要}
$ git remote add orgin https://github.com/user/repo.git

# リモートリポジトリ(GitHub)へ送信する
$ git push <リモート名> <ブランチ名>
$ git push origin master

GitHub 上にアップするために、テスト用にリポジトリを作成しよう。

まずは、GitHub の自分のページに移動する。

移動したら、「Repositories」 タブを押下し、「New」 をクリックする。

以下のように設定し、リポジトリを作成する。

リポジトリの作成に成功したら、遷移先のページで、リポジトリの URL が取得できる。

$ リモートリポジトリを登録する

$ git remote add origin https://github.com/hogehoge/git_study.git

# リモートリポジトリにプッシュする(-uは、次回以降git pushのみのコマンドでリモートリポジトリにアップできるようにするためのオプション)
$ git push -u origin master

リモートリポジトリを確認すると問題なくプッシュできていることがわかる。


■エイリアス設定

Git のコマンドにエイリアスを設定することで、入力を楽にすることができる。

# エイリアスを設定

$ git config --global alias.ci commit
$ git config --global alias.st status
$ git config --global alias.br branch
$ git config --global alias.co checkout

# 次回から以下のコマンドで実行できる
$ git ci
$ git st
$ git br
$ git co


■Gitのバージョン管理からファイルを外す

Git でファイルを管理したくないファイルを除外する方法をみていこう。

※パスワードが記載されたファイルなど

.gitignore ファイルに指定すれば、管理から外せる。

#.gitignoreファイルの書き方

# # から始まる行はコメント

# 指定したファイルを除外
index.html

# ルートディレクトりを指定
/root.html

# ディレクトリ以下を除外
dir/

# /以外の文字列にマッチ「*」
/*/*.css

# 空ファイルを作成する

$ touch secret.txt
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
(use "git add <file>..." to include in what will be committed)

secret.txt

# .gitignoreファイルを作成し、secret.txtと書き込む
$ vim .gitignore
secret.txt

# バージョンファイルから外せたか確認
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

Untracked files:
(use "git add <file>..." to include in what will be committed)

.gitignore

nothing added to commit but untracked files present (use "git add" to track)

$ git add .
$ git commit
.gitignore ファイルを追加


■ファイルへの変更を元に戻す方法

ファイルへの変更を元に戻すことができる。

$ git checkout -- <ファイル名>

$ git checkout -- <ディレクトリ名>

# 全変更を取り消す(-- をつけるとブランチ名とファイル名がかぶった時、どちらを指しているかGitが判断できるようにするため)
# .(ピリオドは、任意のファイル全て)
$ git checkout -- .

$ vim index.html

<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git checkout</p> # 追記

$ git status
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")

$ git checkout -- index.html
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

nothing to commit, working tree clean

$ cat index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>


■ステージに追加した変更を取り消す

ステージに追加した変更も取り消せる。

# ステージ取り消し

$ git reset HEAD <ファイル名>
$ git reset HEAD <ディレクト名>

# 全変更を取り消す
$ git reset HEAD .
*これらのファイルはステージの変更を取り消すだけなのでワークツリー上のファイルは変更前に戻せない

$ vim index.html

<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git reset</p>

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")

$ git diff
diff --git a/index.html b/index.html
index 8c079bb..a98a054 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,4 @@
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
+<p>git reset</p>

# ステージに追加
$ git add .
$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: index.html

# ステージを追加前の状態に戻す
$ git reset HEAD index.html
Unstaged changes after reset:
M index.html

$ git status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")

# ワークツリーのファイルの状態を変更前に戻す
$ git checkout -- index.html

$ cat index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>


■直前のコミットをやり直す

直前のコミットを修正することができる。

# 直前のコミットをやり直す(ただし、リモートリポジトリにコミットしたものに対しては使用してはいけない)

$ git commit --amend

# index.htmlファイルを変更する

$ vim index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit</p>

# ステージに追加する
$ git add .

# ローカルリポジトリに追加する
$ git commit
git commmit --amend を追記

# ファイルを修正する
$ vim index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>

$ git add .
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)

Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: index.html

# コミットをやり直す
$ git commit --amend

# コマンドの結果を確認
$ git log -p -n 1
diff --git a/index.html b/index.html
index 8c079bb..9180f0e 100644
--- a/index.html
+++ b/index.html
@@ -1,3 +1,4 @@
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
+<p>git commit --ammend</p>

# リモートリポジトリにプッシュ
$ git push origin master


■リモートリポジトリ(GitHub)の情報を確認する

リモートリポジトリ(GitHub)を表示することができる。

$ git remote

# 対応する URL を表示
$ git remote -v

$ git remote

origin

$ git remote -v
origin https://github.com/hogehoge/git_study.git (fetch)
origin https://github.com/hogehoge/git_study.git (push)


■リモートリポジトリを追加する

リモートリポジトリは、複数登録することができる。

$ git remote add <リモート名> <リモートURL>

# tutorialという名前で登録
$ git remote add tutorial https:XXXXXXXXX

origin を作成した時と同じ方法で、GitHub上で、新規に 「git_study_bak」 というリポジトリを作成後、

リポジトリを登録してみよう。

# git_study_bakリポジトリ作成後、以下のコマンドで登録

$ git remote add bak https://github.com/hogehoge/git_study_bak.git

$ git remote
bak
origin

$ git remote -v
bak https://github.com/hogehoge/git_study_bak.git (fetch)
bak https://github.com/hogehoge/git_study_bak.git (push)
origin https://github.com/hogehoge/git_study.git (fetch)
origin https://github.com/hogehoge/git_study.git (push)

# bak でプッシュする
$ git push -u bak master


■フェッチ(GitHubから情報取得)

リモートから情報を取ってくる方法は 2 種類あって、そのうちの一つがフェッチだ。

# フェッチは取ってくるという意味

$ git fetch <リモート名>
$ git fetch origin

フェッチコマンドを実行するとリモートリポジトリから対象の情報を取得し、ローカルリポジトリの

「remotes/リモート/ブランチ」 配下に保存される。

そして、ローカルリポジトリからワークツリーに情報を反映したい場合は、git merge コマンドを使用する。

挙動を確認するために、GitHub 上に新規ファイルを作成しよう。

# フェッチする

$ git fetch origin

# フェッチした情報の格納場所を確認
$ git branch -a
* master
remotes/bak/master
remotes/origin/master

# ワークツリーを切り替える(情報は、ローカルリポジトリ上にあるため)
$ git checkout remotes/origin/master

# ワークツリーの情報を確認
$ ls 
home.html index.html secret.txt

$ cat home.html
home

# ワークツリーを切り替える(元に戻す)
$ git checkout master

$ ls
index.html secret.txt

# ローカルリポジトリの情報をワークツリーに反映させる
$ git merge origin/master

$ ls 
home.html index.html secret.txt


■プル(GitHubから情報取得)

リモートから情報を取ってくる方法のもう一つは、プルだ。

プルを行なった場合は、リモートから情報を取得してマージまで一度に行われる。

# git pull <リモート名> <ブランチ名>

$ git pull origin master

# 上記のコマンドは、省略可能
$ git pull

# 以下のコマンドと同じ
$ git fetch origin master
$ git merge origin master

挙動を確認するために、home.html の内容を書き換えて、それからプルしてみよう。

# プルする

$ git pull origin master
$ ls
home.html index.html secret.txt

$ cat home.html
<p>home</p>
<p>git pull</p>

ちなみに基本的には、フェッチを使う。

何故なら、プルを行うと自分が現在どのブランチにいるかに関わらず、プルしたリモートリポジトリの

情報をワークツリーに統合してしまうからだ。


■リモートリポジトリ(GitHub)の情報を詳しく知る

リモートリポジトリ(GitHub) の情報を詳しく確認したい時は、以下のコマンドを使う。

$ git remote show <リモート名>

$ git remote show origin

$ git remote show origin

* remote origin
Fetch URL: https://github.com/hogehoge/git_study.git
Push URL: https://github.com/hogehoge/git_study.git
HEAD branch: master
Remote branch:
master tracked
Local ref configured for 'git push':
master pushes to master (up to date)


■リモートリポジトリ名の変更と削除

リモートリポジトリ名の変更や削除を行うことができる。

# 変更する

$ git remote rename <旧リモート名> <新リモート名>
$ git remote rename git_study git_tutorial

# 削除する
$ git remote rm <リモート名>
$ git remote rm git_tutorial

# リモートリポジトリ情報を確認

$ git remote
bak
origin

# bak -> backupに変更
$ git remote rename bak bakup
$ git remote
bakup
origin

# bakupリモートリポジトリを削除
$ git remote rm bakup
$ git remote
origin


■ブランチ

新しいブランチを作成しよう。

# ブランチの新規作成(ブランチの切り替えまでは行わない)

$ git branch <ブランチ名>
$ git branch feature

# ブランチの一覧を表示
$ git branch

# 全てのブランチを表示する
$ git branch -a

# ブランチの表示

$ git branch
* master

# ブランチを作成
$ git branch feature

$ git branch
feature
* master

# ログを出力
$ git log --oneline --decorate
6768866 (HEAD -> master, origin/master, feature) Update home.html
40341ae Create home.html
3188d92 git commmit --amend を追記
be733cc .gitignore ファイルを追加
cdfb6e4 git diff を追記
7e90e9c git status コマンドを追記
fe883ed Inital commit


■ブランチの切り替え

ブランチを切り替える方法も知っておこう。

$ git checkout <ブランチ名>

$ git checkout feature

# ブランチを新規作成して切り替える(-b は、ブランチの作成と切り替えを一度にしてくれるオプション)
$ git checkout -b <新ブランチ名>

# masterブランチになっている

$ git branch
feature
* master

# featureブランチに切り替える
$ git checkout feature
Switched to branch 'feature'

$ git branch
* feature
master

# featureブランチで作業
$ vim feature.html
<p>branch</p>

$ git status
On branch feature
Untracked files:
(use "git add <file>..." to include in what will be committed)

feature.html

nothing added to commit but untracked files present (use "git add" to track)

$ git add .
$ git commit
[feature c5e033f] feature.html ファイルを新規追加

# feature.htmlファイルを確認
$ ls
feature.html home.html index.html secret.txt

# masterブランチに戻す
$ git checkout master
Switched to branch 'master'

# ディレクトリを確認
$ % ls
home.html index.html secret.txt

$ git branch
feature
* master

# ファイルを新規作成
$ vim master.html
<p>master</p>

$ git status
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)

master.html

nothing added to commit but untracked files present (use "git add" to track)

$ git add master.html
$ git commit
[master 13f5659] master.html ファイルを新規作成
1 file changed, 1 insertion(+)
create mode 100644 master.html

# GitHubにプッシュ
$ git push origin master

$ git checkout feature
$ git push origin feature

# masterブランチに戻しておく
$ git checkout master


■マージ

マージとは、他の人の変更内容を取り込む作業のことである。

$ git merge <ブランチ名>

$ git merge <リモート名/ブランチ名>
$ git merge origin/master

実際に試してみよう。

GitHub の自分のページから、「git_study」(任意の名前)リポジトリページを表示する。

次に適当なファイルを作成する。

筆者は、index.html ファイルを作成していて、 git merge という文言を追加した。

# GitHubの内容を取り込む

$ git pull origin master

$ cat index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>
<p>git merge</p>

$ git log --oneline
c963aac (HEAD -> master, origin/master) Update index.html ★
13f5659 master.html ファイルを新規作成
6768866 Update home.html
40341ae Create home.html

# featureブランチに切り替える
$ git checkout feature

# featureという文言を追加
$ vim feature.html
<p>branch</p>
<p>feature</p> ★

$ git add feature.html

# featureを追記と打ち込んで、コミット
$ git commit
feature を追記

# masterブランチに切り替える
$ git checkout master

# featureの内容を取り込む
$ git merge feature

$ ls
feature.html home.html index.html master.html secret.txt

$ cat feature.html
<p>branch</p>
<p>feature</p>

$ git log --oneline
2a622a1 (HEAD -> master) Merge branch 'feature'
08a7419 (feature) feature を追記
c963aac (origin/master) Update index.html


■コンフリクト

コンフリクトは、同じファイルに対して、異なる編集を行なった時に発生する。

以下は、コンフリクトした状態のファイル例を示す。

<h1>Git学習</h1>

<p>Gitを勉強して、エンジニアレベルをあげよう</p>
<<<<<<< HEAD
<p>コンフリクトを調べよう</p>
======
<p>git commit をしろう</p>
>>>>>>> feature

※ ------------------------
<<HEAD ~ == : HEAD の変更分
== ~ >> feature : feature の変更分

解決するには、以下の作業をする必要がある。

<コンフリクトの修正>

1. ファイルの内容を書き換える

2. 「<<」 「==」 「>>」 の記述を削除する。

単純に、不要な情報を消すだけだ。

最終的にはこんな感じにして、保存すればいい。

<h1>Git学習</h1>

<p>Gitを勉強して、エンジニアレベルをあげよう</p>
<p>コンフリクトを調べよう</p>
<p>git commit をしろう</p>

実際に試してみる。

# masterブランチのindex.htmlにコンフリクトという文字を追加

$ vim index.html
$ cat index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>
<p>git merge</p>
<p>コンフリクト</p>

$ git add index.html
$ git commit
コンフリクトを追記

# featureブランチに切り替える
$ git checkout feature
Switched to branch 'feature'

# featureブランチのindex.htmlファイルにconflict文字を追加
$ vim index.html
$ cat index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>
<p>conflict</p>

$ git add index.html
$ git commit
conflict を追記

# masterブランチに切り替える
$ git checkout master
Switched to branch 'master'

# feature ブランチをマージしようとして、コンフリクトが発生する
$ git merge feature
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

# コンフリクトしたファイルを確認
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)

Unmerged paths:
(use "git add <file>..." to mark resolution)

both modified: index.html

no changes added to commit (use "git add" and/or "git commit -a")

# index.html の中身
$ cat index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>
<<<<<<< HEAD
<p>git merge</p>
<p>コンフリクト</p>
=======
<p>conflict</p>
>>>>>>> feature

# コンフリクトを解決する(不要な部分を削除)。
$ vim index.html
$ cat index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>
<p>git merge</p>
<p>conflict</p>

$ git add index.html
$ git commit
Merge branch 'feature'

もし編集の途中で、グチャグチャになって訳が分からなくなり、ローカルの master ブランチを一旦削除し、

GitHub 上にある最新のリポジトリ情報を取って来たい場合は、以下のようにする。

# ローカルのmasterブランチを削除

$ git branch -D master

# GitHub上のリポジトリを取得(origin/mastergitの形でローカルリポジトリに保存)
$ git fetch

# masterブランチを新規作成
$ git branch master origin/master

# masterブランチを確認
# git branch
master


■ブランチ名の変更とブランチの削除

ブランチ名の変更やブランチを削除する方法を見ていこう。

# 自分が作業しているブランチの名前を変更(masterにマージされていない変更が残っている場合、削除しない)

$ git branch -m <ブランチ名>
$ git branch -m new_branch

# ブランチを削除
$ git branch -d <ブランチ名>
$ git branch -d feature

# 強制削除
$ git branch -D <ブランチ名>

# ブランチの状態を確認

$ git branch
feature
* master

# feature ブランチに切り替え
$ git checkout feature
Switched to branch 'feature'

# ブランチ名を変更
$ git branch -m new_feature

$ git branch
master
* new_feature

# master ブランチに切り替え
$ git checkout master
Switched to branch 'master'

# new_feature ブランチを削除
$ git branch -d new_feature
Deleted branch new_feature (was b27b4b3).

$ git branch
* master


■リモートブランチ

リモートリポジトリに存在するブランチは、git fetch コマンドで取得できる。

その際は、origin/hogehoge の形で保存される。

# 最新のリモートリポジトリの情報を取得

$ git fetch

# リモートブランチを確認
$ git branch -a
* master
remotes/origin/feature <- リモートブランチ
remotes/origin/master <- リモートブランチ


■Gitのブランチモデル

ここまで master ブランチや feature ブランチを作成してきたが、こういったブランチには

モデルというものがある。

Vincent Driessen さんが提唱した A successful Git branching model がそうだ。

ブランチ名
用途

master
リビジョンが常に最新の状態を保っているブランチ

develop
次のリリースへの変更が反映された状態のブランチ

feature
リリースの準備をしたり、バグの修正などを行うブランチ

release
リリース準備と次期開発のコードを分離するブランチ

hotfix
稼働中のソフトウェアに対する緊急の修正を行うブランチ

ブランチを使い分けることで、常に master や develop ブランチを安定化することができる。


■Gitを利用した開発の流れ

基本的に master ブランチをリリース用のブランチに、開発は個々にブランチを作成して進めるのが基本的な流れだ。

master ブランチをリリースされている最新の状態に保つ事を意識しよう。

理由は、最新の状態を常に確認できることとバグが起こった際に、切り戻しが容易だからだ。


1.プルリクエストの流れ

プルリクエストは、自分の変更したコードをリポジトリに取り込んでもらえるように依頼する機能だ。

(レビューするため)

<プルリクエストの流れ>

1. ワークツリー上で、master ブランチを最新の状態に更新

2. ブランチを作成

3. ファイルを変更

4. 変更をコミット

5. GitHub へプッシュ

6. プルリクエストを送る

7. チームメンバーによるコードレビュー

8. プルリクエストをマージ

9. ブランチを削除

実際に試してみる。

# masterがアクティブになっていることを確認

$ git branch
* master

# masterブランチを最新の状態にする
$ git pull origin master
From https://github.com/hogehoge/git_study
* branch master -> FETCH_HEAD
Already up-to-date.

# ステータスを確認
$ git status
On branch master
nothing to commit, working tree clean

# ブランチを作成する
$ git checkout -b pull_request
Switched to a new branch 'pull_request'

# index.html ファイルを変更
$ vim index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>
<p>git merge</p>
<p>conflict</p>
<p>pull request</p> <--- 追加

# 変更をステージに追記
$ git add index.html

# コミットする
$ git commit
[pull_request aaf10ab] pull request を追記
1 file changed, 1 insertion(+)

# GitHub へ送る
$ git push origin pull_request

次は、GitHubを確認する。

pull_request をプッシュしたリポジトリに移動したら、「Pull requests」 タブを押下する。

続いて、「New pull request」 ボタンを押下する。

「compare」を、リクエストするブランチを選択し、「Create pull request」 を押下する。

レビューしてほしい旨を記述して、「Create pull request」を押下する。

これで、プルリクエストが作成された。

次に「Reviewers」を押下して、レビューを依頼する。

ここにレビューしてほしい人を選択する。

*ただし今回は、開発メンバーはいないので選んだことにする

レビュアは、リクエストされたことをメールで受け取れるので、「Pull requests」 タブから確認できる。

「File changed」 からレビューすることができる。

修正してほしいことがあったら以下の図のように「➕」ボタンを押下して、修正依頼内容を記述後、

「Add single comment」 を押下する。

ここまでの流れをレビューが完了するまで繰り返し行う。

レビューが通ったらレビュアは、「Files changed」 タブから 「Review changes」 を押下し、

「Approve」 を選択して、「Submit review」 を行うことで承認する。

*Approve を選択できるのはレビュアだけ

次に 「conversation」 タブをクリックする。

ページの真ん中あたりに 「Merge pull request」 ボタンがあるので、クリックする。

※コンフリクトが起きていたらその旨が表示されるので、コンフリクトを解消してからクリックする。

「Confirm merge」 をクリックしてマージする。

マージが完了したらブランチを削除できるボタンが表示されるので、ブランチを削除しておこう。

最後に、GitHub 上の最新データを自分のワークツリーに取り込もう。

# masterブランチに切り替える

$ git checkout master
Switched to branch 'master'

# GitHubの情報を取り込む
$ git pull origin master

# ローカルの pull_requestブランチを削除する
$ git branch -d pull_request
Deleted branch pull_request (was aaf10ab).


2.GitHub Flowの流れ

GitHub Flow は、GitHub 社のシンプルなワークフローだ。

<GitHub Flow>

1. master ブランチからブランチを作成

2. ファイルを変更し、コミット

3. 同名のブランチを GitHub 上へプッシュ

4. プルリクエストを送信

5. コードレビューし、master ブランチにマージ

6. master ブランチを本番サーバへデプロイする

*お約束

・master ブランチは常にデプロイできる状態に保つ

・新開発は、master ブランチから新しいブランチを作成してスタート

・作成した新しいブランチ上で作業しコミットする

・定期的にプッシュする

・master にマージするためにプルリクエストを使う

・必ずレビューを受ける

・master ブランチにマージしたらすぐにデプロイ

(テストとブランチ作業は自動化)

# 現在のアクティブなブランチを確認

$ git branch
* master

# 最新の状態であるか確認
$ git status
On branch master
nothing to commit, working tree clean

# masterブランチを最新の状態にする
$ git pull origin master
From https://github.com/hogehoge/git_study
* branch master -> FETCH_HEAD
Already up-to-date.

# 新規にブランチを作成
$ git checkout -b github_flow
Switched to a new branch 'github_flow'

# index.html ファイルを編集
$ vim index.html
<h1>Git チュートリアル</h1>
<p>git status</p>
<p>git diff</p>
<p>git commit --ammend</p>
<p>git merge</p>
<p>conflict</p>
<p>pull request</p>
<p>GitHub Flow</p>  # 追記

# ステージに追加
$ git add index.html

# コミット
$ git commit
[github_flow 1f88dd4] GitHub Flow を追記

# GitHubにプッシュ
$ git push origin github_flow

ここまで完了したら 「1.プルリクエストの流れ」 で実施した手順と同様にプルリクエストを作成する。

開発環境等がある場合は、GitHub 上で、github_flow ブランチを削除した後にデプロイする。

最後に後片付けを行う。

# masterブランチに切り替える

$ git checkout master
Switched to branch 'master'

# 最新の情報を取得
$ git pull origin master

# github_flow ブランチを削除
$ git branch -d github_flow
Deleted branch github_flow (was 1f88dd4).


■リベース

変更を取り込む方法は、マージ以外にリベースというやり方がある。

リベースは、履歴を整えた形で変更を統合してくれる。

# リベースで履歴を整えた形で変更を統合

$ git rebase <ブランチ名>

# ブランチを確認

$ git branch
* master

# 変更がないことを確認
$ git status
On branch master
nothing to commit, working tree clean

# featureブランチを作成
$ git branch feature

# ブランチを確認
$ git branch
feature
* master

# 新規ファイルをmasterブランチで作成する
vim master2.html
<p>master2</p>

# 変更をステージに追加
$ git add .

# コミットする
$ git commit
[master 22608e1] master2 を新規作成

# featureブランチに切り替える
$ git checkout feature

# feature ブランチで新規ファイルを作成
$ vim feature2.html
<p>feature2</p>

# 変更をステージに追加
$ git add .

# コミットする
$ git commit
[master 22608e1] feature2 を新規作成

# リベースして、masterブランチの情報をfeatureブランチに取り込む
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: feature2 を新規作成

$ git log
commit 5ed103bcb4ca04b13469d420f661c81e427dba33 (HEAD -> feature)
Author: hogehoge
Date: Thu Apr 19 04:59:35 2018 +0900

feature2 を新規作成

commit 22608e1cea203d5a03d7dc7984359fc4d841ef51 (master)
Author: hogehoge
Date: Thu Apr 19 04:56:16 2018 +0900

master2 を新規作成

# masterブランチに切り替える
$ git checkout master
Switched to branch 'master'

# featureブランチの情報をmasterブランチに取り込む
$ git merge feature

$ GitHubへプッシュ
$ git push origin master

# featureブランチを削除
$ git branch -d feature
Deleted branch feature (was 5ed103b).

# ブランチを確認
$ git branch
* master

ちなみに、GitHub にプッシュしたコミットをリベースするのは、NG だ。

理由は、リベースすると ローカルの Git の履歴を綺麗にできるが、GitHub 上の履歴と

食い違ってしまうため、GitHub 上のリポジトリが優先されてプッシュできなくなるらしい。

マージは作業の履歴を残したい時に、リベースは履歴を綺麗にしたい時に使用しよう。


■プルの設定をリベース型に変更

プルには、マージ型とリベース型がある。

$ git pull <リモート名> <ブランチ名>

$ git pull origin master

このコマンドを打つと以下の挙動をとる。

<マージ型の挙動>

1. リモートリポジトリ(GitHub) から git fetch でリポジトリ情報を取得

2. ローカルリポジトリに取り込む

3. ローカルリポジトリからワークツリー(自分の作業ディレクトリ)に git merge で情報を取り込む

* この際にマージコミットが残るので、マージしたという記録を残したい時に使用する

次にリベース型だ。

$ git pull --rebase <リモート名> <ブランチ名>

$ git pull --rebase origin master

<リベース型の挙動>

1. リモートリポジトリ(GitHub) から git fetch でリポジトリ情報を取得

2. ローカルリポジトリに取り込む

3. ローカルリポジトリからワークツリー(自分の作業ディレクトリ)に git rebase で情報を取り込む

* この際にマージコミットが残らないので、GitHub の内容だけ取得したい時は、--rebase を使う

リベース型の方が便利なので、プルをリベース型に設定変更する。

# リベース型に変更

$ git config --global pull.rebase true

# masterブランチでgit pullするときのみ有効にする設定
$ git config branch.master.rebase true


■リベースで履歴を書き換える

コミットを綺麗に整えてからプッシュしたい時は、履歴を書き換える必要がある。

ただし、GitHub にプッシュしていないコミットに限る。

# 直前のコミットをやり直す

$ git commit --amend
* リモートリポジトリにプッシュしたコミットには使用しない事

# 複数のコミットをやり直す

$ git rebase -i <コミットID>

# 直前3つ分のコミットをやり直す
$ git rebase -i HEAD~3

コミットを 3 回実施して挙動を確認する。

# 空ファイルを作成

$ touch first.html

# ステージに追加
$ git add first.html

# コミット
$ git commit -m "first.html を追加"

# 空ファイルを作成
$ touch second.html

# ステージに追加
$ git add second.html

# コミット
$ git commit -m "second.html を追加"

# 空ファイルを作成
$ touch third.html

# ステージに追加
$ git add third.html

# コミット
$ git commit -m "third.html を追加"

$ git log --oneline
beed6df (HEAD -> master) third.html を追加
0473451 second.html を追加
7ac491c first.html を追加

$ git rebase -i HEAD~3

# 1. エディタが立ち上がり、以下の文言が確認できる
pick 7ac491c first.html を追加
pick 0473451 second.html を追加
pick beed6df third.html を追加

# 2. 修正したい履歴を edit に変更し文言を変更する
pick 7ac491c first.html を追加
pick 0473451 second.html を追加
edit beed6df third.html を新規作成

# コミットメッセージを修正
# git commit --amend
third.html を新規作成

# 次のコミットへ移動(他は、pick なので特にエディタは立ち上がらず、リベースが終了する)
$ git rebase --continue
Successfully rebased and updated refs/heads/master.

$ git log --oneline
e12dfcb (HEAD -> master) third.html を新規作成
0473451 second.html を追加
7ac491c first.html を追加

# 念のため、ステータスを確認
$ git status
On branch master
nothing to commit, working tree clean

コミットを並び替えたり、削除したりできる。

# 古い順に履歴を表示

$ git rebase -i HEAD~3

# 以下のログの順番を変更する

$ git log --oneline -n 3
e12dfcb (HEAD -> master) third.html を新規作成
0473451 second.html を追加
7ac491c first.html を追加

# 履歴を表示
$ git rebase -i HEAD~3
pick 7ac491c first.html を追加
pick 0473451 second.html を追加
pick e12dfcb third.html を新規作成

# 履歴を書き換える
pick 0473451 second.html を追加
pick 7ac491c first.html を追加
pick e12dfcb third.html を新規作成

# 履歴を入れ替えることで、コミットの順番を入れ替えることができる
$ git log --oneline -n 3
e847ef7 (HEAD -> master) third.html を新規作成
4521d4d first.html を追加
906e304 second.html を追加

# コミットをまとめる
$ git rebase -i HEAD~3
pick 0473451 second.html を追加
pick 7ac491c first.html を追加
pick e12dfcb third.html を新規作成

# squash(スカッシュ)とすると直前のコミットとまとめることができる
pick 906e304 second.html を追加
squash 4521d4d first.html を追加
squash e847ef7 third.html を新規作成

# 履歴が一つになった(コミットがまとまった)
$ git log --oneline -n 3
032e31a (HEAD -> master) second.html を追加

# コミットを分割する
$ git rebase -i HEAD~3
pick 22608e1 master2 を新規作成
pick 5ed103b feature2 を新規作成
pick 032e31a second.html を追加

# 分割したい履歴にeditをつける
pick 22608e1 master2 を新規作成
pick 5ed103b feature2 を新規作成
edit 032e31a second.html を追加

# コミットを取り消す
$ git reset HEAD^

# ステータスを確認
$ git status

Untracked files:
(use "git add <file>..." to include in what will be committed)

first.html
second.html
third.html

# それぞれステージに追加し直す
$ git add first.html
$ git add second.html

# first.htmlとsecond.htmlを合わせて追加
$ git commit -m "first.htmlとsecond.htmlを追加"

$ git add third.html
$ git commit -m "third.htmlを追加"

$ git rebase --continue
Successfully rebased and updated refs/heads/master.

git log --oneline -n 2
a4160f8 (HEAD -> master) third.htmlを追加
d60e5ce first.htmlとsecond.htmlを追加

# GitHubへプッシュ
$ git push origin master

■リベースのエラー

ステータスを確認すると以下のエラーに出くわすことがある。

$ git status

On branch master
Your branch is up-to-date with 'origin/master'.

You are currently rebasing branch 'master' on '11866e5'.
(all conflicts fixed: run "git rebase --continue")

nothing to commit, working tree clean

$ git rebase --continue
fatal: cannot resume: .git/rebase-apply/final-commit does not exist.

リベースが失敗しているようだ。

正しい処置かわからないが、「.git/rebase-apply」を削除することでメッセージを消すことができる。

# 削除

$ rm -rf .git/rebase-apply

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.

nothing to commit, working tree clean


■タグ

コミットを参照しやすくできるようにタグ付けできる。

# タグの一覧を表示

$ git tag

# パターン付きで表示
$ git tag -l "201804"

# タグを作成(注釈付き)
$ git tag -a [タグ名] -m "[メッセージ]"
$ git tag -a 20180419_01 -m "version 20180419_01"

# タグを作成(軽量版)
$ git tag [タグ名]
$ git tag 20180419_01

# 後からタグ付けする
$ git tag [タグ名][コミット名]
$ git tag 20180419_01 hogehoge

# タグのデータを表示
$ git show [タグ名]
$ git show 20180419_01

# タグをつける

$ git tag -a "20180419" -m "version 20180419"

# タグの一覧を表示
$ git tag
20180419

# タグの詳細
$ git show 20180419
tag 20180419
Tagger:
Date: Thu Apr 19 20:31:45 2018 +0900

version 20180419

タグは、リモートリポジトリに送信することもできる。

# タグをリモートリポジトリに送信

$ git push [ブランチ名][タグ名]
$ git push origin 20180419_01

# タグを一斉送信(--tagsでローカルにあって、リモートリポジトリに存在しないタグを一斉に送信する)
$ git push origin --tags

# ローカルにあるタグを確認

$ git tag
20180419

# タグをリモートリポジトリにプッシュ
$ git push origin 20180419
Counting objects: 1, done.
Writing objects: 100% (1/1), 168 bytes | 168.00 KiB/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://github.com/hogehoge/git_study.git
* [new tag] 20180419 -> 20180419

リモートリポジトリ(GitHub)上で、タグを確認する。

まずは、「releases」 タブを押下する。

遷移先で、「Tags」 をクリックし、「・・・」 を押下する。

タブの詳細が見れる。

更に 「20180419」 1を押下するとタグを送信した時に一緒に送信したソースコードもダウンロードできる。

リリースする時に、タグをつけておくととても便利そうだ。


■スタッシュ(作業の一時避難)

作業途中でコミットしたくないが別のブランチで作業しなくてはならない場合、

作業を一旦保存しておく(一時保存)することができる。

# 作業を一時避難(以下のコマンドはどっちも同じ作業を行う)

$ git stash
$ git stash save

# 現在の状況を確認

$ git status
On branch master
nothing to commit, working tree clean

# 適当にファイルを変更
$ vim home.html
<p>home</p>
<p>git pull</p>
<p>git stash</p> # 追加

$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: home.html

# 一時避難
$ git stash
Saved working directory and index state WIP on master: a4160f8 third.htmlwo

# ステータスに何も表示されなくなった
$ git status
On branch master
nothing to commit, working tree clean

# ファイルの変更もなかったことになっている
$ cat home.html
<p>home</p>
<p>git pull</p>

一時避難させた情報を確認しよう。

# 避難した作業の一覧を表示

$ git stash list
stash@{0}: WIP on master: a4160f8 third.htmlwo

避難した作業を復元しよう。

$ 最新の作業を復元

$ git stash apply

# ステージの状況も復元
$ git stash apply --index

# 特定の作業を復元
$ git stash apply [スタッシュ名]
$ git stash apply stash@{1}

# 現在の状況を確認

$ git status
On branch master
nothing to commit, working tree clean

# 復元するhome.htmlのファイルを確認
$ cat home.html
<p>home</p>
<p>git pull</p>

# 復元する
$ git stash apply
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: home.html

# home.htmlファイルを確認
$ cat home.html
<p>home</p>
<p>git pull</p>
<p>git stash</p>

後始末として、一時避難した作業を削除しておこう。

# 避難した最新の作業を削除

$ git stash drop

# 特定の作業を削除
$ git stash drop [スタッシュ名]
$ git stash drop stash@{1}

# 全作業を削除
$ git stash clear

# 避難した作業のリストを確認

$ git stash list
stash@{0}: WIP on master: a4160f8 third.htmlwo

# 作業を削除
$ git stash drop
Dropped refs/stash@{0} (0691f8d815256e136bdbc79b31893303dfe613d8)

# home.html の変更をなかったことにする(掃除)
$ git checkout home.html

$ git status
On branch master
nothing to commit, working tree clean


◾️GitKraken

Sourcetree の一つである GitKrakenは無料で使えて、かっこいい。


◾️補足

グラフィカルな感じで出力することもできる。

git log --graph --oneline --decorate --all

* 745fe6b (HEAD -> dev, user-schema/main) Add User Schema
| * 91dade5 (social-login/main) Resolve merge confilct
| |\
| | * dc63f52 (social-login/twitter) Implement Twitter login
| * | afb4fe2 (social-login/facebook) Implement Facebook login
| |/
| * 120b1cd Add a blank social-login file
|/
* 302221b (master) Adding README.md


■まとめ

Git の使い方は大体わかった。

Docker の学習が完了したら自動デプロイ環境を作成する方法を勉強したいと思う。