Gitコマンドまとめ
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に追記される
[core]
hooksPath = <ファイルパス>
Git hooksの設定をリポジトリィ内に含める
- リポジトリィ内に
assets/git/hooks/
ディレクトリィを作成しコミットする。 - リポジトリィをクローンしたら、次のコマンドを実行する。
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 <コミットハッシュ> <ファイル名>
Author
とCommitter
を表示する
git logでほとんどの場合、ログの表示ではAuthor
しか表示していない。SourceTreeはよく分からないがCommiter
が表示されている。
よくあるのは、Author
を変更したけど、Committer
はそのままにしてしまう。
なぜAuthor
とCommitter
が別れているのか、よく分からない。歴史的な経緯❓
*%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行毎に設定し、複数まとめて置換できる。
メールアドレス意外も置換できるかもしれない。
コメントアウトも使える。
<old_name@example.com> <new_name@example.com>
<real_name@example.com> <nick_name@example.com>
# <public@example.com> <private@example.com>
Discussion