Open2

Git関連

eichisandeneichisanden

.gitconfig

定番で入れておきたい設定をメモ

user.name=eichisanden
user.email=eichisanden@users.noreply.github.com
pull.rebase=true
init.defaultbranch=main
rerere.enabled=true
core.pager=delta
delta.line-numbers=true
delta.side-by-side=true
eichisandeneichisanden

コミットログを検索する

git log --grep キーワードで検索可能。

$ git log --grep 17269
commit 11b77ba496ed8feea2be8d87c55073d0cd4bddd4
Author: eichisanden <eichisanden@example.com>
Date:   Mon Feb 27 13:40:49 2017 +0900

    #17269 ログインIDを表示していない(columnsの配列にログインIDのレコードがない)場合は重複チェックしないように修正

    またログインIDが表示されているが、未入力の場合は空文字で存在チェックされていたが、チェックしないよう修正

指定した種類の変更だけを git diff したい

git diff --diff-filter=M

A (追加)、C (コピー)、D (削除)、R (リネーム)、などが指定可能

指定した種類の変更をしたコミットを git logで見たい

git log --diff-filter=D --summary

A (追加)、C (コピー)、D (削除)、R (リネーム)、などが指定可能

指定した時点のファイルの中身を確認したい

git show コミットハッシュ値:/path/to/file

特定のリビジョンのファイルに対して、それぞれの行がどのリビジョンまで存在していたかを確認確認する

git blame --reverse を用いると、「特定のリビジョンのファイルに対して、それぞれの行がどのリビジョンまで存在していたか」を取得できます。

git blame --reverse START..END /path/to/file

上の例においては、START リビジョンにおける /path/to/file のそれぞれの行に対して、指定されたリビジョン範囲の中で、最後にその行が存在していたリビジョンを blame で求めることができます。

git log -p を正規表現で絞りこむ

git log -p -G 正規表現

指定したコミットを含んでいるブランチを調べる

git branch -a --contains コミットハッシュ値

今回のバージョンで変更したファイルの一覧を見たい

git diff feature-a master --name-only

マージ済みのブランチを一括削除するワンライナー

git branch --merged |grep -v '*'|xargs -I % git branch -d %

GitLab上ではすでに削除されている追跡ブランチ(origin/xxxブランチ)を一気に削除したい

下記のコマンドで一気に削除可能です。

git fetch --prune

git config --global fetch.prune true で、 git fetch/pull 時に常に実行させることも可能。

追跡ブランチを確認&設定したい

下記のコマンドで確認できる。[]内に追跡中のブランチが表示される。feture1は追跡ブランチがない状態。

git branch -vv
  master     2053e2a [origin/master] Merge branch 'feature-a' into 'master'
  feture1    cb8f5e7 コメントを修正

設定は下記コマンドで行う

# 追跡させたいローカルブランチにcheckoutした状態で
git branch --set-upstream-to=origin/[ブランチ名]
# オプションは -u という省略形があります
git branch -u origin/[ブランチ名]

# または、push 時に -u オプションをつける
git push -u origin [ブランチ名]

自分用の.gitignoreを指定したい

ホームディレクトリに .gitignore ファイルを置いて git config に登録しましょう。

git config --global core.excludesfile ~/.gitignore

個人的に無視したいファイルを登録しても良いですし、古いバージョンには .gitignore をコミットしてないので古いブランチをcheckoutする方は登録する良いかと。

空フォルダをリポジトリで管理したい

Subversionと違って空フォルダをコミットできません。 .gitkeep というファイル名で0バイトのファイルを置くのが慣例ですのでそれに従いましょう。

特定のファイルだけstashしたい

git add -p と同じように差分を見ながら指定可能。

git stash -p

stash から特定のファイルを取りだしたい

git checkout stash@{[番号]} [ファイル名]
  • 番号は git stash list で調べておく
$ git stash list
stash@{0}: WIP on duplicate_mail_attach_item: working
stash@{1}: On duplicate_mail_attach_item: gitattr
stash@{2}: On duplicate_mail_attach_item: wip

ブランチとタグの名前が被っている場合の削除方法

ブランチを消す時に git push origin :<branchname> とやるとエラーになるので下記のように削除する。
上記で対応できますが、ブランチ名とタグ名はぶつからない命名ルールにしましょう。

git push origin :refs/tags/<tag_name>
git push origin :refs/heads/<branch_name>

改行コードの違いを無視してDIFFしたい

w オプション付きで git diff を実行することで可能。

git diff -w
git diff --cached -w

行の一部分の変更を見やすくDIFFしたい

--word-diff オプション付きで git diff を実行すると、変更前が [-○○○-] 、変更後が {+○○○+} と並んで表示される。

  debug.log('Hello, [-World-]{+Tokyo+}');

自動変換された改行コードを戻してpullしたい

git config --global core.autoCRLF false をしていてもダメな場合はcloneし直しでもいいけど以下のコマンドで対処できる

(git ls-files | xargs git rm -rf) && git reset --hard

gitで管理対象のファイルを一旦すべて消してresetして最新commitに戻してる(やってることは再cloneと同じ)。


コンフリクトを解決した内容を記録しておきたい

rerereを有効にしておくと2回目は自動で同じ修正を取り込んでくれるのでコミットするだけで済む。

git config --global rerere.enabled trueと打つか、コンフィグに追加する

rerere.enabled=true

Diffが1行ずれないようにしたい

※ある時点でindent-heuristicオプションがデフォルト有効になったので気にしなくて良い

以前までは、例えばfor文を1つ追加したのに、直後におなじような文があるとDiffを見ると1行ずれてしまいました。

for i := 0; i < 10; i++ {
+    fmt.Println(i)
+}
+   for i := 0; i < 10; i++ {
    list = append(list, i)
}
git diff --indent-heuristic

git 2.11からは--indent-heuristic オプションを付けると正しくDiffされるようになりました。

+for i := 0; i < 10; i++ {
+    fmt.Println(i)
+}
for i := 0; i < 10; i++ {
    list = append(list, i)
}

git configでデフォルトにすることも可能です。

git config --global diff.indentHeuristic true