这一篇在干嘛?

提交了之后呢?这一篇解决日常 80% 的高频问题:怎么看历史、提交完发现写错了怎么办、远程仓库那几个词到底什么关系、版本号(标签)怎么打。对应《Pro Git》第 2 章后半部分。

查看提交历史:git log

最朴素的 git log 会按时间倒序列出所有提交(哈希、作者、邮箱、日期、说明)。常用姿势:

git log -p -2            # 显示最近 2 条提交,并附上每次的具体改动(patch)
git log --stat           # 每条提交下列出改动文件的统计(增删行数)
git log --pretty=oneline # 一行一条,只显示哈希和说明
git log --oneline --graph --decorate --all   # 最强组合(见下)

最后一条值得写进肌肉记忆:

$ git log --oneline --graph --decorate --all
* a1b2c3d (HEAD -> main) add login page
* f4e5d6c fix typo
| * 9c8d7e6 (feature-modal) add modal dialog
|/
* 1a2b3c4 initial commit

一行一个提交、* 画出分支拓扑、decorate 显示每个分支/HEAD 指向哪里、all 覆盖所有分支。看任何一个仓库,先跑这一条。

--since/--until 按时间过滤,-S 函数名 搜索「哪次提交增删了这个字符串」,都很实用。

撤销操作:三个不同的「后悔药」

场景一:提交信息写错了,或忘了 add 某个文件

git commit --amend

把暂存区当前的内容与上一次提交合并成一条新提交,替换掉旧的。刚提交完就发现漏了文件:

git add forgotten.txt
git commit --amend

新手最常见的困惑

amend 会生成一条全新的提交替换旧提交——如果旧提交已经推送到远程且别人可能已经拉取,就不要 amend(原因见变基那篇的黄金法则)。只对还没推送的本地提交使用

场景二:改了文件但还不想提交,想丢弃工作区修改

git restore <file>       # 把工作区该文件恢复成暂存区/上次提交的样子,改动不可恢复

场景三:add 错了,想把文件从暂存区拿回来

git restore --staged <file>   # 取消暂存,工作区的修改仍保留

三者对号入座:amend 修提交、restore 丢工作区改动、restore —staged 取消暂存。改动一旦提交过,几乎总能找回;只有从未提交过的工作区修改git restore 丢弃后是彻底没了——丢弃前想清楚。

远程仓库:fetch、pull、push 到底什么关系

先看远程仓库列表:

git remote -v
# origin  https://github.com/user/repo.git (fetch)
# origin  https://github.com/user/repo.git (push)

origin 是克隆时 Git 自动起的默认名字,不是什么特殊关键字。

  • git fetch origin:把远程仓库的新提交下载到本地,但不合并进你的分支——先看看再决定。
  • git pull:= fetch + 立刻合并到当前分支。省事但少了「先审查」的机会。
  • git push origin main:把本地 main 的新提交上传到远程 main。
你的工作区 ← fetch 下载到本地仓库 ←→ 远程仓库(origin)
            pull = fetch + merge
            push 把本地新提交推给远程

新手最常见的困惑

push 被拒绝(提示 non-fast-forward)?几乎 always 是因为远程有你没有的新提交。正确姿势:先 git pull 把远程的拿下来合并,再 git push

查看远程详情:git remote show origin;改名/删除:git remote rename old newgit remote remove name

打标签:给历史立里程碑

标签 = 指向某个提交的固定路标,通常用于发布版本(v1.0、v2.3.1)。

git tag                       # 列出所有标签
git tag -l "v2.*"             # 按模式搜索
git tag v1.0-lw               # 轻量标签:只是个指向提交的指针
git tag -a v1.0 -m "第一个正式版"    # 附注标签:带说明、日期、作者(推荐发布用)
git show v1.0                 # 查看标签详情

标签默认不会被 push 带出去,要单独推:

git push origin v1.0          # 推单个
git push origin --tags        # 推全部

历史中间某个提交打标签:git tag -a v0.9 <提交哈希前几位>

Git 别名:把长命令缩写

git config --global alias.co checkout
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --decorate --all"

之后 git stgit lg 就能用了。别名的本质是配置文件里的一行替换,不改变任何行为。

小结

  • 看历史万能组合:git log --oneline --graph --decorate --all
  • 三种撤销各管一段:amend(改最后一次提交)、restore(丢工作区)、restore --staged(取消暂存)。
  • fetch 只下载、pull 下载并合并、push 上传——push 被拒就先 pull。
  • 附注标签用于发布,push 不会自动带标签。
  • 高频长命令配别名。

学完你会得到:

  • 一条命令看懂任何仓库的完整拓扑
  • 提交出错后的标准自救流程
  • 远程仓库五个动词(clone/fetch/pull/push/remote)的清晰关系

自测

下一篇:🌿 分支必杀技:指针、HEAD 与合并