.gitconfig

設定を確認するには

[bash] $ git config –global –list [/bash]

.gitignore

gitで管理中のファイルを途中からignoreするには.gitignoreに追加して、

$ git rm --cached <ファイル名>

git add

オプション 説明
-u インデックスから変更されているすべてのファイルの内容を、インデックスに記録
-A -uに加え、.gitignoreで無視されていない新ファイルもインデックスに記録
指定したファイル(ディレクトリを追加した場合は、その中野バージョン管理対象の前ファイル)の内容をインデックスに追加
-p パッチを対話的に選択した内容を、インデックスに追加

git checkout

git rebase

自動でstashさせるには--auto-stashを使う(Git 2.7 の優れた新機能 – Atlassian Japan)。

git commitをまとめる

3つまとめたい場合は

$ git rebase -i HEAD~3

と打つと、エディタが起動して

pick 237ba89 minor change
pick 56c5b11 unite grepの設定
pick f6cdbca minor chagne

# Rebase aa274aa..f6cdbca onto aa274aa
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

という画面が出てくるので、

pick 237ba89 minor change
s 56c5b11 unite grepの設定
s f6cdbca minor chagne

のように変更して、エディタを終了。するとコミットメッセージの編集画面が出てくるので、編集して終了する。

rebase取り消すには

$ git reset --hard ORIG_HEAD

rebase後にcommitやmergeをしてしまった場合はだめ。その場合は

$ git reflog

して、戻したい位置(例えばf6cdbca HEAD@{4})を探して

[bash] $ git reset –hard f6cdbca \# or \$ git reset –hard HEAD@{4} [/bash]

とすればよい。

git push

使い方

$ git push <プッシュ先リポジトリ> <ローカルブランチ>:<リモートブランチ>

で指定する

$ git push

$ git push origin <現在のブランチ>:<現在のブランチ>

の省略形。

$ git push origin <ブランチ>

$ git push origin <ブランチ>:<ブランチ>

の省略形

$ git pushのデフォルトの挙動については、gitのpush.defaultに関するノウハウ – Qiitaを参照。

git pushを取り消す

あやまって、リモートにpushしてしまい、ローカルで修正後、あらためてpushしたい

リモートoriginのコミットをまず取り消す。

具体的にはリモートのoriginのmasterに対して、ローカルのHEADの一つ前の状態に強制的に変更する。

$ git push -f origin HEAD^:master

ローカルのコミットを取り消す

$ git reset --soft HEAD^

対象のファイルをunstageにする

$ git reset HEAD <対象のファイル>

変更したら、commitしてpushする。

リモートのoriginのmasterに対して、ローカルのHEADの一つ前の状態に強制的に変更している。

ローカルとリモートのコミットを取り消す

git rebase -i HEAD~2 ← エディタが開くので二行目を削除して保存する
git push origin master

これをやるとローカルの変更が失われるので注意

git log

コミットのdiffで絞り込む

ある文字列が加えられてた、もしくは削除されたコミットを絞り込む

$ git log -S<string>

--pickaxe-regexをつけるとPOSIXの正規表現が使える

$ git log -S<regex> --pickaxe-regex

コミットのdiffにある正規表現が含まれるコミットをしぼりこむ

$ git log -G<regex>

-S-Gの違いは以下の様なコミットがあった時

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

git log -G"regexec\(regexp"はこのコミットを表示するが、git log -S"regexec\(regexp" --pickaxe-regexは表示されない。

$ man git-log-S, -Gの部分参照。

git bisect

バグがある時点をbad、バグがなかった時点をgoodと設定して、二分探索でバグを生み出したコミットを探すのを補助してくれるコマンド。

使いかた

まずリポジトリトップで

$ git bisect start
$ git bisect bad

と打つ。問題がないと思われるコミットをcheckout

$ git co <問題がないsha1>

して、実際問題がなければ

$ git bisect good

問題があったら、さらに遡って、checkoutする。

git bisect goodすると、badとgoodの中間のコミットをcheckoutしてくれるので、それに問題があればgit bisect bad、問題がなければgit bisect goodして、これを繰り返していくと、最終的に

$ git bisect good
b047b02ea83310a70fd603dc8cd7a6cd13d15c04 is first bad commit
commit b047b02ea83310a70fd603dc8cd7a6cd13d15c04
Author: PJ Hyett <[email protected]>
Date:   Tue Jan 27 14:48:32 2009 -0800

    secure this thing

:040000 040000 40ee3e7821b895e52c1695092db9bdc4c61d1730
f24d3c6ebcfc639b1a3814550e62d60b8e68a8e4 M  config

のようなbadになった原因となるコミットを発見してくれる。

$ git diff b047b02ea83310a70fd603dc8cd7a6cd13d15c04

などで、変更点を確認して、

$ git bisect reset

して、問題点を直す。

正常なときはステータス0、異常なときは0以外のステータスを返すスクリプト(ここではtest-error.shとする)がある場合は、自動化ができる。

壊れているコミットがHEAD、正しく動作しているコミットがv1.0のとき

$ git bisect start HEAD v1.0
$ git bisect run test-error.sh

を実行すると、原因となるコミットを自動的に見つけてくれる。

コミットメーセージ

プロトコル

インストール

FreeBSD

fakegit

インストール出来ない環境で、git cloneを別コマンドで擬似的にやる。

リンク