BeejのGitガイド
(beej.us)- Gitを学びたい、または参照したい読者向けに、HTML・PDF配布版を複数の形式で提供しているガイドページ
- ガイド自体は誤りの可能性を前提としており、Gitに関する誤った内容についてはメールで修正提案を受け付けている
- HTML配布版は、分割版、単一ページ、ワイドスクリーン、ZIPなど、読む環境に合わせて選べる
- PDFはUS Letter・A4、片面・両面、シンタックスハイライト版・白黒版の組み合わせでダウンロードできる
- 翻訳者と執筆者は、資料一式をGitHubからクローンしたうえでREADMEに従って作業すればよい
閲覧用の配布形式
-
HTML
-
PDF
修正提案と元の作業資料
- ガイドは誤りがある可能性を考慮しており、修正提案はメールで受け付けている
- 翻訳者と執筆者はGitHubリポジトリをクローンし、READMEに従えばよい
1件のコメント
Hacker News のコメント
間違いを見つけたら投稿してほしい。自分で整理して直します — Beej
:cqも入れてよさそう。非ゼロの終了ステータスで抜けられるので、Git がコミットや作業を完了できないようにできるhttps://beej.us/guide/bggit/html/split/branches-and-fast-for... では「デフォルトブランチは main」で、「以前は master で、古いリポジトリにはまだ master がある」としているが、これは正しくない。Git は今でも
masterをデフォルトとして使っており、将来的にgit initについてgit config --global init.defaultBranchで変更できるようにしているだけ根拠: https://github.com/git/git/blob/bc204b742735ae06f65bb20291c9...
また、「古いリポジトリ」という表現は誤ったメッセージを与える。GitHub がこの変更を決め、ほかが追随し、Git 本体も前述の設定を許可するようになったということであって、新しいリポジトリ/古いリポジトリの問題ではなく、好みの問題に近い
stash を扱う面倒なしに、ブランチ同士が絡まないよう保つ良い方法だ
10代のころに読んだ Beej's Guide to Network Programming と Beej's Guide to Unix IPC は、取っつきやすい一方で深みもあり、その後自分がどんなプログラマーになったかに大きな影響を与えた
[0] https://beej.us/guide/bgnet/
[1] https://beej.us/guide/bggit/
中古で CD-ROM 付きの Slackware Linux unleashed を買ったら C のネットワーキング例が入っていて、そのコードが分からず Beej のネットワーキングサイトに行き着いた。そこからさらにのめり込み、深いウサギ穴に入って、いくつもの書店を回ってプログラミング本を探すようになった
Richard Stevens の素晴らしいリファレンス本を買ってからは後戻りせず、その情熱を可能にしてくれた Beej には今でも感謝している
selectの使い方を学んでいたころ、あるポートスキャナー(たぶん “grabb” ?)をもっと速くしたくて、Beej のネットワークガイドをイタリア語に翻訳したのを覚えている。楽しい時代だった父に電話料金で怒られないよう、オフラインで読むためにページを保存していた時代で、コードが動くと、人生でそれまで味わった失敗や拒絶を乗り越える承認のように感じられた。一台のコンピューターから別のコンピューターへメッセージを送る喜びは大きかった
「古いコマンド:
git checkout」を見て、git switchがあることも知らなかったし、git checkoutが古い代替手段と見なされていることも知らなかった。年を取った気分だほぼ10年前に Git を学び始めたのだから仕方ないとしても、今 Git を学ぶ人が、自分がなぜ
git checkoutを使うのか戸惑うかもしれないというのは妙な感じがする。古めかしい表現を使っている気分だ本文に戻ると、自分が学んでいたときにこのガイドがあれば本当に役立ったと思う。追いやすく、よくある疑問をうまく扱っている
初めてのマージコンフリクトに怖じ気づいて中断し、その後コンフリクトを避けるために回り道した記憶も良い思い出として残っている
git switchはかなり新しいコマンドで、2019年に初めてリリースされた2021年の議論と数週間前の議論がそれぞれあり、後者ではドキュメント上
git switchがまだ 実験的機能 と見なされていることにも触れられているhttps://news.ycombinator.com/item?id=28024972
https://news.ycombinator.com/item?id=42649858
git checkoutがまだ「古い代替手段」と見なされているとは思わない。最後に確認したときswitchはまだ実験的だったし、約15年前に Git を学んだときに身につけたワークフローやコマンドから離れようとも思わなかったやりたいことは今でもすべて同じように動くし、
git checkoutも以前と同じことをしてくれる。他の人たちと Git で共同作業するのにも問題がないのに、あえてワークフローを変える理由はないGit の使い方を説明する30を超えるパートからなるガイドが必要だということ自体、Git が大局を見失っているように感じる
コミットはツリーのスナップショットで、祖先リストを持つ。通常は1つだが、常にそうとは限らない。タグは変わらないコミットの名札で、ブランチは変わるコミットの名札だ。インデックスは、コミットする前に
addで詰めていく小さな作業中のプロトコミットだこれが Git だ。もっと知りたいなら、ガイドを読むのではなく、「ツリーに影響を与えずに特定の Git コミットへ切り替える方法」「変更したファイルの一部だけをコミットする方法」「別の場所のコミットを現在のツリーへコピーする方法」のように検索すればいい
基本的な抽象化はミニマルで簡単だ。その抽象化でやりたいことのほうが精巧で複雑なのだ。前者を学び、後者は検索すればよく、ガイドを読む必要はない
git clone,git checkout,git pull,git add+commit+push,git reset/rebaserebase -iにはどのコマンドが何をするのかの案内が付いているし、git logの出力を好みや妥協点に合わせて整形する方法は数段落で足りる。通常、ユーザー向けコマンドにはgit gc,git fsck,git rev-parseのようなかなり雑多なものも含まれると考える低レベルコマンドは確かにより難解で、一般的なユースケースに最適化されたユーザー向けコマンドでは必ずしも簡単にできないことも、それ自体で多く行う
要約すると、Git は大きく、巨大ですらあるが、ほとんどの開発者にとっては、提供機能のかなりの部分が主流の経路から遠く離れている
恐ろしいのは、ガイドがこれほど長いという点だ
Beej のガイドが概して網羅的なのは知っているが、Git の膨大な微妙さは、これを見るまで正しく実感できていなかった
Jujutsu なら、ずっと薄いガイドになるか、少なくとも人がより発見しやすく学べるガイドになると思う
このガイドは Git の10%程度しか扱っていないと感じているが、一般的な利用の90%は扱えていることを望んでいる
職場で年に1、2回、2時間の Git データモデル入門コースを実施している
実際に
.gitディレクトリの中に入り、ファイルを展開して、すべてが基本データ構造の平文表現にすぎないことを見せる。人々の頭の中でピンと理解がつながる瞬間を見るのは本当に素晴らしい新入社員がコードをコミットし始められるように基本的な Git レシピ文書を共有しているが、ほとんどの人は何が起きているのか理解しないまま、その通りにやるだけだ
一方で授業を受けた人は、コマンドをすべてよく知っているわけではなくても、Git で実際に何が起きているのかについて、かなり合理的な作業上の理解を持つようになる。コマンドは簡単に検索できるので、メンタルモデルさえ合っていればコマンド自体は大きな問題ではない。それなのに HN のほぼすべての Git 記事の議論はコマンドラインの話に流れていく
興味深いことに、この授業は https://xkcd.com/1597/ の代替テキストに似て聞こえる。違いは、技術系の読者にとっては、それが実際に Git を教える正しい方法であり、一度理解すれば忘れない基礎的理解を得られるという点だ
正直、この程度なら時間対効果が高すぎて、やらないほうがおかしいと思う
発表の最後のスライドに、Git データモデルをもとに同僚たちが答える質問を入れた。例えば「コミットを別のブランチに移せるか?」「コミットグラフに循環がないことは何によって保証されるのか?」といった質問だ
人々が単に Git を使うだけで終わらず、Git について考えるようになったのが本当に満足だった
幸い、初期に Git の内部モデルの一部を説明する動画を見て、実際には内部知識がそれほど多くも深くもなくても大きな違いを生むことが分かった。Git の動作方式の5%ほどを知るだけでも、コマンドが何をしているのか、どう使うべきかをずっとよく理解できるようになった
公開されていて2時間に収まるほど簡潔な資料をもとにしているなら、このスレッドや HN の記事として共有してくれるとうれしい。同じテーマでも、前提、比喩、焦点が異なる学習資料は多ければ多いほどよいと信じている
Git の一般的な流れ、マージ、リベースなどはある程度できるが、Git をもっと上達しようとするより jujutsu に移ろうか真剣に悩んでいる。
jjは Git と互換性があり、同僚たちが普通に Git を使っている間、自分だけ使っていてもいい多くのガイドや大半の Git GUI が見落としているコツが一つあると感じます。例外的に magit はうまく扱っています。
アップストリームブランチを
feature/fooのorigin/feature/fooではなく、マージ先、つまり統合ブランチであるmasterやorigin/masterに設定することです。こうすると多くのことが単純になります。
git statusを実行したときに統合ブランチからどれだけ分岐しているかを教えてくれるので便利ですし、引数なしでgit rebaseを実行すれば、そのままアップストリーム上にリベースされます。origin/feature/fooをアップストリームにしておくのはあまり有用ではありません。開発者はリモート上の自分のブランチもたいてい「所有」しているので、そこからどれだけ分岐しているかには大した意味がなく、そこへリベースしたい場面もありません。push.defaultを"current"に設定すれば、git pushも期待どおりfeature/fooをorigin/feature/fooにプッシュします。なぜこの設定がもっと一般的でないのか不思議です。
協業セクションでは フィーチャーブランチ がまったく扱われていません。かなり一般的な作業方式ではないかと思います。
ガイドの「全員が自分のブランチを使う方式」と対比すると有益そうです。また第17節では、GitHub のプルリクエストでブランチを再利用する方式と、PR ごとに新しいブランチを作る方式を扱ってみてもよさそうです。
この記事はまだ確認していませんが、良さそうです。もう一つのおすすめとして、Primeagen が教える boot.dev の Git コースがあります。
インタラクティブで、
.gitディレクトリ内のファイルを直接操作するレベルまで深く踏み込みます。そのコースを受けた後、Git がどう動作するのかについて まったく新しいメンタルモデル ができました。