提交流程
日常开发的标准四步:
$ git status # 1. 查看哪些文件被修改
$ git diff <file> # 2. 查看具体改了什么
$ git add <file> # 3. 把修改加入暂存区
$ git commit -m "msg" # 4. 提交
git commit -am(一步搞定 add + commit)
$ git commit -am '我是注释'
⚠️ 注意:
commit -am只会 add 已跟踪的文件(即之前git add过、或者已经被 commit 过的文件)。新文件不会被 add,要先git add <new-file>才能提交。
所以 commit -am 适合修改现有文件,不适合新增文件。
git add 的几种用法
$ git add <file> # 单个文件
$ git add *.txt # 通配符(shell glob)
$ git add . # 当前目录及子目录的所有修改
$ git add -A # 整个仓库的所有修改(包括删除)
$ git add -p # 交互式分块 add(hunk-level)
git add -p在修改很多、想分多个提交时特别有用——可以一个文件里一部分修改先 add,另一部分留着。
git status 状态速查
git status 输出会按状态分组列出文件:
| 状态标识 | 含义 |
|---|---|
Changes to be committed | 已暂存(绿色) |
Changes not staged for commit | 修改但未暂存(红色) |
Untracked files | 新文件,未被跟踪(红色) |
nothing to commit, working tree clean | 工作区干净 |
删除文件
git rm(从工作区和暂存区都删除)
$ git rm a.txt
执行后 a.txt 会在工作区被删除,并且删除操作进入暂存区。下一次 commit 时,这个删除会被记录到历史中。
只想从暂存区撤回,工作区保留
$ git rm --cached <file>
常见场景:不小心把 .idea/ 或 *.log 提交了,先 git rm --cached 然后补上 .gitignore。
查看历史
基本日志
$ git log # 完整日志
$ git log --oneline # 简介模式(每个提交一行)
$ git log --oneline -5 # 最近 5 条
$ git log --graph # 带合并图形
$ git log -p <file> # 看某文件的历史修改
$ git log -- <file> # 看某文件涉及的所有提交
git blame(追溯每行最后是谁改的)
$ git blame <file>
每行输出形如:
^abc1234 (author 2024-01-01 10:00:00 +0800 1) package main
def56789 (other 2024-02-15 14:30:00 +0800 2) import "fmt"
适合定位某行代码的引入提交。
git reflog(救命稻草)
$ git reflog
reflog 记录所有 HEAD 的移动历史,包括 reset、checkout、commit 等操作。
经典场景:
git reset --hard HEAD^后发现 commit 找不回来了,git log看不到,但git reflog里还有记录,git reset --hard <hash>就能找回。
配置彩色 git lg
把日志配成带图形、彩色、相对时间:
$ git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
效果:
* 8a7c1f2 - (HEAD -> main, origin/main) feat: 新增用户模块 (2 days ago) <来两杯美式>
* b2d4e89 - (tag: v1.0.0) chore: 升级依赖 (1 week ago) <来两杯美式>
* 1c0b3a7 - fix: 修复登录失败 (2 weeks ago) <来两杯美式>
* f3a2e0c - Merge branch 'feature/xxx' (3 weeks ago) <来两杯美式>
|\
| * 4d9e1b5 - feat: 实现 xxx 功能 (3 weeks ago) <来两杯美式>
暂存区管理
$ git reset HEAD <file> # 把已 add 的文件撤回到工作区
$ git reset HEAD . # 全部撤回
这只影响暂存区,不影响工作区文件本身——也就是”取消 add”,文件内容保留在工作区。
git stash:保存临时节点
工作到一半需要切分支,但又不想提交当前的半成品——用 stash 把当前工作状态打包存起来。
基础操作
$ git stash # 保存当前修改,HEAD 回到上一个 commit
$ git stash apply # 恢复(不删除 stash)
$ git stash pop # 恢复并删除 stash
$ git stash list # 查看所有 stash
$ git stash drop stash@{0} # 删除指定 stash
带注释的 stash
$ git stash push -m "修复登录 bug 但没写完"
便于后续从 stash list 里识别不同节点。
跨分支恢复 stash
$ git stash branch <new-branch> stash@{0}
新建分支并把 stash 内容应用到该分支——适合 stash 里有未完成改动、想在新分支继续的场景。
包含未跟踪文件
$ git stash -u # 把 untracked 文件也存起来
$ git stash --include-untracked
git clean -d -fx会永久删除未跟踪文件,先 stash 再 clean 更安全(详见第六篇)。
下一篇:Git 知识系列(三):撤销与回退,讲 reset / checkout / revert 三大撤销命令的区别与正确使用场景。