🧞

Gitコマンドまとめ

2024/03/28に公開

Gitの認証情報をキーチェーンに保存する

git config --global credential.helper osxkeychain

エディターをviから変更する

git config --global core.editor "vim"          # vimに変更
git config --global core.editor "nano"         # nanoに変更
git config --global core.editor "code --wait"  # Visual Studio Codeに変更
git config --global core.editor "open -W -n -a CotEditor" # CotEditorに変更

コミットと同時にメッセージを追加する

git commit -m "コミットメッセージ"

Git root

Gitのrootを取得する

.gitのあるディレクトリィを取得する。

git rev-parse --show-toplevel

親Gitのrootを取得する(サブモジュール)

サブモジュールのディレクトリィで、親リポジトリィのディレクトリィを取得する

git rev-parse --show-superproject-working-tree

PUSH関連

crontabなどを使ったPUSHの自動化

httpsとsshでやり方が違う

https

アカウント名とPAT(パーソナルアクセストークン)をURLに含める。

ssh

ssh-agentデーモンを起動する。秘密キーをデーモンに登録しておくとPUSHした時にデーモンが代わりにssh接続をしてくれる。

ブランチ関連

現在(HEAD)のブランチ名を取得する

git rev-parse --abbrev-ref HEAD
git branch --show-current

ベアリポジトリィのデフォルトブランチを変更する

まずベアリポジトリィに移動する。
.git/HEADに書いてあるブランチがデフォルトになる。
cat HEADすると現在のデフォルトブランチが分かる。
おそらく直書きしてもOKだと思うが、公式に下のコマンドが用意されている。

git symbolic-ref HEAD refs/heads/<既存のブランチ名>

ブランチが存在していないとエラーになる。
既存のブランチはls refs/heads/で確認できる。
まだpushされてないブランチなら新規に作成できる。(ベアリポジトリィのディレクトリィで入力すると作成できる)

git branch -m <ブランチ名>

ブランチが存在するか確認する

  • ローカル側:
    git show-ref --verify refs/heads/<ブランチ名>
    
  • リモート側:
    git show-ref --verify refs/remotes/origin/<ブランチ名>
    

Git hooks

全てのリポジトリィに同じGit hooksを設定する

git config --global core.hooksPath <ファイルパス>

~/.gitconfigに追記される

~/.gitconfig
 [core]
    hooksPath = <ファイルパス>

Git hooksの設定をリポジトリィ内に含める

  1. リポジトリィ内にassets/git/hooks/ ディレクトリィを作成しコミットする。
  2. リポジトリィをクローンしたら、次のコマンドを実行する。
git config core.hooksPath assets/git/hooks/

.git/config[core]セクションにhooksPathが追記される。

Git hooksが設定されているディレクトリィを取得する

git config core.hooksPath

リポジトリ操作

リポジトリを操作した履歴が記録されている。

git reflog

特定の参照(ブランチ名など)の履歴のみを表示する。

git reflog show master

誤って削除したブランチなどを復元できる。

git reset --hard HEAD@{3}

git rerere

コンフリクトの解決を記録して、同じ衝突を自動的に解消する。

git rerere

git maintenance

Gitリポジトリのパフォーマンスを維持するためのさまざまなメンテナンス作業を自動化するためのコマンド。リポジトリのサイズやパフォーマンスを定期的に最適化し、効果的に管理することができる。

メンテナンス作業の手動実行

メンテナンス作業を手動で実行する。gc, commit-graph, loose-objects, pack-refs, incremental-repack, fetch の順でメンテナンスタスクが実行される。

git maintenance run

メンテナンス作業のスケジュール実行

各リポジトリで定期実行される。submoduleは含まれない。

git maintenance start

自動実行を停止したい場合。

git maintenance stop

コミットID関連

最初のコミットIDを取得する

HEADはブランチ名でもよい。

git rev-list --max-parents=0 HEAD

指定したブランチのコミットIDを取得する

git rev-parse <branch-name>

コミット履歴

指定したファイルのコミット履歴だけを見たい

  • -p:より詳細な情報を表示する
  • --follow:ファイル名が変更された場合でも履歴を追跡することができる
git log -p --follow -- example.txt

ディレクトリを指定すると、そのディレクトリ以下のファイルのコミット履歴を確認できる

git log -- src/

git grep 文字列検索

git grep は、Gitリポジトリ内のテキスト検索を行うためのコマンド。通常の grep コマンドと似ているが、Gitリポジトリ内のファイルに対して効率的に検索を行うことができる。リポジトリ全体、特定のブランチ、特定のコミットに対して検索することができる。

  • -n: 各一致行の行番号を表示します。
  • -i: 大文字と小文字を区別せずに検索します。
  • -v: パターンに一致しない行を表示します(逆 grep)。
  • --cached: インデックス(ステージされたファイル)に対して検索を行います。
git grep <検索パターン>

指定したコミットで検索

git grep <検索パターン> <コミットハッシュ>

指定したブランチで検索

git grep <検索パターン> <ブランチ名>

git blame 指定したファイルの変更履歴を調べる

  • -L <start>,<end>: 特定の行範囲を指定して表示する
  • -e または --email: 作者の名前の代わりにメールアドレスを表示する
  • -w: 無視可能なホワイトスペースの変更を無視して、実際のコード変更に基づいて表示する
  • -C: コピーされたコードを追跡する。ファイル内またはファイル間でコピーされたコードがどのコミットから来たのかを追跡する
  • -C -C: -Cを2回指定することで、より徹底的なコピー検出が行われる。
git blame <ファイル名>

指定した行で調べることも可能。

git blame -L 10,20 <ファイル名>

あるコミット以前で調べることも可能。

git blame <コミットハッシュ> <ファイル名>

git logでAuthorCommitterを表示する

ほとんどの場合、ログの表示ではAuthorしか表示していない。SourceTreeはよく分からないがCommiterが表示されている。

よくあるのは、Authorを変更したけど、Committerはそのままにしてしまう。

なぜAuthorCommitterが別れているのか、よく分からない。歴史的な経緯❓

*%h: コミットの短いハッシュ値
*%an: authorのニックネーム
*%ae: authorのメールアドレス
*%ad: authorの日付
*%cn: committerのニックネーム
*%ce: committerのメールアドレス
*%cd: committerの日付
*%s: コミットメッセージ

git log --pretty=format:"%h %an <%ae> %ad %cn <%ce> %cd %s" --date=format:'%Y-%m-%d %H:%M:%S'

AuthorとCommitterのメールアドレスを全て書き換える

あるメールアドレスに一致したら書き換える ではなく、全てを書き換える。
他人のコミットのメールアドレスも書き換える。
検索にマッチしたメールアドレスだけ書き換えたい場合は、次の章で紹介するfilter-repoコマンドを使いmailmapを指定する。
filter-branchは、別途インストールが必要だったかもしれない。大抵のパッケージにあるはず。
下のコマンドはHEAD(現在のブランチ)から過去に遡るので、分岐しているブランチには適用されないことに注意。

git filter-branch -f --env-filter "GIT_AUTHOR_EMAIL='user_name@example.com'; GIT_COMMITTER_EMAIL='user_name@example.com';" HEAD 

"指定した"AuthorとCommitterのメールアドレスを全て書き換える

filter-repoは別途インストールが必要。メジャーなパッケージマネージャーには用意されているはず。MacPortsの場合はgit-filter-repo

sudo port install git-filter-repo
  • -f: forceオプション。push済みだと置換できない。
  • --mailmap: mailmapを指定する。
git filter-repo -f --mailmap mailmap.txt

左側にマッチしたメールアドレスを右側のメールアドレスに置換する。
1行毎に設定し、複数まとめて置換できる。
メールアドレス意外も置換できるかもしれない。
コメントアウトも使える。

mailmap.txt
<old_name@example.com> <new_name@example.com>
<real_name@example.com> <nick_name@example.com>
# <public@example.com> <private@example.com>

Discussion