Edited at

めんどくせーので個人用Gitメモ晒す

More than 1 year has passed since last update.

Gitメモ

基本的に-nか--dry-runで何をするか確認できる

色々ありすぎて理解しきれない→本買うよりここ http://git-scm.com/book/ja

zshあればbranchとか補完してくれて便利

よくまとまってる

http://transitive.info/article/git/

システムの人はこれ見た方が早い

http://keijinsonyaban.blogspot.jp/2011/05/git.html?m=1

gitのversionはできるだけ新しいものを使いたい(1.7.1だとorphenとかsingle-branchとか無い)

クローン

git clone ssh or http repo

ブランチ指定クローン

git clone -b branch git@...

ミラー

git clone --mirror repo

ブランチだけクローン(1.7.10以降?)

git clone --single-branch repo -b branch

fetchすると残り取ってくる

引数無しの時のpushモード変更

git config --global push.default simple ブランチ名が現在のブランチと同じときだけpush 1.8から?

simple(upstreamと同名のbranchだけpush)

nothing (必ず指定)

matching(masterとか含めて同名なら全てpush、1.7のデフォ)

upstream(trackingしているbranchにのみpush)

current(現在のcheckoutしているブランチと同名のリモートブランチだけpushする)

もある

checkout

git checkout hash or -b branch origin/branchname

直前のブランチに移動

git checkout -

一部stageを元に戻す(add -pの反対)

git checkout -p filename

add系

再帰的にadd

git add .

消えてるファイルを、削除をaddする

git add -u

上の両方を同時

git add -A

branch削除

git branch -d branch

リモート

git push origin :branch

branchの関係を表示

git show-branch -a

現在のbranchにpush

git push origin HEAD

push取り消し

git push origin HEAD^^^^:+master とか注意

コンフリクト想定でpullする

git pull --rebase

rebaseでのコミットの書き換え(hash変わる)

git rebase -i HEAD~5

git add file

git commit --amend

git rebase --continue

コミットの分割(hash変わる)

git rebase -i HEAD~5

編集するcommitをeditにする

git checkout hash or ref -- fileで戻す

git commit --amend

checkoutで拾う、mergeとかして繰返し

git rebase --continue

圧縮コミット

git rebase -i HEAD~1

圧縮するコミットをsquash

コミットログ入れる

git rebase --continue

コミットの順番を入れ替える

git rebase -i HEAD~5

エディタで行を入れ替えて保存するとrebaseされる

直前のcommit

git commit --amend

現在のワーキングツリーの更新を直前のcommitにコメントそのままで追加

git commit -a --amend -C HEAD

add取り消し

git reset HEAD -- file

再帰的にadd

git add .

消えてるファイルを、削除をaddする

git add -u

上の両方を同時

git add -A

addしたいのはファイルの一部だけ

git add -p file

addやり直し

git rm --cached -- file

書き換えたpush -f 付きと同じ?

git push origin +master

無名ブランチでcommitしちゃった→reflogで戻す

git reflog確認

git reset --hard or --soft HEAD@{1}

hash確認

git checkout branch

git cherry-pick hash

git commit

なんかいろいろやり直したい

reflogで好きなとこ選んで

git reset --hard HEAD

git reset --hard HEAD@{ref}

gitに入ってないファイルを削除

git clean -n

git clean -f

hashの含まれるbranchをindexから探す

git branch --contains hash

hashの含まれるtagをindexから探す

git name-rev --name-only hash

git log -n1 hash | git name-rev --stdin とかも可能

indexに入ってるファイルをls

git ls-files

ls-treeもls-remoteもある

svn catみたいなもん

git show rev:filename

zipでくれ

archive --format=zip --prefix=archive/ HEAD -o archive.zip

変更のあったファイルだけtarで固める

git diff hash..tohash --name-only | tar czvf - -T - > chenged_files.tgz

stashで一回保存

git stash

確認

git stash list

git stash show

branch移すなりしてから適用

git pop

git apply削除しない

ログみたいcommit内容見たいdiffみたい

git log branch..tobranch or hash..tohash or ref..toref < -- file>

git show branch..tobranch or hash..tohash or ref..toref < -- file>

git diff branch..tobranch or hash..tohash or ref..toref < -- file>

reflog付き

git log -g

git cherry-pick hash 現在のブランチにcommit取り込み

git cherry -v master ブランチの上流に既に存在している変更を知る

git notes add hash or commitとかbranchとかに注釈を付ける

git notes remove hadh or commit 削除

git notes edit hadh or commit 削除

git diff ^hash..tohash showと同じじゃん、、

log

git shortlog リリース用のタイトルだけ取得

tag系

git tag -nlで確認

git checkout refs/tags/v2 チェックアウト

git checkout -b v2 refs/tags/v2 ブランチ+チェックアウト

git tag v2 hash タグ作る

git push --tags origin pushする

git push origin :v2 タグ消す

検索する

git grep <--cached> command

stringの含まれるcommitを探す

git log -S "string"

git log -G "regex" 正規表現

git log -G "regex" --patch 正規表現+patch形式

commitからbranchを探す

git branch -r --contains 0dc2f72

リモートも含めて検索が-r

とあるファイルと同じ変更を別ファイルにもしたい

git diff -- fromfile | patch tofile

gitでpatchを作る

git diff hash or branch..tobranch > branch.patch

適用

git apply branch.patch

設定確認global付けると全体設定

git config --global user.email "kota@insaneworks.co.jp"

git config --global user.name "Kota Shiratsuka"

git config <--global> -l

git config <--global> -eでエディタで編集

git config --remove-sectionとか削除

git config --global core.excludesfile ~/.gitignore_globalとかで項目毎に設定

.gitignore_globalで.DS_Storeとか*.swp入れとく

git config --global color.ui true色付けとく

git config core.filemode false パーミッション無視

git config --global core.autocrlf true or input or false 改行関係

git config M<--global> decorate true commitにHEADとかorigin/masterとかポインタ的な感じに表示してくれる

SQLiteをdiff表示(自分だけしか無理)

echo '*.db diff=strings' > .gitattributes

git config diff.sqlite3.textconv 'echo .dump|sqlite3'

CUIでnetwork

git log --graph <--oneline>

コミッター集計

git shortlog -ns

表示系

git config --global log.abbrevCommit true hashを可能な限り短く表示する

git config --global diff.noprefix ture diffにa/とかb/とかprefixいらない

Alias系

git config --global alias.network "log --graph --pretty=oneline" network風の表示

git config --global alias.tar "archive --format=tar --prefix=project-date +%Y%m%d/ HEAD | gzip > bar-date +%Y%m%d.tgz" tarで固める

git config --global alias.log1 "log --pretty=oneline --decorate" 一行

git config --global alias.logshow "log --stat"log+stat見る

git config --global alias.ci "commit" svn互換

git config --global alias.co "checkout" svn互換

git config --global alias.zip "archive --format=zip HEAD -o" zipでくれ

git config --global alias.tar "archive --format=tar HEAD -o" tarでくれ

git config --global alias.tgz "archive --format=tgz HEAD -o" tgzでくれ

git config --global alias.wdiff "diff --word-diff"行単位じゃなくて単語単位でdiffくれ

SVN系

git svn clone -s https://svnserve/repo

-s付けるとtrunk/tag/branches認識

git svn rebase アップデート

git svn dcommit コミット

trackの全くない孤立した(空の)ブランチを作る(1.7.10以降?)当然履歴はぶった切れる

git --orphan branch

それ以前なら

git symbolic-ref HEAD refs/heads/gh-pages

rm .git/index

git clean -fdx

危ないけど強力すぎ(reflog or branch or stash or cp -aでなんかしら予防策取っておこう)

git reflog expire --expire=now --all

svnの参照ログを全部消す

git filter-branch --msg-filter ' sed -e "/^git-svn-id:/d"

メアドとか一括変更

git filter-branch --commit-filter '

if [ "$GIT_AUTHOR_NAME" = "kota" ];

then

GIT_AUTHOR_NAME="Kota Shiratsuka";

GIT_AUTHOR_EMAIL="kota@example.com";

git commit-tree "$@";

else

git commit-tree "$@";

fi' HEAD

とあるディレクトリだけbranchに切り出す

git filter-branch --subdirectory-filter dir/

git push -u origin master:branch

pullとかfetchすると死ぬので

git pull origin branchする事

''で囲ったコマンドを実行しながらrebaseみたいな事する。hashが全部変わるので凶悪

git filter-branch --tree-filter 'rm -f passwords.txt' HEAD

消えたリモートブランチをローカルからも削除

git remote prune origin

リモートブランチ削除

git push origin :branchname

Submodule

git submodule add repo dir

まとめて更新

git submodule foreach --recursive 'git pull origin master'

検証とか

git bisect

http://qiita.com/usamik26/items/cce867b3b139ea5568a6

再パックや不要なオブジェクトをGCして容量圧縮

reflogなどは全て失われるので注意

git gc

さらに小さくするには--aggressive(デルタ再計算を行う)

http://git-scm.com/book/ja/Gitの内側-メインテナンスとデータリカバリ

git gc --prune

徹底的に消す

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch password.txt" --prune-empty -- --all

rm -rf .git/refs/original/

git reflog expire --expire=now --all

git gc --aggressive --prune=now

gcしたしreflogもないしもうダメだ

git fsck --full

git checkout hash

これでダメならバックアップから戻すか、諦める

バックアップから復旧する場合、

git pull file://git/repo

で他のリポジトリをpullできるのでrebaseなりして適切な状態まで持っていこう

Gitの参照先を見つける

git show-ref

tig使え

gitv

zshでの注意点

HEAD@{1}とかは""で囲うとかしないとblob解釈されて使えないので注意

git format-patch "HEAD^”

[kota@deathnote ~/Git/centos-packer]$ git send-email 0001-v20130101.patch

0001-v20130101.patch

Who should the emails be sent to (if any)? kota@insaneworks.co.jp

Message-ID to be used as In-Reply-To for the first email (if any)? no

Are you sure you want to use [y/N]? y

(mbox) Adding cc: Kota Shiratsuka kota@insaneworks.co.jp from line 'From: Kota Shiratsuka kota@insaneworks.co.jp'

From: Kota Shiratsuka kota@insaneworks.co.jp

To: kota@insaneworks.co.jp

Subject: [PATCH] v20130101

Date: Mon, 13 Jan 2014 02:14:35 +0900

Message-Id: 1389546875-2909-1-git-send-email-kota@insaneworks.co.jp

X-Mailer: git-send-email 1.8.5.2

In-Reply-To:

References:

The Cc list above has been expanded by additional

addresses found in the patch commit message. By default
send-email prompts before sending whenever this occurs.
This behavior is controlled by the sendemail.confirm
configuration setting.

For additional information, run 'git send-email --help'.
To retain the current behavior, but squelch this message,
run 'git config --global sendemail.confirm auto'.

Send this email? ([y]es|[n]o|[q]uit|[a]ll): y

OK. Log says:

Sendmail: /usr/sbin/sendmail -i kota@insaneworks.co.jp

From: Kota Shiratsuka kota@insaneworks.co.jp

To: kota@insaneworks.co.jp

Subject: [PATCH] v20130101

Date: Mon, 13 Jan 2014 02:14:35 +0900

Message-Id: 1389546875-2909-1-git-send-email-kota@insaneworks.co.jp

X-Mailer: git-send-email 1.8.5.2

In-Reply-To:

References:

Result: OK

署名する

.bashrcに

pgrep -q gpg-agent || eval $(gpg-agent --daemon)

とか書いとく

git commit -S -a

とか

signed-offするなら -Ss