跳转到内容
新建笔记

Git:工作区、暂存区与日常工作流

Git 保存的是项目快照及其历史。一次可靠的提交应回答三个问题:改了什么、选择了哪些改动、为什么改。先理解工作区、暂存区和提交,再使用命令。

名称含义常用检查
工作区当前磁盘上的文件,可以包含未跟踪文件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-project
cd my-project
终端窗口
# 从已有历史开始;替换为实际项目地址
git clone https://example.com/team/project.git
cd project
终端窗口
git status --short --branch
git diff -- src/main.c
git add -- src/main.c
git diff --cached
git diff --cached --check
git 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
将暂存区和工作区都恢复到 HEADgit 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-check
git branch -vv
git switch main
git 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 15
git show --stat HEAD
git diff HEAD~1 HEAD -- src/main.c
git blame -- src/main.c
git help restore

当问题涉及远端,继续阅读 远程同步;两条历史需要整合时阅读 合并、变基与冲突。

参考:git-restore、git-reset、Git 基础。