開発

Gitの役立ちコマンドメモ

更新日

文章目的

自分がソフトウェアのバージョン管理ツールGitを使う時に、役立ったなと思ったコマンドを、事例として記録メモしていきます。
Git初心者向けではなく、Gitを使う様になっている方に、場合によっては役立つコマンド事例を残していければと思います。
Git初心者の方は、Dotinstallのgitの講座(無料)等で学ばれる事をお勧めします。

特定の日に作業した量を数える

特定の日における自分又は他者のそのレポジトリ内でのそのブランチでの変更commit量を調べる事は、活動量を定量的に把握・管理する上で役立ちます。
ここではそれを得るgitコマンド例を書いておきます。

ちなみに、登 大遊さんの相当昔の記事ですが、1日に3000-1万行+プログラミングするのは普通、という記事に触発されて
– 自分もどれだけ毎日書いているのだろうか知りたい
– 日々の変更量を計測してペースメーカー的に活動量を維持していきたい
と思い、計測出来るコマンドを作ってみた形です。

なお、昨日の日付を得るのは、Macだと

date -v -1d +'%Y-%m-%d'

だがLinuxだと

date -d '1 day ago' +'%Y-%m-%d'

と打つ必要がある為注意。


現在自分がいるレポジトリ内のブランチでの今日の自分の変更Commit量を確認する

WHOAMI=`git config user.name`;
TODAY=`date +'%Y-%m-%d'`

git log --numstat --pretty="%H" --author="$WHOAMI" --since=$TODAY' 00:00' --until=$TODAY' 23:59' | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'

例えば

865 (+301, -564)

という結果が出てくるが、それは301行追加または変更し、564行削ったという意味になる。

ちなみに、特定のディレクトリや拡張子の変更は差分から除きたいという場合があるかと思うが、その場合には

 -- . ":(exclude)ファイルへのパス"

という表現をgitのセクションにつける。
ファイルへのパス以外は、文字そのまま。

crawled_dataというディレクトリを除外する例

git log --numstat --pretty="%H" --author="$WHOAMI" --since=$TODAY' 00:00' --until=$TODAY' 23:59' -- . ":(exclude)crawled_data/" | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'
-- . ":(exclude)ファイルへのパス1" ":(exclude)ファイルへのパス2"

という形で、複数の除外対象を指定する事も出来る。


現在自分がいるレポジトリ内のブランチでの昨日の自分の変更Commit量を確認する

WHOAMI=`git config user.name`;
YESTERDAY=`date -v -1d +'%Y-%m-%d'`

git log --numstat --pretty="%H" --author="$WHOAMI" --since=$YESTERDAY' 00:00' --until=$YESTERDAY' 23:59' | awk 'NF==3 {plus+=$1; minus+=$2} END {printf("%d (+%d, -%d)\n", plus+minus, plus, minus)}'

aliasの設定

毎日上記のコマンドを覚えて打つのは辛い為、alias設定をしておく。
記号の適切なエスケープが必要。

今日の自分のCommit量を得るalias

alias tac='WHOAMI=`git config user.name`;TODAY=`date +"%Y-%m-%d"`;git log --numstat --pretty="%H" --author="$WHOAMI" --since=$TODAY" 00:00" --until=$TODAY" 23:59" | awk "NF==3 {plus+=\$1; minus+=\$2} END {printf(\"%d (+%d, -%d)\n\", plus+minus, plus, minus)}";';

昨日の自分のCommit量を得るalias

alias yac='WHOAMI=`git config user.name`;YESTERDAY=`date -v -1d +"%Y-%m-%d"`;git log --numstat --pretty="%H" --author="$WHOAMI" --since=$YESTERDAY" 00:00" --until=$YESTERDAY" 23:59" | awk "NF==3 {plus+=\$1; minus+=\$2} END {printf(\"%d (+%d, -%d)\n\", plus+minus, plus, minus)}";';

上記のコマンドをそれぞれ.bash_profileに追加してから

. ~/.bash_profile;

と打って反映。

そうすると、昨日のcommit量情報はそのレポジトリ内で

yac

今日のcommit量情報は

tac

と打つだけで得られるようになる。

Branch間の差を確認する

git diff 古いブランチ名 新しいブランチ名

Branchの削除

ローカルのブランチを削除したい場合は

git branch -d ブランチ名

リモートのブランチはそれでは削除されないので、リモートのブランチも削除する場合は

git push --delete origin dev;

巨大なファイルを履歴からも削除したい

gitのレポジトリは履歴含めてダウンロードされてくる為、巨大なファイルを一度登録してしまうと、後でファイルを削除してcommitしても、レポジトリの履歴には含まれる為、同期に時間がかかってしまうようになったりします。
それを解決する為に、そのファイルを履歴からも削除したい場合には、

git filter-branch --index-filter "git rm -r --cached --ignore-unmatch 消すファイルへのパス" HEAD;
git push;

と打つ事で、履歴からも消す事が出来ます。

ローカルのレポジトリが使っているリモートブランチの確認

git remote -v;

レポジトリのホスティング元の変更

例えばbitbucket上のレポジトリExampleをgithub上に作ったレポジトリExampleに変更したい場合
先にGithub上にExampleレポジトリを作っておいて

git remote -v;
REPO=Example;
git remote rename origin bitbucket;
git remote add origin git@github.com:.../$REPO.git;
git push origin master;
git pull;
git push origin master --force;
git remote rm bitbucket;
git remote -v;

git remote -v;の結果でリモートレポジトリのホスティング先が変わった事は確認できますが、念の為Githubのレポジトリにブラウザでアクセスして、きちんと中身が移転している事を確認して終了