あまり知られていないGitのTips

思い浮かんだGitのTipsを列挙してみました。

gitのコマンドをで補完する

git-completion.bash を入れると、でコマンドの補完が効くようになります。
また、PS1の設定を行うと現在のブランチ名が常にbash上に表示されるようになります。
Windowsの場合、msysgit は標準で入ってます)

インストール方法(引用)

# To use these routines:
#
# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
# 2) Add the following line to your .bashrc/.zshrc:
# source ~/.git-completion.sh
#
# 3) Consider changing your PS1 to also show the current branch:
# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
# ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
#
# The argument to __git_ps1 will be displayed only if you
# are currently in a git repository. The %s token will be
# the name of the current branch.

詳しくはググッて下さい。

設定をすると、画像のように補完が効いたり、現在のブランチ名が表示されるようになります。

自分の環境でのみ特定のファイルを無視する

$ touch ~/.gitignore_global
$ git config --global core.excludesfile ~/.gitignore_global

自分の環境で常に無視したいファイル(vimで作られる.swpなど)は~/.gitignore_global で管理するといい。
このignore設定は他のユーザと共有されません。

あるリポジトリでのみ、特定のファイルを無視する

無視したいファイルをプロジェクト全体で共有したくない場合、/.git/info/exclude で管理する事もできます。
このignore設定も前述した.gitignore_globalと同様に他のユーザと共有されません。

日本語のファイル名を表示する

$ git config --global core.quotepath false


タグをpushする

$ git push origin <タグ名>

git push --tags は意図しないタグまでpushする可能性があるので、無闇に使わない方がいい。

git logでブランチとタグをグラフにして見る

$ git log --oneline --decorate --graph


一つ前のコミットを同じコミットメッセージのまま修正する

$ git commit --amend -C HEAD

-C は指定のコミットのログメッセージ、authorを使いまわす。
--amend を使う場合は前のコミットを少し直す事が多いので、ログメッセージが同じで問題なければ"-C HEAD"にすると入力の手間が省けます。

リモートのブランチ(feature/foobar)を削除する

$ git push origin :feature/foobar

少し分かりづらいので、メモとして。

リモートのタグ(v1.0.0)を削除する

$ git push origin :v1.0.0

ブランチと同じだけど、メモとして。

リモートリポジトリで削除されたブランチをfetchと同時にローカルでも削除する

$ git featch --prune origin

同様のことをgit remoteコマンドでも出来ます

$ git remote prune origin

削除されるのはリモート追跡ブランチ(origin/feature/foobar)で、追跡ブランチ(feature/foobar)は削除されません。
gitでは他人がリモートリポジトリのブランチを消しても、リモート追跡ブランチは自動的に消えません

ブランチの参照の履歴をみる

$ git reflog show master

同様のことをgit logコマンドのオプションでもできます。

$ git log -g --oneline master

昨日のmasterから、今日のmasterまでの変更を表示する

$ git log master@{yesterday}..master

昨日のmasterが参照していたコミットオブジェクトから、現在のmasterまでのログを表示する。
詳しくは「入門Git p.284」を読めば分かる。

masterのログで、昨日以降に作られたログを表示する

$ git log --since=yesterday master

こちらは、コミットオブジェクトの日時が昨日以降のログを表示する。
詳しくは「入門Git p.284」を読めば分かる。

fetchのときにリモートのタグをorigin/にリネームする

$ git fetch -n origin refs/heads/*:refs/remotes/origin/* refs/tags/*:refs/tags/origin/*

ローカルのタグとリモートのタグを分けたい場合に使うと便利です。

$ git tag | grep -v "origin"

のようにして、ローカルのタグだけ表示させたりも出来ます。

mergeコミット(develop~3)をrevertする

$ git revert develop~3 -m 2

マージコミットをrevertする場合、親を番号で指定する必要があります。
事前にlogコマンドで対象を確認した方がいい。

$ git log -n 1 develop~3^2

アノテーションタグを使う

$ git tag -a v1.0.0 master

-a オプションを使うと、タグメッセージとタグを打った人・打った日時を残す事が出来ます。

直近のタグを調べる

$ git describe

現在のブランチからログを辿り、最初に見つけたアノテーションタグを表示します。

軽量タグも含めて検索する場合、"--tags"のオプションを指定する必要があります。

現在いるブランチをリモートにpushする

$ git push origin HEAD

pushの時にブランチ名を入力せずにpush出来て便利。*1
HEADがブランチでない場合はエラーになります。

普通のやり方は下記の通り。

$ git push origin <現在いるブランチ名>

直前にいたブランチを指定する

$ git checkout -

これはトピックブランチで作業が終わった後などに使うと便利。

$ git checkout master
$ git merge -

ブランチのを指定する

$ git checkout develop@{0}

rebase を多用する人向けです。

その他のTips

見えないチカラ: 【翻訳】あなたの知らないGit Tips に便利なTipsがあるので、こちらも参考に。
このTipsに書かれているものは省略してあります。

参考資料 - Web

Pro Git

SCMBootCamp のGit入門資料

参考資料 - 書籍

入門Git

入門Git

*1:私はgit config --global alias.psh "push -u origin HEAD"を設定しています