Git 保存的是项目快照及其历史。一次可靠的提交应回答三个问题:改了什么、选择了哪些改动、为什么改。先理解工作区、暂存区和提交,再使用命令。
三个区域与 HEAD
跳转到“三个区域与 HEAD”| 名称 | 含义 | 常用检查 |
|---|---|---|
| 工作区 | 当前磁盘上的文件,可以包含未跟踪文件 | git status --short、git diff |
| 暂存区(index) | 准备写入下一次提交的快照 | git diff --cached |
| 提交历史 | 已保存的快照、父提交和作者等信息 | git log --oneline --graph |
| HEAD | 当前检出的提交,通常通过当前分支名指向它 | git status --branch |
编辑文件 → 工作区 --git add--> 暂存区 --git commit--> 新提交 git diff --cached 检查待提交内容提交保存暂存区的内容。暂存后继续编辑同一文件,新的编辑仍留在工作区,不会自动进入这次提交。提交哈希也不是单纯的文件校验和:文件树相同的两次提交仍可有不同的父提交、作者和说明。
第一次开始
跳转到“第一次开始”安装后用 git --version 检查可执行程序。身份设置写入提交记录,不等于登录 GitHub,也不保存远程访问密码:
git config --global user.name "Your Name"git config --global user.email "you@example.com"git config --show-origin --get user.name只为当前项目设置身份时省略 --global。创建空仓库和克隆已有仓库是两个起点,选择其一:
# 从空目录开始git init -b main my-projectcd my-project# 从已有历史开始;替换为实际项目地址git clone https://example.com/team/project.gitcd project一次日常提交
跳转到“一次日常提交”git status --short --branchgit diff -- src/main.cgit add -- src/main.cgit diff --cachedgit diff --cached --checkgit commit -m "fix: handle empty input"git status --short --branch按路径暂存避免把临时输出、密码配置和其他未完成改动混入。需要选择同一文件中的部分修改时用 git add -p。.gitignore 只影响尚未跟踪的文件;已跟踪文件不会因为加入忽略规则而自动退出历史。
取消暂存、丢弃修改和停止跟踪
跳转到“取消暂存、丢弃修改和停止跟踪”以下命令用途不同,不能互换。表中的 HEAD 示例要求仓库已有首次提交。
| 目标 | 命令 | 对工作区的影响 |
|---|---|---|
| 取消某文件的暂存 | git restore --staged -- src/main.c | 保留文件当前内容 |
| 丢弃某文件未暂存修改 | git restore -- src/main.c | 用暂存区内容覆盖工作区,请先看 diff |
| 将暂存区和工作区都恢复到 HEAD | git restore --source=HEAD --staged --worktree -- src/main.c | 丢弃该文件已暂存及未暂存改动 |
| 文件留在磁盘,但下一提交不再跟踪它 | git rm --cached -- local.conf | 磁盘文件保留;索引中的删除需要提交 |
默认 restore 的来源是暂存区,不总是最后一次提交。旧命令 git checkout -- file 同样会覆盖工作区,不是“撤销 add”。更改已发布历史、误用 hard reset 后的处理见 Git 恢复。
分支与小范围整理
跳转到“分支与小范围整理”git switch -c feature/input-checkgit branch -vvgit switch maingit branch -d feature/input-check分支是指向提交的可移动引用;switch 会更新工作区。Git 拒绝切换时先检查未提交内容,不要用强制选项绕过。删除分支前必须离开它;-d 会检查合并状态,-D 跳过保护,不能作为默认清理方式。
| 任务 | 命令与前提 |
|---|---|
| 重命名当前分支 | git branch -m new-name;不会自动修改服务器默认分支 |
| 修订尚未公开的最近提交 | 暂存正确内容后 git commit --amend;会生成新提交哈希 |
| 保留改动、撤回本地最近提交 | git reset --soft HEAD~1;仅对明确尚未公开且有父提交的情况使用 |
| 取用另一个提交的变更 | git cherry-pick <commit>;发生冲突后选择 continue 或 abort |
| 给发布点加带说明标签 | git tag -a v1.0.0 -m "Release 1.0.0",再明确推送该标签 |
| 获取项目记录的子模块 | git submodule update --init --recursive;子模块有独立仓库和自己的改动 |
reset --soft HEAD 不移动 HEAD,因此不会撤销上一提交。reset --hard HEAD 清除当前提交上的工作区/索引改动,也不会自动删除“所有未推送提交”。
查看差异与历史
跳转到“查看差异与历史”git log --oneline --decorate --graph -n 15git show --stat HEADgit diff HEAD~1 HEAD -- src/main.cgit blame -- src/main.cgit help restore