跳至正文
来两杯美式
返回

Git 知识系列(二):日常工作流

By 来两杯美式
发布于更新于

提交流程

日常开发的标准四步:

$ 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 三大撤销命令的区别与正确使用场景。


分享这篇文章:
通过邮件分享这篇文章✓ 链接已复制
所属专题
Git
第 2 / 8 篇
查看系列全部文章
  1. 01.Git 知识系列(一):安装与基础配置
  2. 02.Git 知识系列(二):日常工作流
  3. 03.Git 知识系列(三):撤销与回退
  4. 04.Git 知识系列(四):分支管理与远程协作
  5. 05.Git 知识系列(五):标签、忽略与子模块
  6. 06.Git 知识系列(六):仓库维护与排错
  7. 07.Git 知识系列(七):Submodule 操作指南
  8. 08.Git 知识系列(八):多 Remote 双向同步

上一篇
Git 知识系列(三):撤销与回退
下一篇
Git 知识系列(一):安装与基础配置