CA MOBILE TECH BLOG

株式会社シーエー・モバイルのエンジニア・デザイナーの活動を綴るブログです

株式会社シーエー・モバイルの技術広報による、
技術に特化したブログです。
エンジニアとデザイナーの活動や思想を綴ってゆきます。

新卒エンジニアが知っておくと便利なgitのコマンド集

f:id:cam-engineer:20180806171555p:plain

はじめまして。シーエー・モバイルの新卒エンジニアのT.Fです。

配属されて1ヶ月経ったので、1番使ってるであろう git についてあれこれ綴りたいと思います。


そもそも git と GitHub とは何が違うのか?

まず初めに、用語を確認しておきます。

Git とはプログラムのソースコードなどの変更履歴などを管理するバージョン管理システムで、GitHubは git の仕組みを利用し、自分のソースコードなどを保存・公開することができるようにした Web サービスのことです。


便利なgitコマンド紹介

では早速、私が使ってよかった & 使えそうだと感じたコマンドを紹介したいと思います。

git blame

$ git blame ファイルパス

Git blame は誰が最後にそのファイルを触ったかわかるコマンドです。

不具合があった際使えるのでは...?

Github 上ではファイルを選ぶと右上に blame が出てくるのでそこでも参照可能です。(下記参照)


ファイル選択後、右上の Blame をクリックすると

f:id:cam-engineer:20180806171628p:plain

左に誰か触ったか出るのでこっちでも確認できます。

f:id:cam-engineer:20180806171644p:plain



git cherry-pick コミットID

$ git cherry-pick コミットID

他ブランチの特定のコミットを現在のブランチに反映することができます。

インデックスに反映されるため( git add した状態)、 commit をして自分のブランチに反映させることが必要です。 (自分的に超便利)



git diff

 $ git diff

後述のの log でも差分を見れますが、差分を見るコマンドもあります。


コミットやブランチの差分を確認したいときは

$ git diff コミット コミット


差分のあるファイル一覧を出したいときは

$ git diff —name-only コミット コミット

などがあります。



git fetch --prune

$ git fetch --prune

fetch や pull したときリモートのブランチをローカルに落とすことはできますが、リモートで削除されたブランチはローカルに残ってしまいます。

—prune を付与することでリモートで削除されたブランチを参照し、ローカルにも反映してくれます。



git log

$ git log

このコマンドはよく使っている人はいるんではないでしょうか?

commit xxxxxxxxxxxxxxxxxxxxx (HEAD -> xxxxxxx, origin/master, xxxxxxxxx, master)
Merge: xxxxxxxxxx
Author: xxxxxxx <xxxxxxxxxxxx>
Date:   Thu Jun 00 00:00:00 2018 +0900

    Merge pull request #xxx from xxxxxx

    xxxxxx/xxxxx xxxxx

でもすごい見にくいですよね。

なので私はこんなのを使ってます。

$ git log —-oneline

ハッシュ値 xxxxxxxxxx
ハッシュ値 xxxxxxxxxx
ハッシュ値 xxxxxxxxxx
ハッシュ値 xxxxxxxxxx
ハッシュ値 xxxxxxxxxx

これでだいぶ見やすくなりました。



git log --graph --date=short --decorate=short

$ git log --graph --date=short --decorate=short

これは隠す部分が多いので省略しますが commit 履歴がグラフのようになって見やすいです。

Logで差分をみたいときは

$ git log -S 文字列 -p

-Sで文字列検索、—pickaxe-regex をつけると正規表現で検索ができます。

github 上ではファイル選択後、右上の History をクリックすると

f:id:cam-engineer:20180806172219p:plain

このような感じでみることができます。

f:id:cam-engineer:20180806172010p:plain



git rebase

あまり私は使う機会はないのですが、、、

$ git rebase

git rebase はコミット一つ一つが記録に残るので正確な記録を残すことができます。

$ git checkout ブランチ名
$ git rebase master

上記のように master に結合することができます。

$ git checkout master
$ git rebase ブランチ名

間違ってこのようにしてしまうと、ブランチが消えて分岐元しかなくなってしまうので気をつけましょう。


またoptionで

$ git rebase -i

というのがあります。これは複数の commit をまとめることができます。

$ git rebase -i HEAD~3

こうすると3コミット分まとめることができ、テキストエディタが開くので

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell

これに基づいて編集してください。



git reflog

$ git reflog

git の操作履歴を時系列に表示してくれるコマンドです。

reset して戻したいときに、 log を見てもない場合などに使います。

$ git reset —hard ハッシュ値

こんな感じで log になくても戻せちゃいます。



git revert

$ git revert

既存のコミットを元に戻すことができます。

取り消したいコミットを打ち消すコミットを新しく作成するので reset して戻すより安全です。


詳しくはこちらに書いてありましたので参照してください。 参照: qiita.com



git stash

$ git stash

stash はコミットしていない変更を退避させることができます。

今すぐやらなければいけない作業をしたいときに、stash で変更を退避させ apply で戻すことで前の作業していた状態に戻ることができます。

$ git stash save //※saveは省略可 変更部分が退避
$ git stash list //退避した一覧
$ git stash apply stash@{0} //listでみた退避してあるやつから選んでもとに戻せる ※popの場合は戻すのと同時にstash listから削除

上記の内容だけで退避させ、戻すことができますが他にもいろいろ option があるので調べてみてください。



git subtree

一ヶ月の業務のなかで、AWS移管でもともとあるgitを新しいリポジトリに読み込む必要があったため、それに用いたものも紹介したいと思います。

$ git subtree

このコマンドは外部のリポジトリを現在のリポジトリに取り込むことができるものです。


簡単な例をあげると

$ mkdir sampleProject
$ cd sampleProject
$ git init
$ git commit -m “firstcommit” —allow-empty

何も入っていないリポジトリを作成します。

ここに外部のライブラリやらなんやらをいれたいときに subtree を用います。

$ git subtree add —prefix=library library master

こんな感じで簡単に取り込むことができます。

subtree を削除する際は rm して commit するだけです。


これらを参照してもらうと更に理解が深まると思います。

参照:

qiita.com

qiita.com



git tag タグ

$ git tag タグ

リリース管理やブランチ管理などに利用することができ、コミットを参照しやすくするものとなります。

よく使うコマンドを下に書いておきます。

$ git tag //タグの一覧
$ git tag タグ名 //タグの生成
$ git tag -a タグ名 -m “コメント" (コミットハッシュ) //注釈付きタグの生成(コミットハッシュをつけることでタグをあとから追加できます)
$ git show タグ名 //タグの確認
$ git tag -d タグ名 //タグの削除
$ git tag push タグ名 //タグ名を指定してpush 
$ git push —tags //まとめてpush


私の alias

最後に私の alias ( 大したものは書いてないですが )を貼っておきます。

ちなみに .gitconfig に書くことで alias として使用することができます。

alias  => !git config --get-regexp '^alias\.' | sed 's/alias\.\([^ ]*\) \(.*\)/\1\ => \2/' | sort
br     => branch -a
cm     => commit -m
co     => checkout
dif    => diff --diff-filter=M
logd   => log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
re     => reset --soft HEAD^
ref    => reflog
st     => status

もし、これもいいよーっていうのがあればぜひ教えて頂きたいです。

(新卒エンジニア T.F)