这一篇在干嘛?
提交了之后呢?这一篇解决日常 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 new、git 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 st、git lg 就能用了。别名的本质是配置文件里的一行替换,不改变任何行为。
小结
- 看历史万能组合:
git log --oneline --graph --decorate --all。 - 三种撤销各管一段:
amend(改最后一次提交)、restore(丢工作区)、restore --staged(取消暂存)。 fetch只下载、pull下载并合并、push上传——push 被拒就先 pull。- 附注标签用于发布,push 不会自动带标签。
- 高频长命令配别名。
学完你会得到:
- 一条命令看懂任何仓库的完整拓扑
- 提交出错后的标准自救流程
- 远程仓库五个动词(clone/fetch/pull/push/remote)的清晰关系
自测
自测
git pull等价于哪两个命令的组合?多出来的那步做了什么?- 为什么已推送的提交不建议用
--amend修改?git restore丢弃的工作区修改还能找回吗?这说明使用前要注意什么?- 本地打了标签,同事 clone 后看不到,为什么?
- 写一条命令:查看仓库全部分支拓扑、最近 10 条提交。