Hatena::ブログ(Diary)

アジャイルSEを目指すブログ

2011-12-06

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

思い浮かんだGitTipsを列挙してみました。

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

git-completion.bash を入れると、<tab>でコマンドの補完が効くようになります。

また、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.

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

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

f:id:sinsoku:20111206011103p:image:w600

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

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

自分の環境で常に無視したいファイル(vimで作られる.swpなど)は~/.gitignore_global で管理するといい。

このignore設定は他のユーザと共有されません。

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

無視したいファイルをプロジェクト全体で共有したくない場合、<GIT_ROOT>/.git/info/exclude で管理する事もできます。

このignore設定も前述した.gitignore_globalと同様に他のユーザと共有されません。

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

$ git config --global core.quotepath false

f:id:sinsoku:20111206011104p:image:w600

タグをpushする

$ git push origin <タグ名>

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

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

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

f:id:sinsoku:20111206011102p:image:w600

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

$ 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

f:id:sinsoku:20111206011107p:image:w600

同様のことを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/<tag-name>にリネームする

$ 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 オプションを使うと、タグメッセージとタグを打った人・打った日時を残す事が出来ます。

f:id:sinsoku:20111206011105p:image:w600

直近のタグを調べる

$ git describe

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

f:id:sinsoku:20111206011106p:image:w600

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

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

$ git push origin HEAD

pushの時にブランチ名を入力せずにpush出来て便利。*1

HEADがブランチでない場合はエラーになります。

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

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

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

$ git checkout -

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

$ git checkout master
$ git merge -

ブランチの<sha-1>を指定する

$ 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"を設定しています

shucreamshucream 2011/12/06 10:02 ブランチの削除は、git push origin <ローカルブランチ名>:<リモートブランチ名> なので、空のローカルブランチをリモートブランチにpushすると考えると多少覚えやすいです。
また、最近は git push --delete というだいぶhuman readableなオプションがあるので、こちらを使うのをお勧めしています。

sinsokusinsoku 2011/12/07 11:54 >shucream さん
--deleteなんてオプションがあったのですね!
ありがとうございます:-)

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

リンク元