Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled
89 lines
3.5 KiB
Markdown
89 lines
3.5 KiB
Markdown
# Reading history
|
|
|
|
One of the things that makes Git so valuable is its facilities for
|
|
studying history -- both
|
|
|
|
- very recent history (e.g., rereading your own branch before you
|
|
send a PR), and
|
|
- the distant past (e.g., tracking down when and why some piece
|
|
of code became the way it is.)
|
|
|
|
This guide, written by Greg Price, will help you take advantage of
|
|
these powerful abilities.
|
|
|
|
## Use a graphical client
|
|
|
|
One great way to read history: [use a graphical Git client](setup.md#get-a-graphical-client)!
|
|
Especially helpful for
|
|
|
|
- reading through the recent commits, or
|
|
- clarifying how branches are related to each other.
|
|
|
|
## The "secret" to using `git log -p`
|
|
|
|
Use `git log -p`, with this important secret:
|
|
|
|
- In the pager that `git log` puts you into, hit `/` to search, then enter
|
|
the pattern `^c` -- that is, caret, then `c`. Then hit `n`/`N` for
|
|
next/previous match.
|
|
|
|
- This finds lines that begin with `c`. Because of thoughtful design in
|
|
the default format of `git log`, these are exactly the first line of the
|
|
log entry for each commit. So with this search pattern, you effectively
|
|
get **keybindings for "next/previous commit"**. This makes a huge
|
|
difference in skimming quickly past boring commits without missing
|
|
anything.
|
|
|
|
- For a further upgrade, use `git log --stat -p` (you might alias this as
|
|
e.g., `git lsp`.) Now every time you hit `n` or `N`, you see the commit
|
|
message and complete list of affected files for the new commit -- a good
|
|
summary to help decide whether to read in more detail or hit `n`/`N`
|
|
again to move on.
|
|
|
|
## Filter `git log` down to relevant commits
|
|
|
|
Use some of `git log`'s many features to filter down to commits you
|
|
care about. For example:
|
|
|
|
- Filter to a range of commits with `git log A..B`. E.g., to reread your
|
|
current branch relative to upstream main, you might say
|
|
`git log --stat -p upstream/main..`, or `git log --stat -p @{u}..`.
|
|
(Greg has the latter aliased as `git usp`, and types it constantly.)
|
|
|
|
- Filter to changes touching certain files or directories:
|
|
`git log PATHS`.
|
|
|
|
- Filter to changes touching lines that mention some pattern:
|
|
`git log -G PATTERN`.
|
|
|
|
- Filter to changes adding or removing mentions of some pattern:
|
|
`git log -S PATTERN`. This feature is traditionally called the
|
|
"pickaxe", presumably in honor of its power to mine just the right bit
|
|
of historical/explanatory gold.
|
|
|
|
- Many more. Do take a few minutes to skim through the documentation in
|
|
`git help log` (or [this web version](https://git-scm.com/docs/git-log))
|
|
to get an idea of what's available; and perhaps an hour now and then to
|
|
read and try things in more detail.
|
|
|
|
## Filter in your graphical client
|
|
|
|
Try all those `git log` filtering features in your graphical client -- it
|
|
may even support the very same command-line options to do it. For
|
|
example, `gitk upstream/main..` shows basically the same information as
|
|
`git log --stat -p upstream/main..`, but graphically.
|
|
|
|
## Git a summary, with `git log --oneline`
|
|
|
|
Try `git log --graph --oneline --decorate --boundary`. (Quite a mouthful;
|
|
Greg has this aliased as `git k`, in homage to `gitk`.) It can be a
|
|
lightweight alternative to your graphical client for simple, routine
|
|
situations, giving a compact list of commits each on just one line.
|
|
|
|
- To list the commits local to your current branch: `git k @{u}..`.
|
|
(Greg has an alias for this, and types it constantly.)
|
|
|
|
- To list all your own local commits on all branches:
|
|
`git k --branches @ --not --remotes=origin --remotes=upstream`.
|
|
(For explanation, see `git help log`.)
|