仕事で使っていたPCがぶっ壊れてしまい、新しいPCの設定をしてたときにgit config
に何を設定していたのかを完全に忘れていたので、復習がてら設定内容の確認方法とかをメモして見ようと思いました。
最初に設定しておくと捗る設定などもあったので参考になれば幸いです
目次
git config とは?
gitの設定ファイルのことで、デフォルト以外の挙動を定義することができます。
gitの設定は下記の3箇所で設定ができ、system
、global
、local
の順番で設定が読み込まれます。
優先度は下記のようになっているため、例えばglobal
とlocal
で同じ項目でそれぞれ別の設定が書かれている場合、localが最終的に有効な値となります。
scope | 概要 | path | 優先度 |
---|---|---|---|
system | システム全体の共通設定 | /etc/gitconfig | 低 |
global | current user共通の設定。基本これを使う | ~/.gitconfig | 中 |
local | リポジトリごとの設定 | .git/config | 高 |
基本的にはgit config <サブコマンド>
で設定を行いますが、上記のconfigファイルを直接編集することで変更することもできます。
ただ、個人レベルで設定をいじることがほとんどなので、その場合は基本的にはglobalの設定を変えるだけで良いことがほとんどです。
設定内容の確認方法
現在の設定内容は下記のコマンドで確認ができます
git config -l
下記のように設定している内容が出力されます、ここの出力結果はすべての設定ファイルを読み込んだ結果となります。
credential.helper=osxkeychain
user.name=“hogehoge”
user.email=example@example.com
alias.cm=commit
alias.co=checkout
alias.sw=switch
alias.gr=grep
alias.graph=log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
grep.linenumber=true
init.defaultbranch=main
push.default=current
pull.ff=only
core.quotepath=false
globalのみ確認したい場合
オプションを付ければ確認できる
git config -l --global
自分でエディタから編集することも可能です。ただ、configファイルを編集しているだけなので実質下記の2つは同じ挙動になります
git config -e --global
or
vim ~/.gitconfig
[user]
name = “hogehoge”
email = example@example.com
[alias]
cm = commit
co = checkout
sw = switch
gr = grep
graph = log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset%cd %Cblue%cn %Cred%d %Creset%s'
[grep]
lineNumber = true
[init]
defaultBranch = main
[push]
default = current
[pull]
ff = only
[core]
quotepath = false
おすすめの初期設定
ユーザー名とメールアドレスの設定
誰もが通る初期設定です。
ここを設定せずにコミットするとPCのユーザー名などがコミットログに残り恥ずかしい思いをするので最初に設定してしまいましょう
git config --global user.name "hogehoge"
git config --global user.email "sample@example.com"
pushするときのdefaultブランチを設定
pushするときのdefaultで現在のブランチにpushするように設定します
git config --global push.default current
これをしていない場合、`git push`したときにリモートブランチを指定しろと怒られるのですがそれがなくなります。地味に重宝している設定の一つです
pullするときにfast-forwardマージのみ有効にする
ここに関しては好みの世界ですがpullの設定になります。
pullは基本的には、remoteブランチからgit fetch
をしてlocalブランチにgit merge
する挙動になります。そのため、localのコミットとremote側のコミットログに差分があった場合はmergeコミットが自動的に作成されます。
個人的にはここでのmergeコミットは無駄に分岐のログが作られてしまう事が多くあまり必要ないと思っております。それを解決するのがpullの設定になります。
fast-forwardマージとは?
そもそもfast-forwardマージとは、pull先のremoteブランチがlocalブランチの分岐時から変更がなかった場合、単純に分岐先のコミットがそのまま移動されてマージされることを指します。
下記の記事で詳しく図式して紹介しているのでおすすめです。
Git 2.27 での git pull 時の warning について – Qiita
fast-forward only
下記の設定をしておくと、fast-forwardマージ可能な場合のみpullを行います。そうでない場合はmerge
もrebase
もせずにエラー終了します。
git config --global pull.ff only
こうすることで意図しないmergeコミットが作られなくなり、rebaseもされなくなります。
もしエラーが出た場合は、改めてpullする際にrebaseオプションを追加することでいい感じに1直線のコミットログが作られることになります。
git pull --rebase
このあたりの挙動になれてきたら、下記の設定をしておくとfast-forwardマージできない場合はrebaseをしてくれるようになります。
git config --global pull.rebase true
ただ、rebaseの挙動が理解できていないうちは下記の設定はせずにfast-forwardマージのみ許可しておくのが安全策かな、と思います。
ちなみにバージョン2.27以降pull時の設定を指定しない状態でgit pull
すると警告がでるようになっています。
git init時にmainブランチを作成する
古いgitのバージョンだと新しいリポジトリでgit init
したときにデフォルトのmasterブランチが作られてしまう。下記のような警告が表示されるので書いてあるとおりにデフォルトのブランチを変更しておくと良いです。
$ git init [~/project/surveillance-script]
hint: Using 'master' as the name for the initial branch. This default branch name
hint: is subject to change. To configure the initial branch name to use in all
hint: of your new repositories, which will suppress this warning, call:
hint:
hint: git config --global init.defaultBranch <name>
hint:
hint: Names commonly chosen instead of 'master' are 'main', 'trunk' and
hint: 'development'. The just-created branch can be renamed via this command:
hint:
hint: git branch -m <name>
警告の通り、下記のコマンドをを実行すればOK。
git config --global init.defaultBranch main
そもそもmasterからmainに変わった背景は下記の記事を参照してください。
GitHub、これから作成するリポジトリのデフォルトブランチ名が「main」に。「master」から「main」へ変更 - Publickey
grep時に行数を表示する
見出し通りですが、git grep
をしたときに行数を表示してくれるオプションです。
git config --global grep.lineNumber true
下記のように同一ファイルで結果が複数ある場合などに助かります。
app/controllers/admin/communities_controller.rb:26: redirect_to admin_community_path(@community), notice: message
app/controllers/admin/communities_controller.rb:35: redirect_to admin_community_path(@community), notice: message
app/controllers/admin/communities_controller.rb:44: redirect_to admin_communities_url, notice: message
app/controllers/admin/communities_controller.rb:57: def require_admin
参考にさせていただいたサイト
ブランチの統合|サル先生のGit入門【プロジェクト管理ツールBacklog】