记录时间:首次将「书写」目录(日记 + 笔记)上传到 GitHub 私有仓库的全过程。
本文按「概念 → 逐步实操(含每个命令详解)→ 日常使用 → 拓展篇 → 常见报错 → 安全提醒」展开。
一、先搞懂几个概念
1. Git 是什么?
Git 是一个分布式版本控制系统。通俗说:它像游戏里的"存档点",每当你 commit 一次,就把当时的文件状态完整保存下来,之后可以随时查看历史、回退、对比、多人协作,而不怕改坏东西。
2. GitHub 是什么?
GitHub 是托管 Git 仓库的网站(全球最主流的代码托管平台)。Git 本身只在你电脑上工作,GitHub 的作用是:
云端备份(电脑坏了、丢了,文件不丢)
多设备同步(家里电脑换公司电脑,clone 一下全带走)
可管理、可分享(私有仓库只有你自己能看到)
3. 四个"区"的理解模型(最重要!)
数据流向: 工作区 --git add--> 暂存区 --git commit--> 本地仓库 --git push--> GitHub
为什么分三步? 因为"改了很多文件、但只想提交其中一部分"是常见需求,add 给了你挑选文件的权力;commit 负责打存档;push 才真正上传。
二、全流程实操(本次上传所用)
第 0 步:准备环境 / 检查
it --version # 查看 Git 版本,确认装好了
git config --global user.name "你的名字" # 全局作者名(推荐先配好,一劳永逸)
git config --global user.email "你的邮箱" # 全局作者邮箱本次教训:第 0 步没配全局身份,导致后面 commit 报错
Author identity unknown,被迫逐步排查。先配全局能省很多事。
第 1 步:在 GitHub 网页创建空仓库
1. 浏览器打开 https://github.com/new
2. 填仓库名(注意:仓库名不能是中文,如 write)
3. 选 Private(私有)或 Public(公开)
4. 不勾选 README / .gitignore / license(保持仓库为空)
5. 点 Create repository,记下 HTTPS 地址,形如:
https://github.com/你的账号/write.git
为什么建空仓库?因为如果 GitHub 那边已经有一个 commit(比如自动生成的 README),第一次 push 会被拒绝(详见报错篇)。
第 2 步:进入目录并初始化
cd D:\笔记
git initgit init —— 把当前文件夹变成 Git 仓库。执行后会生成一个隐藏的 .git 文件夹(约几百 KB),这是 Git 的"数据库",不要删、不要手动改。日常使用的文件不会被它影响。
第 3 步:配置本仓库的作者信息
git config user.name "GitHub 用户名"
git config user.email "你的邮箱@example.com"git config —— 读写 Git 配置。三个层级:
为什么 commit 必须要有名字和邮箱? 每次存档都要记录"谁在什么时候存的",这是审计的基础。被记录的名字邮箱不需要跟 GitHub 账号一致,但建议一致,GitHub 才能把提交关联到你的账号头像。
查当前配置:
git config --list;删某一项:git config --unset user.name。
第 4 步:把文件加入暂存区
git add .git add —— 把工作区的改动放入暂存区。常见用法:
关于刷屏的警告:warning: LF will be replaced by CRLF... 是换行符格式提示,无害,可忽略。
原因:Windows 用 CRLF(回车+换行),Linux/Mac 用 LF(只换行),Git 的 core.autocrlf=true(windows 版默认)会在 checkout 时自动转换,所以提醒你"将发生转换"。
第 5 步:提交(打存档点)
git commit -m "初始提交:日记与笔记"git commit —— 把暂存区的内容正式提交到本地仓库,生成一次记录(存档点)。
-m "说明":本次提交的说明文字,必须写,描述"这次改了什么",方便以后翻历史。规范习惯:动词开头,如新增网络工程师笔记、修正错别字。不加
-m会打开编辑器(默认 vim/记事本)让你写说明,新手容易被卡住,所以总是带-m。提交完成后,暂存区清空,工作区不再显示"未提交"状态。
报错:如果没配身份,会报 Author identity unknown / unable to auto-detect email address,按第 3 步配好即可重试。git add 已经执行过的不需要重做。
第 6 步:把主分支改名为 main
git branch -M maingit branch —— 分支管理,可以理解成"平行宇宙":每个分支是一条独立的修改线。你只管一条分支时,它就是一个"主线存档流"。
git branch:列出所有分支(*标记当前所在)-M:强制重命名。git branch -M main意为"把当前分支重命名为 main(如果已存在就覆盖)"为什么叫 main?GitHub 新仓库默认主分支是
main;老版本 Git(2.54 前的默认配置)初始化时默认叫master。这次我们手动改名,让本地与 GitHub 使用同样的名字,推送时最省事。也有git branch -m master(普通改名)一说,但-M最保险。
第 7 步:关联远程仓库
git remote add origin https://github.com/GitHub 用户名/仓库名.gitgit remote —— 管理远程仓库地址列表。
add:添加一个远程仓库origin:约定俗成的"默认远程仓库"名字(叫别的也行,但全世界都用 origin)后面跟的 URL 就是要推送的 GitHub 仓库地址
相关指令:
git remote -v # 查看已关联的远程仓库地址
git remote rename origin up # 改名(把 origin 更名为 up)
git remote set-url origin <新地址> # 改地址(仓库迁移/换号时用)
git remote remove origin # 删除关联第 8 步:推送(上传到 GitHub)
git push -u origin maingit push —— 把本地仓库的提交推送到远程仓库。
命令分解:
认证:Git for Windows 自带 Git Credential Manager(GCM)。第一次推送到 GitHub 会弹窗登录(浏览器授权即可),之后凭据存入 Windows 凭据管理器,以后不再弹窗。查看已存凭据:cmdkey /list 或 git credential-manager github list。
三、日常使用流程(上传之后的常态)
打完第一次包,之后每天的"更新笔记本"就是这三步循环:
cd D:\笔记 # 进入仓库(不写也行,如果终端就在这)
git status # 1. 看看今天改了什么(红色=已改未暂存)
git add . # 2. 把所有改动放进暂存区
git commit -m "新增今日日记" # 3. 打存档点,说明写清楚
git push # 4. 上传(首次 push 后 -u 已绑定,直接 push 即可)习惯建议:写完一篇/批改一次就顺手 push 一次,把"存档点"打密一点,出问题随时能回到任意版本。
四、拓展篇:其他常用指令详解
4.1 查看状态与历史(每日必备)
git status # 状态:哪些文件改了、哪些在暂存区、当前分支
git status -s # 简短版(每行一个文件,适合快速浏览)
git log # 提交历史,从上到下最新在前
git log --oneline # 一条一行+短哈希,最常用
git log --graph # 带分支图(多分支时好看)
git log -3 # 只看最近 3 条
git log --author="qq" # 按作者过滤4.2 查看差异(改了什么)
git diff # 工作区 vs 暂存区(未 add 的改动)
git diff --staged # 暂存区 vs 上次提交(已 add 的改动)
git diff HEAD # 工作区 vs 上次提交(所有未提交改动)
git diff --stat # 只显示文件列表和行数统计,不显示内容4.3 拉取远程(换电脑 / 多设备)
git clone https://github.com/GitHub 用户名/仓库名.git # 第一次:整仓下载到本地
git pull # 之后:拉取远程最新改动并合并到本地
git pull origin main # 明确指定分支(等效)git pull = git fetch(把远程最新提交取下来)+ git merge(合并到本地)。
注意:git pull 前自己先 commit 或 stash,别让工作区有未提交的改动,否则容易冲突。
4.4 分支操作(进阶玩法)
git branch # 列出分支
git branch 实验 # 新建分支「实验」
git switch 实验 # 切换到「实验」(新命令,推荐)
git checkout 实验 # 同 switch(旧命令,也能用)
git switch -c 新实验 # 新建并切换
git merge 实验 # 把「实验」合并到当前分支
git branch -d 实验 # 删除已合并的分支(-D 强制删)推荐用
git switch代替git checkout(Git 2.23+):switch只做切分支这件事,语义清晰;checkout同时管切分支和恢复文件,容易混。
4.5 撤销与回退(救场三招)
场景 A:add 多了/错了,想移出暂存区
git restore --staged 文件名 # 从暂存区退回工作区(内容不丢)场景 B:改坏了,想放弃未提交的改动
git restore 文件名 # 用暂存区/上次提交的内容覆盖工作区(改动丢失,慎用!)
git checkout -- 文件名 # 老写法,等价于上一行场景 C:提交错了,要回退历史
git reset --soft HEAD~1 # 回到上次提交前,改动保留在暂存区
git reset --mixed HEAD~1 # 回到上次提交前,改动保留在工作区(默认模式)
git reset --hard HEAD~1 # 回到上次提交前,改动全丢!!慎用!!
HEAD代表"最新一次提交",HEAD~1是"往前 1 次",HEAD~3往前 3 次;也可以用提交哈希(git log里那串字母数字)。
git revert(对已经 push 过的错误,最安全)**
git revert HEAD # 新建一个"反向提交"撤销上一次,历史不变,推荐用于已推送的提交经验法则:只在本地、没推送的提交随便 reset;已经推送到 GitHub 的提交,尽量用
revert,避免"改写历史"导致多设备同步时一脸懵。
4.6 暂存工作现场(改一半先干别的)
git stash # 把未提交的改动"收起来",工作区变干净
git stash list # 查看暂存的现场
git stash apply # 恢复最近一次(内容还在 stash 里)
git stash pop # 恢复最近一次并删除该 stash(最常用)
git stash drop # 丢弃 stash4.7 .gitignore:让某些文件永远不上传
# 在仓库根目录建一个名为 .gitignore 的文件,如 D:\笔记\.gitignore
# 内容示例:
*.tmp # 忽略所有 .tmp 临时文件
笔记/公众号账密.md # 忽略敏感文件
.obsidian/workspace.json # 忽略 Obsidian 工作区状态规则:
每一行是一个模式,
#开头是注释*通配任意字符;/界定目录;!取反(不忽略).gitignore**只对未跟踪的文件生效**;已经 add 过的文件要移除跟踪:
git rm --cached 文件名 # 从 Git 里移除(保留本地文件)4.8 其他实用小指令
git tag v1.0 # 打标签(给某个提交起个醒目的名字)
git tag # 查看标签
git show HEAD # 查看某次提交的详细内容和改动
git reflog # 所有操作的"操作日志",reset 丢了也能找回来
git config --list # 查看全部配置
git help 命令名 # 打开某个命令的手册4.9 图形界面工具(不想敲命令的替代方案)
GitHub Desktop(官方):点几下完成 add/commit/push,带可视化的历史树
VS Code 自带 Git 面板:左侧源代码管理图标,点点点即可
Obsidian(本库):配合 Git 插件可定时自动 commit+push,笔记党福音
五、常见报错与解决
六、安全提醒(重要)
1. Git 历史是永久记录:即使后来从仓库里删了某个文件,它仍存在于历史提交中(git log 查得到)。密码、账号密钥、API Token 一旦上传,等于泄露,请遵守:上传前先检查,敏感文件一律不进仓库(用 .gitignore,或放到仓库外的目录)。
2. 本次上传内容自查:笔记目录里有 公众号账密.md,已被上传到私有仓库。私有仓库+凭据不泄露时风险较低,但它现在存在于 GitHub 云端,且任何一次误操作改为公开或账号被盗即泄露。建议:① 内容用 *** 脱敏;② 重要密码改掉;③ 或日后用 .gitignore + git rm --cached 移出并重写历史。
3. 私有 ≠ 绝对安全:私有仓库只表示"不能随便访问",不代表加密或无人可读。账号开启两步验证(2FA)可有效防盗。
4. 提交信息不写敏感内容,推送前 git log --oneline 扫一眼。
七、一页速查表
git init # 初始化仓库
git config user.name "名字" # 配作者名
git config user.email "邮箱" # 配作者邮箱
git status # 看状态
git add . # 暂存全部改动
git add 文件 # 暂存指定文件
git commit -m "说明" # 提交
git branch -M main # 主分支改名 main
git remote add origin <地址> # 关联远程仓库
git push -u origin main # 首次推送(绑定关系)
git push # 之后日常推送
git pull # 拉取更新
git clone <地址> # 克隆仓库到本地
git log --oneline # 看提交历史
git diff # 看改动内容
git restore --staged <文件> # 取消暂存
git reset --hard HEAD~1 # 回退一次提交(慎用)
git stash # 暂存当前改动