New Chat
Ctrl
K
  • Websites
  • Docs
  • Slides
  • Sheets
  • Deep Research
Kimi Code 3x Boost Kimi Claw
Chat History
Mobile App
  • About Us
    • Visit Moonshot AI
    • Open Platform
    • Features
    • Terms of Service
    • Privacy Policy
  • Language
  • User Feedback

Git分支与时间戳

git如何查看当前分支的父分支
在 Git 里,“父分支”并不是一个官方术语,通常大家想表达的是:
  1. 当前分支是从哪一条分支首次 fork 出来的(即“Fork-Point”)。
  2. 当前分支与哪条分支最近的一次共同提交在哪(即“合并基” merge-base)。
下面给出几种常见场景的做法,按需要选用即可。

  1. 只想知道“合并基”是谁

bash
Copy
# 假设你想拿当前分支与 master 比较
git merge-base --fork-point master
输出的是 commit-id,它就是当前分支与 master 最近的那个共同祖先。
如果该命令什么也不返回,说明 Git 找不到 reflog 里的 fork-point,可改用:
bash
Copy
git merge-base master HEAD        # 同样给出共同祖先,但不做 reflog 限定

  1. 不仅要看合并基,还想看“大概是哪条分支”

Git 本身不记录“我从哪条分支 git checkout -b”,只能猜。
最实用的办法是:列出所有分支,看谁的合并基跟当前分支最深(即最靠近当前分支顶端):
bash
Copy
#!/bin/sh
# 保存为 guess-parent.sh
current=$(git rev-parse --abbrev-ref HEAD)
for base in $(git for-each-ref --format='%(refname:short)' refs/heads/); do
    [ "$base" = "$current" ] && continue
    mb=$(git merge-base $current $base) || continue
    # 计算从合并基到当前分支顶端的提交数,越多说明“越像”父分支
    ahead=$(git rev-list --count $mb..$current)
    echo "$ahead $base"
done | sort -nr | head -1
运行结果会给出“最像父分支”的名字。
(原理:从共同祖先到当前分支的提交越多,说明两条分支分开得越早,反之则越晚。)

  1. 图形化直接看分叉点

bash
Copy
git log --all --graph --decorate --oneline -n 30
在 ASCII 图里很容易看出当前分支是从哪条分支“叉”出来的。

  1. 如果团队使用合并(非 squash)工作流

每次合并进主干都会生成一个“有两个父母”的合并提交。
此时真正的“父”有两个:
bash
Copy
# 查看最近一次合并提交的父母
git log -1 --pretty=%P <merge-commit>
第一个父是主干方向,第二个父是被合并的分支方向。

一句话总结

Git 不保存“父分支”概念;
  • 看“共同祖先”:git merge-base master HEAD
  • 猜“最可能的分支”:用上面脚本找 merge-base 最深者
  • 图形化:git log --all --graph
git log --all --graph --decorate --oneline -n 30 如何显示时间戳
把 --pretty=format:... 加进去就能随意拼装时间戳,同时保留图形和装饰信息。
最常用的一行写法:
bash
Copy
git log --all --graph --decorate \
        --pretty=format:'%C(auto)%h %C(bold blue)%ai%C(reset) %C(auto)%d %s'
字段解释
  • %ai → 作者时间,ISO-8601 格式(2023-11-18 21:34:12 +0800)
  • %ci → 提交时间(committer)
  • %ar / %cr → 相对时间(“2 hours ago”)
想再紧凑一点,只显示日期:
bash
Copy
git log --all --graph --decorate \
        --pretty=format:'%C(auto)%h %Cgreen%as%C(reset)%C(auto)%d %s'
习惯用别名就加到 ~/.gitconfig:
ini
Copy
[alias]
    lg = log --all --graph --decorate \
           --pretty=format:'%C(auto)%h %C(bold blue)%ai%C(reset)%C(auto)%d %s'
以后直接 git lg -n 30 即可。
可以在--pretty里增加分支名吗
--pretty 里没有“当前分支名”的占位符。
%d(或 %D)只能打印“HEAD 此时指向的引用”——也就是 git log 正在遍历的那个 commit 上实际挂着的分支或 tag 名。
对同一条 commit 来说,不管你在哪条分支上执行命令,%d 打出来的内容都一样,它不会告诉你“这是我现在站的分支”。
所以:
  • 想在每一行前面都重复打印同一条分支名(即“我当前在哪”),只能自己把分支名先读出来,再拼到 format 里:
    bash
    Copy
    b=$(git rev-parse --abbrev-ref HEAD)
    git log --all --graph --pretty=format:"%C(auto)%h %Cblue%ai%C(reset) %C(yellow)$b%C(reset)%C(auto)%d %s"
  • 如果只是想一眼看出每个 commit 属于哪条分支,用 --decorate(已经默认打开)就够了,%d 会把该 commit 上所有引用(分支、tag)都列出来;
    不需要也不可能在 %d 里“只显示当前分支”,因为 commit 可能被多条分支共享。
结论:
--pretty 格式串里没有“当前分支名”专用占位符;需要就自己拼变量,或者接受 %d 给出的“该 commit 上实际挂着哪些引用”。