このページの内容

Awesome Tips

Tipsを扱う資料や関連プロジェクトをまとめたAwesomeリストです。

目次

基本操作

指定コミットまでの全ファイルを一覧表示

git ls-tree --name-only -r <commit-ish>

直前のブランチへ素早く切り替える

git checkout -

Alternatives:

git checkout @{-1}

リモートブランチを削除

git push origin --delete <remote_branchname>

Alternatives:

git push origin :<remote_branchname>
git branch -dr <remote/branch>

リモートタグを削除

git push origin :refs/tags/<tag-name>

インデックス(ステージ)の内容でローカル変更を取り消す

git checkout -- <file_name>

Alternatives:

git restore <file_name>

直前のコミットメッセージを書き換える

git commit -v --amend

現在のブランチだけのコミット履歴を表示

git cherry -v master

作者情報を修正

git commit --amend --author='Author Name <email@address.com>'

変更ファイル全体ではなく一部だけをステージ

git add -p

cherry-pickで別ブランチのコミットを取り込む

git checkout <branch-name> && git cherry-pick <commit-ish>

スタッシュから単一ファイルを取り出す

git checkout <stash@{n}> -- <file_path>

Alternatives:

git checkout stash@{0} -- <file_path>

リポジトリから新しいワークツリーを作成(Git 2.5)

git worktree add -b <branch-name> <path> <start-point>

HEADの状態から新しいワークツリーを作成

git worktree add --detach <path> HEAD

現在のブランチにありmasterへ未マージの全コミットを表示

git cherry -v master

Alternatives:

git cherry -v master <branch-to-be-merged>

コミットメッセージを変えずに直前のコミットを修正

git add --all && git commit --amend --no-edit

リモートで削除済みのブランチ参照を整理

git fetch -p

Alternatives:

git remote prune origin

最初のリビジョンのコミットハッシュを取得

 git rev-list --reverse HEAD | head -1

Alternatives:

git rev-list --max-parents=0 HEAD
git log --pretty=oneline | tail -1 | cut -c 1-40
git log --pretty=oneline --reverse | head -1 | cut -c 1-40

バンドルからインポート

git clone repo.bundle <repo-dir> -b <branch-name>

コミット時に1ファイルを無視(例: Changelog)

git update-index --assume-unchanged Changelog; git commit -a; git update-index --no-assume-unchanged Changelog

ID指定のプルリクエストをローカルブランチへ取得

git fetch origin pull/<id>/head:<branch-name>

Alternatives:

git pull origin pull/<id>/head:<branch-name>

削除したファイルを復元

git checkout <deleting_commit> -- <file_path>

特定のコミットハッシュの状態へファイルを復元

git checkout <commit-ish> -- <file_path>

以前のコミットに対する修正としてマーク

git commit --fixup <SHA-1>

ステージ領域を経由せずコミット

git commit --only <file_path>

対話的にステージ

git add -i

無視対象ファイルの状態を表示

git status --ignored

履歴のない新規ブランチをチェックアウト

git checkout --orphan <branch_name>

二分探索で原因コミットを特定

git bisect start                    # Search start 
git bisect bad                      # Set point to bad commit 
git bisect good v2.6.13-rc2         # Set point to good commit|tag 
git bisect bad                      # Say current state is bad 
git bisect good                     # Say current state is good 
git bisect reset                    # Finish search 

pre-commitとcommit-msgフックを迂回

git commit --no-verify

単一ブランチだけをクローン

git clone -b <branch-name> --single-branch https://github.com/user/repo.git

新規ブランチを作成して切り替える

git checkout -b <branch-name>

Alternatives:

git branch <branch-name> && git checkout <branch-name>
git switch -c <branch-name>

ローカルブランチを最新コミット順に表示

git for-each-ref --sort=-committerdate --format='%(refname:short)' refs/heads/

リポジトリをシャロークローン

git clone https://github.com/user/repo.git --depth 1

リモートリポジトリへ強制プッシュ

git push -f <remote-name> <branch-name>

コミットを作者とタイトルでグループ化

git shortlog

他者の作業を上書きしない安全な強制プッシュ

git push --force-with-lease <remote-name> <branch-name>

ブランチ内のコミット数

git rev-list --count <branch-name>

オブジェクトノートを追加

git notes add -m 'Note on the previous commit....'

別リポジトリのコミットを適用

git --git-dir=<source-dir>/.git format-patch -k -1 --stdout <SHA1> | git am -3 -k

特定の参照をフェッチ

git fetch origin master:refs/remotes/origin/mymaster

未確定変更の概要を生成

git request-pull v1.0 https://git.ko.xz/project master:for-linus

Git状態を短縮表示

git status --short --branch

1日前より前のコミットをチェックアウト

git checkout master@{yesterday}

現在のブランチをリモートの同名ブランチへプッシュ

git push origin HEAD

新しいローカルブランチをリモートへプッシュして追跡

git push -u origin <branch_name>

サブモジュールを最新コミットへ更新

cd <path-to-submodule>
git pull origin <branch>
cd <root-of-your-main-project>
git add <path-to-submodule>
git commit -m "submodule updated"

リポジトリを複製

git clone --bare https://github.com/exampleuser/old-repository.git

git push --mirror https://github.com/exampleuser/new-repository.git

スパースチェックアウトで特定ディレクトリだけをクローン

git clone --filter=blob:none --sparse <url> && cd <repo> && git sparse-checkout set <dir1> <dir2>

出力を列形式で表示

git branch --column

Alternatives:

git tag --column

ワークツリーを一覧表示

git worktree list

ワークツリーを削除

git worktree remove <path>

Alternatives:

git worktree prune

ブランチ操作

masterへマージ済みの全ブランチを一覧表示

git branch --merged master

masterへマージ済みのブランチを削除

git branch --merged master | grep -v '^\*' | xargs -n 1 git branch -d

Alternatives:

git branch --merged master | grep -v '^\*\|  master' | xargs -n 1 git branch -d # will not delete master if master is not checked out

全ブランチ、上流、最終コミットを一覧表示

git branch -vv

上流ブランチを追跡

git branch -u origin/mybranch

ローカルブランチを削除

git branch -d <local_branchname>

ローカル・リモートの全ブランチを取得

git branch -a

リモートブランチだけを取得

git branch -r

指定コミットハッシュを含むブランチを検索

git branch -a --contains <commit-ish>

Alternatives:

git branch --contains <commit-ish>

ブランチ名を変更

git branch -m <new-branch-name>

Alternatives:

git branch -m [<old-branch-name>] <new-branch-name>

masterブランチをアーカイブ

git archive master --format=zip --output=master.zip

リモートでsquashマージ済みのローカルブランチを削除

git branch -vv | grep ': gone]' | awk '{print $1}' | xargs git branch -D

履歴付きブランチをファイルへエクスポート

git bundle create <file> <branch-name>

現在のブランチ名を取得

git rev-parse --abbrev-ref HEAD

現在のブランチの最新タグを表示

git describe --tags --abbrev=0

WIPの全ブランチを一覧表示

git checkout master && git branch --no-merged

整形済みパッチファイル

git format-patch -M upstream..topic

ブランチへ切り替える(checkoutの新しい代替)

git switch <branch-name>

Alternatives:

git switch -c <new-branch-name>

ログと履歴

Git付属の役立つガイドを表示

git help -g

内容から変更を検索

git log -S'<a term in the source>'

特定ファイルの時系列変更を表示

git log -p <file_name>

競合中の全ファイルを一覧表示

git diff --name-only --diff-filter=U

コミットで変更された全ファイルを一覧表示

git diff-tree --no-commit-id --name-only -r <commit-ish>

前回コミット以降の未ステージ変更

git diff

コミット用にステージした変更

git diff --cached

Alternatives:

git diff --staged

ステージ済み・未ステージ変更を両方表示

git diff HEAD

2週間前からの変更を表示

git log --no-merges --raw --since='2 weeks ago'

Alternatives:

git whatchanged --since='2 weeks ago'

masterから分岐後の全コミットを表示

git log --no-merges --stat --reverse master..

追跡中の全ファイルを表示

git ls-files -t

未追跡の全ファイルを表示

git ls-files --others

無視対象の全ファイルを表示

git ls-files --others -i --exclude-standard

バージョンツリーを可視化

git log --pretty=oneline --graph --decorate --all

Alternatives:

gitk --all
git log --graph --pretty=format:'%C(auto) %h | %s | %an | %ar%d'

reflogからのみ参照されるコミットを含めてツリーを可視化

git log --graph --decorate --oneline $(git rev-list --walk-reflogs --all)

単語単位のインライン差分を表示

git diff --word-diff

一般的な差分ツールで変更を表示

git difftool [-t <tool>] <commit1> <commit2> <path>

Branch2にないBranch1のコミット

git log Branch1 ^Branch2

直近n件のコミットを一覧表示

git log -<n>

Alternatives:

git log -n <n>

競合中の全ファイルをエディターで開く

git diff --name-only | uniq | xargs $EDITOR

コミットログのGPG署名を表示

git log --show-signature

別ブランチからファイルを取り出す

git show <branch_name>:<file_name>

ルートコミットとマージコミットだけを表示

git log --first-parent

名前変更をまたいで特定ファイルのコミットと変更を表示

git log --follow -p -- <file_path>

全ブランチのコミットログから指定テキストを検索

git log --all --grep='<given-text>'

masterから見たブランチ最初のコミットを取得

git log --oneline master..<branch-name> | tail -1

Alternatives:

git log --reverse master..<branch-name> | head -6

指定ファイルの各行について作者・時刻・最終リビジョンを表示

git blame <file-name>

作者ごとの寄与行数を表示

git log --author='_Your_Name_Here_' --pretty=tformat: --numstat | gawk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s removed lines: %s total lines: %s
", add, subs, loc }' -

Alternatives:

git log --author='_Your_Name_Here_' --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s
", add, subs, loc }' - # on Mac OSX

すべてのgit notesを表示

git log --show-notes='*'

未プッシュのGitコミットを一覧表示

git log --branches --not --remotes

Alternatives:

git log @{u}..
git cherry -v

空白だけの変更を除いてすべて追加

git diff --ignore-all-space | git apply --cached

指定範囲をblame

git blame -L <start>,<end>

Gitの論理変数を表示

git var -l | <variable>

リポジトリ名を取得

git rev-parse --show-toplevel

指定期間のログ

git log --since='FEB 1 2017' --until='FEB 14 2017'

ログから作者を除外

git log --perl-regexp --author='^((?!excluded-author-regex).*)$'

直前コミットの変更詳細を展開表示

git show

過去30日間のHEAD位置を可視化

git reflog

リベース前後のブランチを比較

git range-diff <base>..<old-tip> <base>..<new-tip>

Alternatives:

git range-diff <rev1>...<rev2>

テストスクリプトでbisectを自動化

git bisect start <bad> <good> && git bisect run <script>

行範囲を指定してblame

git blame -L <start>,<end> <file>

Alternatives:

git blame -L :'<funcname>' <file>

blameで移動・コピーされた行を検出

git blame -M -C <file>

Alternatives:

git blame -C -C -C <file>

グラフ付きoneline形式でログ表示

git log --oneline --graph --all --decorate

ファイルが削除されたコミットを検索

git log --diff-filter=D --summary | grep delete

Alternatives:

git log --all --full-history -- <file>

期間別・作者別のコミット数を表示

git shortlog -sn --since='1 year ago'

Alternatives:

git shortlog -sne --all

コミット署名を検証

git verify-commit <commit>

Alternatives:

git log --show-signature

単語単位の差分を色付きで表示

git diff --color-words

Alternatives:

git diff --word-diff=color

マージとリベース

’feature’を’master’へリベースしてmasterへマージ

git rebase master feature && git checkout master && git merge -

リベース前に変更をスタッシュ

git rebase --autostash

fixupコミットを通常コミットへsquash

git rebase -i --autosquash

対話的リベースで直前2コミットを変更

git rebase --interactive HEAD~2

2ブランチの共通祖先を検索

git merge-base <branch-name> <other-branch-name>

ブランチのベースを変更

git rebase --onto <new_base> <old_base>

fixupコミットを作成して自動squash

git commit --fixup=<commit> && git rebase -i --autosquash <commit>~1

ルートコミットから対話的にリベース

git rebase -i --root

その他

日常Gitを約20コマンドで

git help everyday

ファイルを削除せず追跡解除

git rm --cached <file_path>

Alternatives:

git rm --cached -r <directory_path>

追跡ファイルの変更を考慮しない

git update-index --assume-unchanged <file_name>

変更がリリースに含まれるか確認

git name-rev --name-only <SHA-1>

無視対象ファイルを一覧表示

git check-ignore *

未パックオブジェクト数とディスク使用量を集計

git count-objects --human-readable

オブジェクトDBから到達不能オブジェクトをすべて除去

git gc --prune=now --aggressive

作業リポジトリをgitwebですぐ閲覧

git instaweb [--local] [--httpd=<httpd>] [--port=<port>] [--browser=<browser>]

追跡ファイルからパターン(正規表現または文字列)に一致する行を検索

git grep --heading --line-number 'foo bar'

未追跡ファイルをバックアップ

git ls-files --others -i --exclude-standard | xargs zip untracked.zip

複数パッチをメール送信

git send-email [<options>] <file|directory>

git send-email [<options>] <format-patch options>

リモート

リモートURLを変更

git remote set-url origin <URL>

全リモート参照を取得

git remote

Alternatives:

git remote show

リモート名を追加

git remote add <remote-nickname> <remote-url>

設定済みの全リモートを一覧表示

git remote -v

リモートリポジトリの参照を一覧表示

git ls-remote git://git.kernel.org/pub/scm/git/git.git

リモートブランチ一覧を更新

git remote update origin --prune

オフライン共有用バンドルを作成

git bundle create <file>.bundle --all

Alternatives:

git bundle create <file>.bundle <branch-name>

バンドルファイルからクローン

git clone <file>.bundle <directory>

部分クローンでblobを除外し高速取得

git clone --filter=blob:none <url>

Alternatives:

git clone --filter=tree:0 <url>

セットアップと設定

プッシュ後の履歴から機密データを削除

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <path-to-your-file>' --prune-empty --tag-name-filter cat -- --all && git push origin --force --all

グローバル設定変更後に作者情報を再設定

git commit --amend --reset-author --no-edit

GitのBash補完を取得

curl -L http://git.io/vfhol > ~/.git-completion.bash && echo '[ -f ~/.git-completion.bash ] && . ~/.git-completion.bash' >> ~/.bashrc

Gitエイリアス

git config --global alias.<handle> <command> 
git config --global alias.st status

pull時は常にmergeでなくrebase

git config --global pull.rebase true

Alternatives:

#git < 1.7.9
git config --global branch.autosetuprebase always

全エイリアスと設定を一覧表示

git config --list

Gitで大文字小文字を区別

git config --global core.ignorecase false

カスタムエディターを追加

git config --global core.editor '$EDITOR'

タイプミスを自動修正

git config --global help.autocorrect 1

競合解決を記録して再利用

git config --global rerere.enabled 1

グローバル設定の項目を削除

git config --global --unset <entry-name>

コミット時にファイルモード変更を無視

git config core.fileMode false

Gitの端末カラー出力を無効化

git config --global color.ui false

個別の色設定

git config --global <specific command e.g branch, diff> <true, false or always>

エイリアス: git undo

git config --global alias.undo '!f() { git reset --hard $(git rev-parse --abbrev-ref HEAD)@{${1-1}}; }; f'

[ローカル/グローバル] Git設定を編集

git config [--global] --edit

全Gitエイリアスを一覧表示

git config -l | grep alias | sed 's/^alias\.//g'

Alternatives:

git config -l | grep alias | cut -d '.' -f 2

リモート接続にHTTPSでなくSSHを使用

git config --global url.'git@github.com:'.insteadOf 'https://github.com/'

LFからCRLFへの自動置換を防止

git config --global core.autocrlf false

各レベルの設定を編集

git config --edit --system

git config --edit --global

git config --edit --local

バックグラウンド保守を有効化して操作を高速化

git maintenance start

Alternatives:

git maintenance run --task=gc

GPGでなくSSH鍵でコミット署名

git config gpg.format ssh && git config user.signingkey ~/.ssh/id_ed25519.pub && git commit -S -m '<message>'

rerereで再発するマージ競合を自動解決

git config rerere.enabled true

新規リポジトリの既定ブランチ名を設定

git config --global init.defaultBranch main

スタッシュ

追跡ファイルの現在状態をコミットせず保存

git stash

Alternatives:

git stash push

追跡ファイルの未ステージ変更を保存

git stash -k

Alternatives:

git stash --keep-index
git stash push --keep-index

未追跡ファイルを含めて現在状態を保存

git stash -u

Alternatives:

git stash push -u
git stash push --include-untracked

メッセージ付きで現在状態を保存

git stash push -m <message>

Alternatives:

git stash push --message <message>

無視・未追跡・追跡中の全ファイル状態を保存

git stash -a

Alternatives:

git stash --all
git stash push --all

保存済みスタッシュを一覧表示

git stash list

任意のスタッシュ内容をパッチ形式で表示

git stash show -p <stash@{n}>

一覧から削除せず任意のスタッシュを適用

git stash apply <stash@{n}>

最後のスタッシュを適用して一覧から削除

git stash pop

Alternatives:

git stash apply stash@{0} && git stash drop stash@{0}

保存済みスタッシュをすべて削除

git stash clear

Alternatives:

git stash drop <stash@{n}>

未ステージ変更だけをスタッシュ

git stash push --keep-index

特定ファイルをスタッシュ

git stash push -m '<message>' <file1> <file2>

スタッシュのdiffstat概要を表示

git stash show --stat <stash@{n}>

Alternatives:

git stash show -p <stash@{n}>

サブモジュールとサブツリー

全サブモジュールを更新

git submodule foreach git pull

Alternatives:

git submodule update --init --recursive
git submodule update --remote

Git追跡中のサブフォルダーをgh-pagesへ配備

git subtree push --prefix subfolder_name origin gh-pages

Alternatives:

git subtree push --prefix subfolder_name origin branch_name

subtreeでプロジェクトをリポジトリへ追加

git subtree add --prefix=<directory_name>/<project_name> --squash git@github.com:<username>/<project_name>.git master

subtreeで連携プロジェクトの最新変更を取得

git subtree pull --prefix=<directory_name>/<project_name> --squash git@github.com:<username>/<project_name>.git master

タグ

ローカルタグを作成

git tag <tag-name>

ローカルタグを削除

git tag -d <tag-name>

変更の取り消し

リモートと同期してローカル変更を上書き

git fetch origin && git reset --hard origin/master && git clean -f -d

最初のコミットへGit reset

git update-ref -d HEAD

Reset: 未コミットのローカル変更を保持

git reset --keep <commit>

Revert: 新しいコミットを作成してコミットを取り消す

git revert <commit-ish>

Reset: コミットを破棄(非公開ブランチ向け)

git reset <commit-ish>

未追跡ファイル・ディレクトリの削除前にdry-runで一覧確認

git clean -n

未追跡ファイルを強制削除

git clean -f

未追跡ディレクトリを強制削除

git clean -f -d

assume-unchangedを取り消す

git update-index --no-assume-unchanged <file_name>

.gitignore対象ファイルをクリーン

git clean -X -f

dry-run(対応する任意のコマンドで実行可能)

git clean -fd --dry-run

ステージ済みファイルをステージ解除

git reset HEAD <file-name>

Revert: マージ全体を取り消す

git revert -m 1 <commit-ish>

ファイルを復元(reset/checkout —の新しい代替)

git restore <file-name>

Alternatives:

git restore --staged <file-name>