95 ポイント 投稿者 xguru 2025-02-26 | 7件のコメント | WhatsAppで共有
  • 『Pro Git』の著者であるScott Chaconが、グローバルで有効にしているいくつかのGit設定と、その理由を説明
  • 設定の多くは、実際にGitコアのコードベースで作業する開発者たちから学んだもの
  • 以下はGitをより良くする ~/.gitconfig 設定
    [column]  
    ui = auto  
    [branch]  
    sort = -committerdate  
    [tag]  
    sort = version:refname  
    [init]  
    defaultBranch = main  
    [diff]  
    algorithm = histogram  
    colorMoved = plain  
    mnemonicPrefix = true  
    renames = true  
    [push]  
    default = simple  
    autoSetupRemote = true  
    followTags = true  
    [fetch]  
    prune = true  
    pruneTags = true  
    all = true  
    
    # 使わない理由がある?  
    
    [help]  
    autocorrect = prompt  
    [commit]  
    verbose = true  
    [rerere]  
    enabled = true  
    autoupdate = true  
    [core]  
    excludesfile = ~/.gitignore  
    [rebase]  
    autoSquash = true  
    autoStash = true  
    updateRefs = true  
    
    # 個人の好みによる設定(必要ならコメントを外して使用)  
    
    [core]  
    # fsmonitor = true  
    # untrackedCache = true  
    [merge]  
    # (Gitのバージョンが2.3未満の場合は「diff3」を使用)  
    # conflictstyle = zdiff3  
    [pull]  
    # rebase = true  
    

Gitコア開発者たちはGitをどう設定しているのか?

  • Gitメーリングリストで、Felipe Contrerasがコアチームに対し、すべての設定とエイリアスを外してデフォルトのGitを使ってみるよう提案したことがある
  • この実験の結果として、9個の設定と3個のエイリアスが新しいデフォルト値として提案された
    merge.conflictstyle = zdiff3  
    rebase.autosquash = true  
    rebase.autostash = true   
    commit.verbose = true  
    diff.colorMoved = true  
    diff.algorithm = histogram  
    grep.patternType = perl  
    feature.experimental = true  
    branch.sort = committerdate  
    
  • これらの設定はまだデフォルト値として採用されていない
  • しかし、多くのGit開発者が、このうちいくつかを有効にしないとGitを使うのが難しいと感じているのは興味深い
  • さらに興味深いのは、読者の大半がこれの意味をまったく知らないということ
  • 3つのカテゴリに分けて説明する
    • Gitを明らかにより良くするもの(Clearly Makes Git Better)
    • 使わない理由がある?(Why the Hell Not?)
    • 好みの問題(A Matter of Taste)

# Gitを明らかにより良くするもの

ブランチ一覧の並び替え

  • デフォルトではGitはブランチをアルファベット順に並べるが、最近のコミット日時順のほうが便利なことがある
  • 次の設定で、ブランチを最新コミット順に並べ、カラム形式で表示できる
    git config --global column.ui auto  
    git config --global branch.sort -committerdate  
    

タグ一覧の並び替え

  • タグをアルファベット順ではなくバージョン順に並べるには、次の設定を使う
    git config --global tag.sort version:refname  
    

デフォルトブランチ名の設定

  • 新しいリポジトリを初期化するときのデフォルトブランチ名を設定するには、次のようにする
    git config --global init.defaultBranch main  
    

改善されたdiff設定

  • デフォルトのdiffアルゴリズムを histogram に変更し、より正確な比較を行う
  • コードの移動を検出して色分け表示するには、次の設定を追加する
    git config --global diff.algorithm histogram  
    git config --global diff.colorMoved plain  
    git config --global diff.mnemonicPrefix true  
    git config --global diff.renames true  
    

改善されたpush設定

  • 次の設定でpushの挙動を改善できる
    git config --global push.default simple  
    git config --global push.autoSetupRemote true  
    git config --global push.followTags true  
    

改善されたfetch設定

  • fetch時に不要なブランチやタグを自動削除するには、次の設定を使う
    git config --global fetch.prune true  
    git config --global fetch.pruneTags true  
    git config --global fetch.all true  
    

# 使わない理由がある?

自動修正プロンプト

  • コマンド入力時にタイプミスを検出して候補を提案するよう設定するには、次を使う
    git config --global help.autocorrect prompt  
    

コミット時にdiffを表示

  • コミットメッセージ作成時に変更内容も一緒に表示するには、次の設定を追加する
    git config --global commit.verbose true  
    

コンフリクト解決の再利用

  • 以前のコンフリクト解決を自動的に再利用するには、次の設定を使う
    git config --global rerere.enabled true  
    git config --global rerere.autoupdate true  
    

グローバル .gitignore ファイルの設定

  • グローバルに無視するファイルを指定するには、次のように設定する
    git config --global core.excludesfile ~/.gitignore  
    

rebase設定の改善

  • rebase時に自動でsquashやstashを行うには、次の設定を使う
    git config --global rebase.autoSquash true  
    git config --global rebase.autoStash true  
    git config --global rebase.updateRefs true  
    

# 好みの問題

改善されたマージコンフリクト表示

  • マージコンフリクト時にベースバージョンもあわせて表示したい場合は、次の設定を検討するとよい
    git config --global merge.conflictstyle zdiff3  
    

pull時にrebaseを使う

  • git pull 時に自動でrebaseを行いたい場合は、次のように設定する
    git config --global pull.rebase true  
    

ファイル変更検出の高速化

  • git status などの性能を向上させるには、次の設定を使える
    git config --global core.fsmonitor true  
    git config --global core.untrackedCache true  
    

# まとめ

  • これらの設定によりGitをより快適に使えるようになり、一部はコア開発者たちも積極的に使っている設定でもある
  • Git設定を最適化することで、作業フローを改善し、より効率的に使えるようになる

7件のコメント

 
brainypooh 2025-02-28

「さらに興味深いのは、皆さんの大半がこれが何を意味するのかまったく分かっていないということ」って、グサッと刺してきますね。😨😨😨

 
tested 2025-02-27

--global ではなく -global ですか?

 
xguru 2025-02-27

--global が正しいです。コピペ中に手違いがありましたね。修正しました。

 
ilikeall 2025-02-26

競合解決の再利用がいいですね

 
tujuc 2025-02-26

diff を見るときは git-delta を使って TUI 形式で見ています。

  10   │ [core]  
  11   │     pager = delta  
  12   │ [interactive]  
  13   │     diffFilter = delta --color-only  
  14   │ [delta]  
  15   │     line-numbers = true  
  16   │     side-by-side = true  
  17   │     navigate = true  
  18   │     diff-so-fancy = true  
  19   │     hyperlinks = true  

まあ、あれこれ面倒なら tig を……(笑)
もっといい何かがあるでしょうか……?

 
GN⁺ 2025-02-26

Hacker Newsの意見

  • 私がいちばん気に入っている alias は git out。これはプッシュされていないコミットをすべて一覧表示する。いつも使っている
    [alias]   
      out = "log @{u}.."   
    
  • 多くの人が自分の ~/.gitconfig に頭を悩ませている一方で、git CLI の相棒として delta を強くおすすめする
  • 私の ~/.gitconfig は以下のとおり
    [alias]  
      co = checkout  
      ci = commit  
      st = status  
      br = branch  
      hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short  
      type = cat-file -t  
      dump = cat-file -p  
      dft = difftool  
    [tag]  
      sort = version:refname  
    [tar "tar.xz"]  
      command = xz -c  
    [tar "tar.zst"]  
      command = zstd -T0 -c  
    [log]  
      date = iso-local  
    [pull]  
      ff = only  
    [diff]  
      tool = difftastic  
    [safe]  
      directory = *  
    [advice]  
      detachedHead = false  
    [init]  
      defaultBranch = master  
    
  • コミット署名がなぜこの設定に含まれていないのか気になる。今どきの SSH キーなら簡単にできる
    [user]  
      name = xyz  
      email = xyz@domain.com  
      signingkey = ~/.ssh/id_algorithm.pub  
    
    [commit]  
      gpgsign = true  
    [tag]  
      gpgsign = true  
    
    [gpg]  
      format = ssh  
    
    # restrict allowed signers  
    # echo "$(git config --get user.email) namespaces=\"git\" $(cat ~/.ssh/id_*.pub)" >> ~/.git_allowed_signers  
    [gpg "ssh"]  
      allowedSignersFile = ~/git_allowed_signers  
    
    • GitHub では SSH キーを認証用と署名用の両方に追加できる。2回追加する必要はあるが、一度設定すればコミットの "unverified" ラベルを消せる
  • Julia Evans の人気の Git 設定オプション
  • 私が気に入っている追加オプション
    [apply]  
      # Remove trailing whitespaces  
      whitespace = fix  
    [color "diff"]  
      whitespace = red reverse  
    [diff]  
      colorMovedWS = allow-indentation-change  
    [format]  
      pretty = fuller  
    [log]  
      date = iso  
    [pull]  
      ff = only  
    
  • 私の設定はこちら。基本的にはすでに設定されていた(column UI を除く)。おそらく Scott などの良い記事を読んだからだと思う
  • (z)diff3 を使うべきというおすすめに同意する。記事はその重要性を過小評価している。3方向 diff は、デフォルトのスタイルでは不可能な競合解決を可能にする
  • git が好みの pager を使うように設定できることを知った。なので bat に設定した