たくろぐ!

世界一のチラ裏

【更新中】Gitのコマンドを全て使ってみた

gitわからなすぎ問題

gitって初心者殺しだよなって思ったのでこれを期に一から学び直す。
こういう抽象的、概念的な技術は触って失敗することで覚えるべき。

git init

これは後述のgit cloneしてくれば.gitディレクトリごとごっそり持ってくることになるので不要だが念のため。
最初に作成したプロジェクトをpushするときにそのディレクトリ以下のファイルを事前にgitの管理下に置くためのコマンド。

# git_testディレクトリを作成  
vagrant@ubuntu-xenial:~/project$ mkdir git_test  
  
# ディレクトリを確認  
vagrant@ubuntu-xenial:~/project$ ls -la  
total 12  
drwxrwxr-x  3 vagrant vagrant 4096 Aug 20 08:37 .  
drwxr-xr-x 13 vagrant vagrant 4096 Aug 20 08:37 ..  
drwxrwxr-x  2 vagrant vagrant 4096 Aug 20 08:37 git_test  
  
# git_testディレクトリに降りる  
vagrant@ubuntu-xenial:~/project$ cd git_test/  
  
# 何もないことを確認  
vagrant@ubuntu-xenial:~/project/git_test$ ls -la  
total 8  
drwxrwxr-x 2 vagrant vagrant 4096 Aug 20 08:37 .  
drwxrwxr-x 3 vagrant vagrant 4096 Aug 20 08:37 ..  
  
# git_testディレクトリ以下をgitの管理下に置く  
vagrant@ubuntu-xenial:~/project/git_test$ git init  
Initialized empty Git repository in /home/vagrant/project/git_test/.git/  
  
# .git以下のディレクトリ構成  
vagrant@ubuntu-xenial:~/project/git_test$ cat .git/  
branches/    config       description  HEAD         hooks/       info/        objects/     refs/  
  
# プロジェクト領域の設定を確認(初期設定値)  
vagrant@ubuntu-xenial:~/project/git_test$ cat .git/config  
[core]  
        repositoryformatversion = 0  
        filemode = true  
        bare = false  
        logallrefupdates = true  

git config

これはgitでpushしたりする(後述)ときに誰のコミットなのかを事前に登録しておく手順。
だいたいプロジェクトでuser.nameは「名前.苗字」みたいにしてねとかルールがあるはずだからさらっとやっておく。

git config --list

現在のgitの設定をリスト形式で表示するオプションが--list。

vagrant@ubuntu-xenial:~$ git config --list
user.email=dammy@gmail.com
user.name=taaaak # aが4つ  

git config --global 設定値

複数のリモートリポジトリで同じconfig設定を適用する場合、--globalオプションを利用する。

# マシンでgitを使用する際の名前を設定する(上書き)  
vagrant@ubuntu-xenial:~$ git config --global user.name "taaaaak" # aが5つ  
  
# 再度設定を表示  
vagrant@ubuntu-xenial:~$ git config --list  
user.email=dammy@gmail.com  
user.name=taaaaak # 変わった  
  
# .gitconfigファイルに設定を反映される(ここがグローバル領域)  
vagrant@ubuntu-xenial:~$ cat ~/.gitconfig  
[user]  
        email = dammy@gmail.com  
        name = taaaaak  

git config 設定値

個別でconfig設定を適用する場合、そのプロジェクトのルートディレクトリでオプションをつけずにコマンドを実行する。

# プロジェクトルートまで降りる  
vagrant@ubuntu-xenial:~$ cd tmp/project/ajaxapi/  
# 設定を表示  
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ git config --list  
user.email=dammy@gmail.com  
user.name=taaaaak  
core.editor=vim -f  
core.repositoryformatversion=0  
core.filemode=true  
core.bare=false  
core.logallrefupdates=true  
core.ignorecase=true  
remote.origin.url=git@github.com:taaaaak/ajaxapi.git  
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*  
  
# このプロジェクトを使用する際の名前を設定する  
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ git config user.name "Taaaak"  
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ git config --list  
user.email=dammy@gmail.com  
user.name=taaaaak  
core.editor=vim -f  
core.repositoryformatversion=0  
core.filemode=true  
core.bare=false  
core.logallrefupdates=true  
core.ignorecase=true  
remote.origin.url=git@github.com:taaaaak/ajaxapi.git  
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*  
user.name=taaaak # 追加される  
  
# グローバル領域は変化なし  
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ cat ~/.gitconfig  
[user]  
        email = dammy@gmail.com  
        name = taaaaak # 変化なし  
  
# ローカル領域?プロジェクト領域?にtaaaakが追加される  
vagrant@ubuntu-xenial:~/tmp/project/ajaxapi$ cat .git/config  
[core]  
        repositoryformatversion = 0  
        filemode = true  
        bare = false  
        logallrefupdates = true  
        ignorecase = true  
[remote "origin"]  
        url = git@github.com:taaaaak/ajaxapi.git  
        fetch = +refs/heads/*:refs/remotes/origin/*  
[user]  
        name = taaaak  

git clone URL(※URLの部分は適宜自分の環境に読み替えること)

リモートリポジトリのプロジェクトファイルをごっそりローカルリポジトリにクローン(コピー)するコマンド。
上述のgit initするとできる.gitディレクトリや.gitignoreファイルなどgitでプロジェクト管理するために必要なものも入ってるはずなのでこれをやれば優しい世界になる。

# リモートリポジトリから現在のディレクトリにクローンする  
vagrant@ubuntu-xenial:~/project$ git clone git@github.com:taaaaak/ajaxapi.git  
Cloning into 'ajaxapi'...  
remote: Counting objects: 93, done.  
remote: Compressing objects: 100% (78/78), done.  
remote: Total 93 (delta 2), reused 93 (delta 2), pack-reused 0  
Receiving objects: 100% (93/93), 22.88 KiB | 0 bytes/s, done.  
Resolving deltas: 100% (2/2), done.  
Checking connectivity... done.  
vagrant@ubuntu-xenial:~/project$ ls -la  
total 16  
drwxrwxr-x  4 vagrant vagrant 4096 Aug 20 16:52 .  
drwxr-xr-x 13 vagrant vagrant 4096 Aug 20 16:27 ..  
drwxrwxr-x 13 vagrant vagrant 4096 Aug 20 16:52 ajaxapi # 作成された  
drwxrwxr-x  3 vagrant vagrant 4096 Aug 20 09:27 git_test  

git add

ワーキングツリーからステージング領域に変更点を上げるためのコマンド。
本来はここに積み上げられた変更点をまとめてコミットするための領域だが、addとcommitを同時にやることも多い(後述)。

git add -A

変更点のみワーキングツリーからステージングエリアにのせるオプション。
git add .はカレントディレクトリ以下全て、-Aは変更点のみ。

vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt  
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
  
vagrant@ubuntu-xenial:~/project/git_test$ git add -A  

git commit

ステージングエリアに溜まった変更を機能単位でローカルリポジトリにコミットするためのコマンド。

git commit -m "コメント"

コミットの際にあらかじめコメントを書いておくためのオプション。
これがない場合、nanoやvimが開き、エディタ上でコメントしないといけない。
正直慣れていたとしても面倒なのでコメントはcommitのタイミングで書いておくのがいい。

vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "a.txtを作成(1:aaa)"  
[master (root-commit) 3e924c2] a.txtを作成(1:aaa)  
 1 file changed, 1 insertion(+)  
 create mode 100644 a.txt  

git commit --amend

前回のコミットに変更点を追加するときに使うコマンド。
コミットハッシュは変わる。
コメントを変更しない場合は、--no-editを使う。

git remote add

git initしたあとに行うコマンド(add, commitした後にやってもいい)。
これでローカルリポジトリとリモートリポジトリの紐付けを行う。
originはURLの別名で、git pushなどリモートリポジトリへの変更をするようなコマンドを実行するときにこの別名を使って実行できるようになる。
これから楽をするためのエイリアスみたいなやつ。

git remote add origin リモートリポジトリ名

リモートリポジトリはhttp://~でもgit@~でもどちらでもOK。

vagrant@ubuntu-xenial:~/project/git_test$ git remote add origin git@github.com:taaaaak/git_test.git  

git push

ローカルリポジトリのコミットをリモートリポジトリに反映させるコマンド。

git push -u origin ブランチ名

-uオプションはupstream(上流ブランチ)を指定するもので、以降は何も指定しなければリモートのmasterブランチにpushされる。

vagrant@ubuntu-xenial:~/project/git_test$ git push -u origin master  
Counting objects: 3, done.  
Writing objects: 100% (3/3), 235 bytes | 0 bytes/s, done.  
Total 3 (delta 0), reused 0 (delta 0)  
To git@github.com:taaaaak/git_test.git  
 * [new branch]      master -> master  
Branch master set up to track remote branch master from origin.  

git checkout

git checkout branch名

ブランチを切り替えるためのコマンド。

git checkout file名

ファイル名を指定した場合はHEADと同じ状態に戻すコマンド。
git checkout .でワーキングツリーを最後のコミットの状態に戻す。

git checkout -b branch名

チーム開発においてmasterブランチで作業することはタブーのため、自分用の作業ブランチを切るときに使う。
本当はgit branch buranch名で作業ブランチを作成できるが、-bオプションで作成したブランチに移動するまで一度にやってくれる。
派生元を指定する場合は最後に派生元を追加する。
git checkout -b ticket/branch_2 origin/ticket/branch_1

vagrant@ubuntu-xenial:~/project/git_test$ git checkout -b ticket/001  
Switched to a new branch 'ticket/001'  

git branch

ブランチの操作をするためのコマンド。
ブランチを作ったり、削除したり、一覧表示したりできる。

git branch -a

git branchは現在のローカルブランチを全て一覧表示するコマンドだが、-aオプションでリモートの追跡をするローカルブランチも含めて一覧表示するためのコマンド。
追跡ブランチはremotes/origin/masterのように先頭ディレクトリにremotesが入ってる。

vagrant@ubuntu-xenial:~/project/git_test$ git branch -a  
  master  
* ticket/001  
  remotes/origin/master  

git branch -d branch名

リモートリポジトリにpush済みのローカルブランチを削除するためのコマンド。
このコマンドを実行するには、master等のブランチに移動しておく必要がある。 push等反映されていない場合、強制削除するには-dの代わりに-Dオプションを実行する。

# リモートに変更点をマージしたのでいらないから消す  
vagrant@ubuntu-xenial:~/project/git_test$ git branch -d ticket/001  
Deleted branch ticket/001 (was 99c6f3f).  
  
vagrant@ubuntu-xenial:~/project/git_test$ git branch -a  
* master  
  # なくなった  
  remotes/origin/master  
  remotes/origin/ticket/001  

git branch -dr 追跡ブランチ名

上記で残った追跡ブランチを削除するためのコマンド。

vagrant@ubuntu-xenial:~/project/git_test$ git branch -dr origin/ticket/001  
Deleted remote-tracking branch origin/ticket/001 (was 99c6f3f).  
  
vagrant@ubuntu-xenial:~/project/git_test$ git branch -a  
* master  
  remotes/origin/master  
  # なくなった  

git pull

リモートの最新ブランチをfetchしてmergeするコマンド。
fetchは追跡ブランチをリモートの最新と同期すること。
mergeはそれを現在のブランチに反映(差分更新)させること。
ほかのブランチには反映させない。

vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt  
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
bbb  
  
# addをせずに直接ローカルリポジトリに変更点をコミットするには-aオプションをつける  
vagrant@ubuntu-xenial:~/project/git_test$ git commit -am "add record 'bbb' in 2line to a.txt"  
[ticket/001 99c6f3f] add record 'bbb' in 2line to a.txt  
 1 file changed, 1 insertion(+)    
  
# github-flowにしたがってリモートのticket/001にpush  
vagrant@ubuntu-xenial:~/project/git_test$ git push origin ticket/001  
Counting objects: 3, done.  
Writing objects: 100% (3/3), 261 bytes | 0 bytes/s, done.  
Total 3 (delta 0), reused 0 (delta 0)  
To git@github.com:taaaaak/git_test.git  
 * [new branch]      ticket/001 -> ticket/001  
  
# リモートリポジトリのmasterブランチにticket/001の変更をマージ(プルリクエスト)  
※GitHub上での作業  

f:id:takkuso:20180823014609p:plainf:id:takkuso:20180823014616p:plainf:id:takkuso:20180823014623p:plainf:id:takkuso:20180823014630p:plainf:id:takkuso:20180823014636p:plainf:id:takkuso:20180823014642p:plainf:id:takkuso:20180823014648p:plain

# ローカルのmasterに移動  
vagrant@ubuntu-xenial:~/project/git_test$ git checkout master  
Switched to branch 'master'  
Your branch is up-to-date with 'origin/master'.  
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
  
# 上流ブランチ(リモートのmaster)から変更をpull  
vagrant@ubuntu-xenial:~/project/git_test$ git pull  
remote: Counting objects: 1, done.  
remote: Total 1 (delta 0), reused 0 (delta 0), pack-reused 0  
Unpacking objects: 100% (1/1), done.  
From github.com:taaaaak/git_test  
   3e924c2..ba2b172  master     -> origin/master  
Updating 3e924c2..ba2b172  
Fast-forward  
 a.txt | 1 +  
 1 file changed, 1 insertion(+)  
  
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
bbb # mergeされた  
  
vagrant@ubuntu-xenial:~/project/git_test$ git branch -a  
* master  
  ticket/001  
  remotes/origin/master  
  remotes/origin/ticket/001 # fetchした  

git status

現在のワークツリー、ステージングの状態を表示するコマンド。

# ワークツリー上で作業中のときのステータス  
vagrant@ubuntu-xenial:~/project/git_test$ git status  
On branch ticket/001  
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:   a.txt  
  
no changes added to commit (use "git add" and/or "git commit -a")  
vagrant@ubuntu-xenial:~/project/git_test$ git add -A  
# ステージング領域に変更点が積まれたときのステータス  
vagrant@ubuntu-xenial:~/project/git_test$ git status  
On branch ticket/001  
Changes to be committed:  # コミット対象に指定されていて、コミット待ちだよって意味  
  (use "git reset HEAD <file>..." to unstage)  
  
        modified:   a.txt  
# コミット後のステータス  
vagrant@ubuntu-xenial:~/project/git_test$ git status  
On branch master  
Your branch is up-to-date with 'origin/master'.  
nothing to commit, working directory clean  

git log

現在のブランチの変更履歴を表示するコマンド。

vagrant@ubuntu-xenial:~/project/git_test$ git log  
commit ba2b1720e218f82afe2645635836bf7b9ad08bdd  
Merge: 3e924c2 99c6f3f  
Author: taaaaak <dammy@gmail.com>  
Date:   Mon Aug 20 09:23:26 2018 +0900  
  
    Merge pull request #1 from taaaaak/ticket/001  
  
    add record 'bbb' in 2line to a.txt  
  
commit 99c6f3f27aebad184620e35874f80a60d4780864  
Author: taaaaak <dammy@gmail.com>  
Date:   Mon Aug 20 09:15:14 2018 +0900  
  
    add record 'bbb' in 2line to a.txt  
  
commit 3e924c2fb1438461a8eaaa1ea7ced35c82b7d999  
Author: taaaaak <dammy@gmail.com>  
Date:   Mon Aug 20 08:54:07 2018 +0900  
  
    a.txtを作成(1:aaa)  

git log --one-line

コミット履歴が1行ごとに表示される。

git log --graph --all --format="%x09%an%x09%h %d %s"

git logをtigみたいにするワンライナー

git diff

変更箇所を表示させるコマンド。
ワーキングツリーにしかなければオプションなしで変更点が表示される。

git diff HEAD^..HEAD

コミット済みの最新のコミットの変更点とその一つ前の変更点を比較するコマンド。
一つ前は"^"だが、2つ以上前のコミットと比較する場合、"~2"みたいに書く。
比較演算子?".."を基準に右が最新、左が比較元で覚える(本質はdiffなのでどちらでもいいが)。
".."ではなく、" "(半角スペース)で区切ってもいい。

# 現在のブランチと一つ前の差分を確認  
vagrant@ubuntu-xenial:~/project/git_test$ git diff HEAD^..HEAD  
diff --git a/a.txt b/a.txt  
index 72943a1..dbee026 100644  
--- a/a.txt  
+++ b/a.txt  
@@ -1 +1,2 @@  
 aaa  
+bbb  
vagrant@ubuntu-xenial:~/project/git_test$ git checkout -b ticket/002
Switched to a new branch 'ticket/002'
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
bbb  
  
# 3行目にcccdddを追加  
vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt  
  
# 未コミットの現在のブランチの差分を確認  
vagrant@ubuntu-xenial:~/project/git_test$ git diff
diff --git a/a.txt b/a.txt
index dbee026..1802a74 100644
--- a/a.txt
+++ b/a.txt
@@ -1,2 +1,3 @@
 aaa
 bbb
+cccddd
# ブランチ同士で差分をとる(masterをちょっと進めた)  
vagrant@ubuntu-xenial:~/project/git_test$ git diff ticket/002 master  
diff --git a/a.txt b/a.txt  
index 45240d3..20536af 100644  
--- a/a.txt  
+++ b/a.txt  
@@ -1,3 +1,3 @@  
 aaa  
 bbb  
-fffggg # masterの進めた差分  
+cccddd # 今回進めたticket/002の差分  
# コミット済みの場合何も表示されない  
vagrant@ubuntu-xenial:~/project/git_test$ git diff  

git merge

指定したブランチを今いるブランチにマージ(合体)させるためのコマンド。
変更点でコンフリクトがなければ自動的にマージしてくれる。
github-flowではこのコマンドは不要。

git merge branch名

# masterブランチに移動  
vagrant@ubuntu-xenial:~/project/git_test$ git checkout master  
Switched to branch 'master'  
Your branch is up-to-date with 'origin/master'.  
  
# ticket/002をmasterにマージ  
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002  
Auto-merging a.txt  
CONFLICT (content): Merge conflict in a.txt # コンフリクト(衝突)した  
Automatic merge failed; fix conflicts and then commit the result.  
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
bbb  
<<<<<<< HEAD  
cccddd  
=======  
fffggg  
>>>>>>> ticket/002  
  
# 両方を利用してcccdddfffgggにした  
vagrant@ubuntu-xenial:~/project/git_test$ vi a.txt  
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
bbb  
cccdddfffggg  
  
# 衝突を修正したらaddしろと言われる  
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002  
error: merge is not possible because you have unmerged files.  
hint: Fix them up in the work tree, and then use 'git add/rm <file>'  
hint: as appropriate to mark resolution and make a commit.  
fatal: Exiting because of an unresolved conflict.  
vagrant@ubuntu-xenial:~/project/git_test$ git add -A  
  
# 当然commitしろと言われる  
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002
fatal: You have not concluded your merge (MERGE_HEAD exists).
Please, commit your changes before you merge.
vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "コンフリクトを解消"
[master 7c83e5b] コンフリクトを解消
  
# ようやくマージできた  
vagrant@ubuntu-xenial:~/project/git_test$ git merge ticket/002
Already up-to-date.
vagrant@ubuntu-xenial:~/project/git_test$ cat a.txt  
aaa  
bbb  
cccdddfffggg  
eeeee  

git merge --no--ff branch名

--no-ffはnon fast-fowardの略。
枝分かれしない場合のマージはマージしない(わかりづらいかw)。
枝分かれする場合のマージのみマージする。

git merge --ff-only branch名

--ff-onlyはfast-foward onlyの略。
枝分かれする場合のマージはマージしない。
枝分かれしない場合のマージのみマージする。
マージ元ブランチの霊圧が消えるからエンジニアからは嫌われる。

git revert

コミットを指定して打ち消しコミットを実行するコマンド。
後述のresetがコミットをなかったものにするのに対してこっちは打ち消しコミットを作るのでコミット履歴が残る。
リモートリポジトリにコミットが残ってしまっている場合はこっちをするのが無難。
同じ要領でresetして強制pushすると嫌な顔をされる。

git reset

commitをなかったことにするコマンド。
revertは元に戻す(=履歴は残る)が、こちらは残らない。
ローカルでいくらやっても問題ないけど、リモートにpush済みのコミットに対してこれやると「クソが!」って思われる。
意地悪をしたい先輩がいたらやってもいい。
もし戻したくなったらgit reflogする(後述)。

git reset (--mixed) HEAD^

一つ前のコミットの変更をワーキングツリーまで戻すコマンド。
--mixedはデフォなのでなくてもいい。

# ひとまずコミット  
vagrant@ubuntu-xenial:~/project/git_test$ git commit -am "reset用"
[master efb52b5] reset用
 1 file changed, 1 insertion(+)  
  
# ワーキングツリーまで変更を戻す  
vagrant@ubuntu-xenial:~/project/git_test$ git reset --mixed HEAD^
Unstaged changes after reset:
M       a.txt  
  
# 確認してみる  
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch is up-to-date with 'origin/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:   a.txt

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

git reset --soft HEAD^

ステージングエリアまで変更を戻すコマンド。

# もう一回コミット  
agrant@ubuntu-xenial:~/project/git_test$ git add -A
vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "reset用2"
[master e54a719] reset用2
 1 file changed, 1 insertion(+)   
  
# ステージングエリアまで戻す  
vagrant@ubuntu-xenial:~/project/git_test$ git reset --soft HEAD^
  
# 確認してみる  
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

git reset --hard HEAD^

現在のブランチを一つ前のコミットまで戻すコマンド。
変更点もリセットされるので修正中の場合注意して行うこと。

# もう一回コミット  
vagrant@ubuntu-xenial:~/project/git_test$ git commit -m "reset用3"
[master ac60662] reset用3
 1 file changed, 1 insertion(+)  
  
# 一個前のコミットまで戻す  
vagrant@ubuntu-xenial:~/project/git_test$ git reset --hard HEAD^
HEAD is now at 7c83e5b コンフリクトを解消
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch is up-to-date with 'origin/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:   a.txt

no changes added to commit (use "git add" and/or "git commit -a")
vagrant@ubuntu-xenial:~/project/git_test$ git commit -a --amend --no-edit
[master b945782] コンフリクトを解消
 Date: Mon Aug 20 17:48:26 2018 +0900
vagrant@ubuntu-xenial:~/project/git_test$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 1 and 1 different commit each, respectively.
  (use "git pull" to merge the remote branch into yours)
nothing to commit, working directory clean

git rebase

ブランチを違うブランチに付け替えるコマンド。
分岐した兄弟ブランチ同士で変更を統合させたり不要なブランチを取りこんだりするときに使う。

git rebase -i

対話的にリベースするコマンド。

git rebase --continue

リベース作業を確定させるオプション。

git reflog

今までの変更履歴を全て表示させるコマンド。
git resetで削除したコミットを復活させることもできる。

vagrant@ubuntu-xenial:~/project/git_test$ git reflog
7c83e5b HEAD@{0}: checkout: moving from ticket/003 to master
7c83e5b HEAD@{1}: checkout: moving from master to ticket/003
7c83e5b HEAD@{2}: checkout: moving from a to master
7c83e5b HEAD@{3}: checkout: moving from master to a
7c83e5b HEAD@{4}: checkout: moving from ticket/002 to master
aa6eb6b HEAD@{5}: checkout: moving from master to ticket/002
7c83e5b HEAD@{6}: commit (merge): コンフリクトを解消
060d820 HEAD@{7}: checkout: moving from ticket/002 to master
aa6eb6b HEAD@{8}: commit: add record 3:eeefff to a.txt
ba2b172 HEAD@{9}: checkout: moving from master to ticket/002
060d820 HEAD@{10}: commit: add record 3:cccddd to a.txt
f3fb39c HEAD@{11}: commit: add record 3:ccc to a.txt
ba2b172 HEAD@{12}: checkout: moving from ticket/003 to master
ba2b172 HEAD@{13}: checkout: moving from ticket/002 to ticket/003
ba2b172 HEAD@{14}: checkout: moving from master to ticket/002
ba2b172 HEAD@{15}: pull: Fast-forward
3e924c2 HEAD@{16}: checkout: moving from ticket/001 to master
99c6f3f HEAD@{17}: commit: add record 'bbb' in 2line to a.txt
3e924c2 HEAD@{18}: checkout: moving from master to ticket/001
3e924c2 HEAD@{19}: commit (initial): a.txtを作成(1:aaa)

git blame ファイル名

ファイルの変更履歴を行単位で確認できる。
ここでコミットハッシュ値を取得してからgit showすると幸せになれる。

git show コミットハッシュ

ローカルリポジトリのコミット情報を取得するためのコマンド。
何も指定しなければ、直近のコミット情報を取得する。

vagrant@ubuntu-xenial:~/project/git_test$ git show
commit 7c83e5b38f2d22463d5cebabc23866d556f400ce
Merge: 060d820 aa6eb6b
Author: taaaaak <dammy@gmail.com>
Date:   Mon Aug 20 17:48:26 2018 +0900

    コンフリクトを解消

diff --cc a.txt
index 20536af,45240d3..cac8aec
--- a/a.txt
+++ b/a.txt
@@@ -1,3 -1,3 +1,3 @@@
  aaa
  bbb
- cccddd
 -fffggg
++cccdddfffggg

git remote show コミットハッシュ

リモートリポジトリの情報を取得するためのコマンド。

vagrant@ubuntu-xenial:~/project/git_test$ git remote show
origin
vagrant@ubuntu-xenial:~/project/git_test$ git remote show origin
* remote origin
  Fetch URL: git@github.com:taaaaak/git_test.git
  Push  URL: git@github.com:taaaaak/git_test.git
  HEAD branch: master
  Remote branches:
    master     tracked
    ticket/002 tracked
  Local branches configured for 'git pull':
    master     merges with remote master
    ticket/002 merges with remote ticket/002
  Local refs configured for 'git push':
    master     pushes to master     (up to date)
    ticket/002 pushes to ticket/002 (up to date)

git fetch

リモートリポジトリのブランチをローカルリポジトリと同期してくれる。
どのディレクトリでやっても同じ。

git fetch --prune

リモートリポジトリで削除されたブランチをfetchしたら(同一の)ローカルブランチを消してくれる。

git grep

git管理下のファイルやファイル内の名前から該当の文字列を検索して表示してくれる。
むっちゃ使う。

git show-branch

編集中

vagrant@ubuntu-xenial:~/project/git_test$ git show-branch
* [master] コンフリクトを解消
 ! [ticket/002] add record 3:eeefff to a.txt
  ! [ticket/003] コンフリクトを解消
   ! [ticket/004] a.txtを作成(1:aaa)
----
-    [master] コンフリクトを解消
  -  [ticket/003] コンフリクトを解消
*++  [ticket/002] add record 3:eeefff to a.txt
* +  [master^] add record 3:cccddd to a.txt
* +  [master~2] add record 3:ccc to a.txt
---  [master~3] Merge pull request #1 from taaaaak/ticket/001
*++  [master~3^2] add record 'bbb' in 2line to a.txt
*+++ [ticket/004] a.txtを作成(1:aaa)

次やる

tigの使い方

参考にした

qiita.com