Skip to main content

読んだ: 「やりたいことが今すぐわかる 逆引きGit入門」

「やりたいことが今すぐわかる 逆引きGit入門」(著: 高 見龍、訳: 鶴本 彰子)を読みました。

数年前に一度読み、先日再び一部読み直しました。特に有名な本ではない気がしますが、Gitの入門書として良書だと思ったので感想を書きます。ちなみにわたしがGitを困らずに使えるようになったのはこの本のおかげです。

  • Gitの操作を一つずつ仕組みを踏まえて解説していく本
  • コマンドラインに加え、GUIとしてSourcetreeの二つ扱っている
  • 著者は台湾の人っぽい
  • 語りかけているような講義調の文体。著者の文章と訳者の訳が上手なのか頭にすっと入ってきた
  • 逆引きGit入門というタイトルだが、辞書感はあまりない(タイトルでちょっと損している気が…)
    • こういうときどうするかという事例集でありつつも、ハンズオン形式でGitの概念とコマンドを順を追って説明しているからかな?
  • Gitのガベージコレクションや.gitディレクトリの中身などのちょっと進んだ解説が面白かった
    • ある程度Gitを使えるようになってからもう一度読むとさらに勉強になる!
  • こういう人に合っていると思う(かつての自分)
    • Gitは何となく使えるけどググってばかり
    • Gitってなんか怖い
    • Gitの概念や仕組みからしっかり理解したい
    • コマンドを使えるようになりたい

印象に残っている部分

二つ紹介します。

git addでステージングエリアに載せてからgit commitでコミットと、なぜ2回操作が必要なのか?という質問で、以下のように例えていたのが面白かったです。(4.3章)(以下の文章は本の抜粋ではなく、該当の文章をわたしが意訳したものです)

倉庫を一つ所有していて、倉庫の前にはちょっとした荷物置き場のスペースがあるとする。トラックで届く荷物を待っているとする。届いた荷物は一旦倉庫の前の空きスペース(ステージングエリア)に置いておく(git add)。ある程度届いたら倉庫(リポジトリ)に移す(git commit)。荷物が届くたびに毎回倉庫に移してもいいけど、そうすると倉庫に移した記録(コミットログ)が細々して後で見返すと分からなくなりがち。きりのいい単位で荷物をまとめて倉庫に移して記録を付けると分かりやすいよね。

もう一つ、ブランチを切り替え忘れてコミットしてしまったときの対処法です。(11.1章)

こういうコミットログを考えます。

コミットIDがc004とc005のコミットはdevelopブランチに積むつもりがmainブランチにすでに積んでしまった!今のmainとdevelopを入れ替えたいというケースです。時々やるやつですね。

git log --oneline

c005 (HEAD, main) foo
c004 piyo
c003 (develop) fuga
c002 hoge
c001 first commit

どうやって入れ替えましょうか?この本では以下の二つの方法が紹介されています。

まずはdevelopを元々置きたかったc005(今のHEAD)に持ってきてから、mainブランチをc003まで持ってくる方法です。

# git branch <branch-name> <commit-ID>でbranch-nameをcommit-IDに作る
# branch-nameが既に存在するときは-fオプションを使う
git branch -f develop c005

# この段階ではmainブランチをcheckoutしている
# 以下の2行の代わりにgit reset --hard c003でもいい
git switch develop
git branch -f main c003

もう一つ、mainとdevelopの名前を入れ替える方法もあります。

# ブランチの名前を変える時に、そのブランチがHEADにいると名前を変えられないので
# c005にHEADを置く(detached HEAD)
# git checkout c005でもよい
git switch c005 --detach
git branch -m develop tmp
git branch -m main develop
git branch -m tmp main
# detached HEADを解消する
git switch main

変数xとyを入れ替えるときに、yをtmpに、xをyにして最後にtmpをxに変える方法がありますが、これと同じことですね。鮮やかな解法ですね。

本の中で繰り返し述べられていますが、ブランチというのはコミットログのツリーの枝(例えばVSCodeの拡張機能であるGit Graphの線)全体を指すものではなく1、特定のコミットに貼り付けた付箋のようなものです。

最初の解法ではgit branch <branch-name> <commit-ID>によって、付箋を剥がしては別のコミットに貼るイメージ、次の解法ではgit branch -mによって付箋を貼り変えるイメージです。

ブランチはツリーではなくコミットを指す付箋だという教えを実感できる解法が本の最後に出てきて、読んでいて感動しました。

なお、本では触れられていませんが、developブランチにcherry-pickする方法もあります。

git switch develop
git cherry-pick c004 c005
git switch main
git reset --hard c003

  1. じゃあよく見るコミットログのツリーの枝は何なのかですが、各コミットにはその親のコミット(≒一個前のコミット)のコミットIDが記録されています。それをつなげたのがよく見るツリーの枝です。 ↩︎