Open3

So You Think You Know Gitからのtakeaway

convers39convers39
  • git command 大まかに82 porcelain + 63 plumbingコマンドがある、このトークは主に前者の話
    • 44 main -> add, commit, push …
    • 11 manipulators -> config, reflog, replace …
    • 17 interrogators -> blame, fsck, rerere
    • 10 interactors -> send-email, p4, svn
  • config系
    • aliasを設定する git config --global alias.<str> '<cmd>'
      • !をつけるとことでbashスクリプトもaliasにできるー>知らなかった
    • conditional configs with [includeIf "gitdir:~/projects/work/"]
      • 仕事とプライベートの環境を分けるとかによく使う
    • rerere.enabled true
      • reuse recorded solution -> 例えばリベースするときに同じ競合を何回も解消しないといけないときに、これは初回のものをメモしてくれるので2回目以降は自動で解消してくれる -> 神機能知らなかった -> 繰り返しがあるときにもっと良いやり方がきっとあるとの真理
  • odies but goodies
    • git blame
      • -L 10,20:<file> -> little -> ファイルの一部のblameを出す
      • -L :<class/function/..._name>:<file> -> gitにその名前の部分を探して出してもらう
      • -w -> whitespaceを無視
      • -C -> コードの移動を検知する -> ここの面白いのは、同じフラグを2回、3回つけることで効果がまた違う
    • git log
      • -S <str|regexp> -p ->ログから検索して出す
    • git reflog 今までやったことは記録できるのでタイムトラベル -> これはよく使う、非常に有用
    • git diff
      • --word-diff ->名前通り、デフォルトはlinebase
  • new stuff
    • git branch --column -> ブランチを画面サイズに合わせて複数列に表示させる(lsの見た目)、地味にみやすくなる
    • git push --force-with-lease -> force pushする際にもしリモートのHEADが、ローカルから見て想定するHEADと違うときにリジェクトするようにする(例えば別の人がすでにコミットを入れた場合) -> 非常に有用、デフォルトにしたい -> デフォルトじゃない理由は、gitは常にbackward compatibleだからだとQAで答えている
    • signing commits with ssh -> sshキーを使ってコミットにシグネチャーをつける、github上に該当public keyをつけておくと、verifiedが表示される
    • git maintenance start -> everyone do this today! -> cron jobを追加して、さまざまな操作を早くする
      • 例:prefetchを1h毎にに実行するのでfetchは早くなる
      • 他は下のbig repo stuff参照
  • big repo stuff -> 50万以上のファイルがあるレポ、windows OSが300GB以上、350万以上のファイル -> この辺の改善は上記のgit maintenanceに含まれている
    • prefetching -> git for-each-ref | grep prefeで確認できる
    • commit-graph -> logはこれに依存する
    • filesystem monitor -> git statusが早くなる
    • git clone --filter=blob:none -> blobファイルをダウンロードしないようにする、オンデマンドに
    • git clone --filter=tree:0 -> 普段開発ではなく、CIの時間短縮に活用できる
  • monorepo stuff
    • sparse-checkout -> ものレポの一部だけをクローンする
  • github stuff
    • allow merge types -> merge commits派 vs rebase派、いずれもサポート可能
      • 自分のチームではどちらかというとmerge commit派、feature -> mainのときにsquash merge commit、main -> featureもmerge commit
    • auto merge -> CI成功後自動マージする
      • 自分のチームではよく使われる機能
  • GitButler
    • 現在Scott Chaconさんが所属のチーム、GitのGUIプロダクト
    • 同時に複数のブランチで開発を進められるのが特徴的(switch/checkout不要)
    • Scottさん本人はcli派らしいが、interactive addingを使う際にGUI推し -> より効率的なツールを選ぶ原則