コアGit開発者が実践するGitの設定法とは
引用元:https://news.ycombinator.com/item?id=43169435
自分のお気に入りのエイリアスは、git out
で、未プッシュのコミットをリストするだけなんだ。いつも使ってるよ。
自分の中では、いつも「The Terminator」の声で聞いてる。
いいエイリアスがあったから、最適なエイリアスについての記事をまた書くべきだな。アーノルドの声で言いたいからやりたいんだ。今はgit to-da-choppa
がやりたい。
それは単にこうできるかもね。
git add . && git commit -a -m ”git to da choppa” && git push –force
急いで『ダ・チョッパ』に行く必要がある時はこれに限る。
自分はqp
を使ってquick-push
にしてる。関数を使ってコメントを付けるんだ。
# git alias
qp = ”!f() { git add . && git commit -m \”$1\” && git push; }; f”
# 使用法
git qp ”好きなコメント”
自分はほとんどgit add .
はやらない。git add -u
の方が良いと思う。知られているファイルだけをステージするから。
それはMercurialに標準で付いてくるやつだよ。(hg out
やhg outgoing
)
みんなが自分の選択を考えてる間に(少なくとも~/.gitconfigのことについて)、deltaをGit CLIの仲間として強くおすすめするよ。
[1]: https://dandavison.github.io/delta/
deltaを使ってたけど、普通の差分表示に戻ってきたよ。決して悪いわけじゃないんだけど、ずっと差分をコピーしてるから、そのビジュアルが自分のワークフローに合わないんだ。端末が小さいとちょっと見づらいし。でも、本当に良いソフトだから、読むみんなにも試してみてほしい。
確か、出力をxclipにパイプしたり、ファイルにリダイレクトすると、元の差分フォーマットに戻るんだよね。便利ではないけど、そこに関してはまだ使える。
それは知らなかった!それさえあれば大丈夫そうだ。ありがとう、本当に!
ちゃんとしたツールなら、出力がパイプかどうかを検出してフォーマットを無効にするべきだよね。’git’だけじゃなくて、’ripgrep’や’jq’もちゃんとやってると思う。
むしろ出力がターミナルかどうかを検出して、色を有効にすべきだよね。
これ知らなかった!いつも出力をパイプするときは’–no-ext-diff’ってタイプしてたんだ。サンキュー!
’… | cat’はたまに便利だし、どの環境でも使えるよね。
’git -c core.pager=less’を使ってるけど、パイプの方が簡潔かも…ちょっと試してみる。
catを通すのはうまくいくはずだよ。
フォーマットなしでコピーするのはただの’
GeminiにHNコメントを解読してもらってるけど、’pbcopy’ってmacOSだけ?ちなみに、Geminiはウェブサイトの青い色についての質問はしたくないらしい。
そうだよ、’pbcopy’はmacのやつ。Linuxでは環境によって色々なコマンドがある。’xsel’、’xclip’、’wl-clipboard’や’wlclip’とかね。WindowsではPowerShellの’Get-Clipboard’と’Set-Clipboard’、cmd.exeは’ws’で問題解決できるよ。
最近のWindowsにはclip(.exe)ってのがどれにもあるみたいだね。
Linuxでは、~/bin/pbcopyという自作のコマンド作ったんだけど、Linuxのコマンドは覚えにくいから”pbcopy”って名前にしたよ。 Emacs使いなら、同じ作者のmagit-deltaパッケージでdeltaをmagitと一緒に使えるよ。 これ追加したかったんだけど、バニラgitで使えるグローバルな推奨が欲しかったんだ。deltaはいいけどね。 自分の~/.gitconfigはこんな感じだよ。 エイリアスでキーストローク減るの?多くのシェルには補完機能があるのに、結局”git”って打たなきゃいけないじゃん。 gitに関しては多くのシェルエイリアス作ってるよ。 短縮エイリアスはcvsやsvnから来たんだ。 エイリアスは意図的に作ってないんだ。 俺はもっと楽な方法が欲しいな。 GitのTUIクライアント(tigやlazygitなど)はそういう風にキー操作で動くんじゃないの? うん、でも俺はstatusやstash、checkout、commitは手書きの方が好きかな。考えれば考えるほど、そういう機能に意味を感じなくなってきたな。 (z)diff3の使用を勧める意見には賛成。この記事ではその重要性が過小評価されている気がする。3-way diffがなきゃ解決できない衝突があるからさ。標準のスタイルでは、衝突を同じ場所に追加するのと削除するのが区別つかないから、基準が見えないと判断が難しいんだ。詳しくはこっちに書いたよ: 関連情報: Julia Evansによる人気のGit設定オプション[0] 俺が好きな追加オプション: 俺も 俺もcolor.diff.whitespace ”red reverse”を使ってる。diff.wsErrorHighlight allも必要に感じたことがあったけど、今はどうなのかよくわからん。 俺の設定はここにあるよ[1]。基本的にはすでにここに書かれてる設定は大体入ってるけど、column uiは俺は好みじゃないだけかな。お互いにエイリアスのコツをやり取りするのは良いかもと思ったから、リンクをシェアしてみるよ。 なんでコミット署名がここに入ってないのか不思議だな。今のSSH鍵で簡単にできるのに。 個人的にはGitのデフォルトの動作はリモートのリファレンスをリモートにできるだけ近づけるべきだと思うんだ。消えていったものはプルーンするべき。ただ、それはダメだね。リモートの不要なデータは結構消えてることが多いし、いつ必要になるかわからないからね。特に古いGitHubのプルリクエストはすぐにバックエンドでガーベジコレクションされることが多いから、リフログを掘り返して昔の作業を見つけることがよくある。データを消すときは、必要ないかわからないものは消さない方が賢明だし、手動で行うべきだよ。 gitが好きなpagerを使えるってのが分かったから、batに設定したぜ。 core.pagerをbatにしてる。 deltaっていうのでも同じことができるんだけど、.gitconfigに追加オプションを入れられるよ。 >「これをGIT_PAGER環境変数で設定することに比べてメリットはあるの?」」環境変数のPAGERがgitで効かないのは変だね。 >「その環境変数は使ったことないけど、gitの設定を一つのファイルにまとめて、他のマシンでも再利用できるのが利点だよ。」」ローカルに設定すれば、特定のリポジトリだけの設定もできて便利。 >「最適な設定が合意されてからデフォルトを更新してほしい。」」未来に変わっても気づかず古い設定のままだと不安になるね。 vscode使いの私にはどれくらい役立つのかな? コマンドライン見るのもあまりないし、あったとしてもトラブルだらけで… VSCodeのgitインターフェースは結構パワフルで、99.9%のアクションはカバーされてるよ。マージやスタッシングもできるし。ただ、diffアルゴリズムを変えるのは役立つこともあるかも。 >「gitを使うなら、少しずつCLIに慣れるのがいい。」」初心者向けではないけど、GUIツールじゃ隠れた部分も見えるから、より複雑なことに対応できるようになるよ。 GUIに何の問題があるの?Gitでは特にいいと思うよ。プロセスは素早くやる必要はなくて、しっかり見直して選ぶことが大事。グラフィカルな差分ビューアはすごくいいしね。 マージの時にconflictstyleをdiff3かzdiff3に設定すると、体験がすごく良くなるよ。 kdiff3を使ってるよ。ほとんどのマージコンフリクトを自動で解決してくれるし、間違ったこともほぼないよ。解決できないときも行の整列がいいから、BeyondCompareとかのごちゃごちゃしたやつより好き。 もちろん、あれに対してxkcdがあるってことだよね: XKCDを作るべきだね。“GitクライアントGUIは常にn+1ある”って。新しい社員が来ると毎回新しいGit UIを提案してくるんだよね。 多分、Gitは普通のユーザーには難しすぎるんだと思う(自分も含めて)。 >多分、Gitは普通のユーザーには難しすぎるんだと思う(自分も含めて)。 もちろん、GitButler(https://gitbutler.com)を試してみるのもいいよ。結構いいGUIだし。 自分はこのエイリアスを設定してるよ。 自分はほぼ同じだけど、’—-graph’だけ外したバージョン。そうすることで、リニアビューかグラフビューのどちらかをそのフラグひとつで得られるのがいいね。 デフォルトはこれにすべきだと思う:>”git push –force-with-lease” 残念なことに、–force-with-leaseは名前が長すぎる。危険な–forceに比べて。–forceを–force-with-leaseのように設定できたらいいのに。元の–forceの動作は人間には望ましくないし。 役立つ記事だった。 >”# clearly makes git better” Nitpickだけど、schaconさんの「ブランチのリスト」セクションで、branch.sortとcolumn.uiを初期オプションとして紹介してるけど、コマンドの順番が逆だからちょっと分かりにくい。 「Clearly better」とか他のいくつかは活用したけど、pruneオプションは使用してない。勝手に削除されるのが嫌だから。 これすごいね。今まで自分のgit設定を深く調べなかったけど、いくつかは本当にクール。diffの変更は素晴らしいし、グローバルな.gitignoreファイルがない理由もずっと不思議だった。 投稿で言ったけど、Gitは Mac使ってるから、.DS_storeは入れてるよ。他の人に広める必要はないし。 “.vscode”フォルダーも要らないと思う。VSCodeすら使ってない人もいるかもしれないし、皆が必要なわけじゃないのに入れてると日々の作業がうんざりする。このファイルをチェックインする理由がわからん。 “.vscode”のプロジェクト特有の設定ファイルは、全開発者が使うからよくある話だよ。VSCodeの設定は階層的で、合成される感じのものだからね。 “.editorconfig”を使えば、複数のエディターやIDEで動作するよ。詳しくはeditorconfig.orgを見てね。 他の人はあまりやってないよね。ツールを片っ端から変える予定だったら、特定のIDEやエディターのファイルを入れるのはどうなんだろう?Gitレポにどれだけのものを蓄積するつもりなのか、疑問に思うよ。 >全員が同じツールを使うなら、それらのファイルは絶対にチェックインすべきだよ。何が問題なの?チームが共有することで得られるメリットを知らないんじゃないかな。 皆がVS Codeだけではないから、特定のツールのものを入れるのはどうかと思うよ。異なるIDEやエディターの余分なものを持ってたら、レポも煩雑になっちゃうし。 クリエイターたちの間で、ホームディレクトリを汚さないようにしようという動きもあるよ。投稿で言われたように、 俺はdifftasticが好きだね。「最も読みやすく、理解しやすい差分ツール」だと思う。 記事の終わりでさりげなく紹介したんだけど、 最近知った中で一番クールなのが.git/info/exclude。 俺は.envrcとshell.nixをグローバルのgitignoreに追加してるよ。 俺は$XDG_CONFIG_HOME/git/ignoreも使ってるよ。 こんな便利な機能があったなんて知らなかった!もっとコメントを表示(1)
さらに、vscodeとの使い方もドキュメントに載ってるみたい。
[alias]のエイリアスや設定が色々書いてあるんだ。
完全にシェルに埋め込むようなエイリアスが欲しいな。g
はgit status
、d
はgit diff
、gad
はgit add
みたいな感じ。
常にローカルタイムゾーンでgit logを表示したり、非ffマージをしないように設定してるんだ。
でも、個々の設定としてエイリアスはいいよね。
gitを何回も打たなくてよくなるようなgitシェルがあればいいのに。
https://stackoverflow.com/a/63739655/997606
rebaseやmergeの衝突解決をメカニカルにするやり方も書いた:
https://h2.jaguarpaw.co.uk/posts/git-rebase-conflicts/
https://news.ycombinator.com/item?id=39400352
[apply]
# 末尾の空白を削除
whitespace = fix
[color ”diff”]
whitespace = red reverse
[diff]
colorMovedWS = allow-indentation-change
[format]
pretty = fuller
[log]
date = iso
[pull]
ff = onlylog.date iso
を入れようかと思ってた、これいいよね。
[1]:
https://github.com/Julian/dotfiles/blob/main/.config/git/con…
[user]
name = xyz
email = xyz@domain.com
signingkey = ~/.ssh/id_algorithm.pub
[commit]
gpgsign = true
[tag]
gpgsign = true
[gpg]
format = ssh
# 許可される署名者を制限する
# 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』ラベルが消える。もっとコメントを表示(2)
https://xkcd.com/1597/
ならvscodeのラッパーを使うか、好きなやつを使えばいいさ。人は“Git”が難しいって言うけど、本当はそのプロジェクトの膨大な変更を分割・リファクタリングする問題とかが難しいんだよね。
[alias]
lg = log –color –graph –pretty=format:’%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset’ –abbrev-commit –branches
色付きのコンパクトなコミットとブランチのグラフが見れます。
forceを使うのは危険だし、なぜGitがそれを実行する前に状態を確認させないのか謎。デフォルト設定は無理だから代わりにエイリアスを使ってる。記事については、設定にはあまりこだわりがなくて、特に良いと言われてる設定も特に気にならない。merge.conflictstyle = diff3
に困ってたからzdiff3
を知れてよかった。他にもfetch.prune
やpull.autoSetupRemote
を学んで、作業が少し楽になる。差分のプレフィックスは、パスを一つだけ.
で表示させたいから、コンテキストのプレフィックスは要らない。もっとコメントを表示(3)
に強く反対。新しいブランチをリモートに公開するのは、明示的な操作であるべき。git pushは必要なコマンドを教えてくれるから、別のランダムなコマンドを覚える必要はない。defaultBranch = master
を使ってる。明らかに文脈を誤解している言葉を禁止する流行の方が、有害で役に立たないと思う。.config/git/ignore
も見るから、新しいパスを設定するよりこっちを使った方がいいかも。ただし、自分には隠れてても他人には見えるかもしれないから、その点は考慮した方がいいよ。自分はそのファイルにはあまり入れてないけどね。.config/git/ignore
が長期的にはスケーラブルなアプローチだと思う。
>「https://github.com/so-fancy/diff-so-fancy」
>「https://github.com/dandavison/delta」
も素晴らしいTUIの差分ツールなんだよね。
ローカルリポにファイルを無視させるのに便利で、.gitignoreを改造する必要がないんだ。
自分の.envrcやshell.nixを追加したいときに役立つよ。
docker-compose.override.ymlも同様にね。
無視されてるファイルでも強制的に追加すれば、今後はトラッキングされるから便利。
いくつかはデフォルト設定になってほしいな。