丈菊
丈菊
发布于 2026-08-23 / 3 阅读
0
0

Git 与 GitHub 上传全流程

记录时间:首次将「书写」目录(日记 + 笔记)上传到 GitHub 私有仓库的全过程。

本文按「概念 → 逐步实操(含每个命令详解)→ 日常使用 → 拓展篇 → 常见报错 → 安全提醒」展开。

一、先搞懂几个概念

1. Git 是什么?

Git 是一个分布式版本控制系统。通俗说:它像游戏里的"存档点",每当你 commit 一次,就把当时的文件状态完整保存下来,之后可以随时查看历史、回退、对比、多人协作,而不怕改坏东西。

2. GitHub 是什么?

GitHub 是托管 Git 仓库的网站(全球最主流的代码托管平台)。Git 本身只在你电脑上工作,GitHub 的作用是:

  • 云端备份(电脑坏了、丢了,文件不丢)

  • 多设备同步(家里电脑换公司电脑,clone 一下全带走)

  • 可管理、可分享(私有仓库只有你自己能看到)

3. 四个"区"的理解模型(最重要!)

名称

通俗理解

相关命令

工作区 Working Directory

你正在编辑的文件所在的文件夹

你在资源管理器/编辑器里改文件

暂存区 Staging Area

选中了本次要提交的文件,正在"打包区"排队

git add

本地仓库 Local Repository

已保存的存档点,在 .git 文件夹里

git commit

远程仓库 Remote Repository

GitHub 上的仓库

git push / git pull

数据流向: 工作区 --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 init

git init —— 把当前文件夹变成 Git 仓库。执行后会生成一个隐藏的 .git 文件夹(约几百 KB),这是 Git 的"数据库",不要删、不要手动改。日常使用的文件不会被它影响。

第 3 步:配置本仓库的作者信息

git config user.name  "GitHub 用户名"
git config user.email "你的邮箱@example.com"

git config —— 读写 Git 配置。三个层级:

位置

命令

生效范围

系统级

--system

整台电脑所有用户(很少用)

全局级

--global

当前用户的所有仓库

仓库级

(不加参数,即本次)

只对当前仓库生效(覆盖全局)

为什么 commit 必须要有名字和邮箱? 每次存档都要记录"谁在什么时候存的",这是审计的基础。被记录的名字邮箱不需要跟 GitHub 账号一致,但建议一致,GitHub 才能把提交关联到你的账号头像。

查当前配置:git config --list;删某一项:git config --unset user.name

第 4 步:把文件加入暂存区

git add .

git add —— 把工作区的改动放入暂存区。常见用法:

命令

含义

git add .

添加当前目录下**所有**改动(新增、修改、删除都算)

git add 文件名

只添加指定文件,如 git add 日记/2025/4/2025-04-10.md

git add 文件夹/

添加整个文件夹

git add -A

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 main

git 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 用户名/仓库名.git

git 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 main

git push —— 把本地仓库的提交推送到远程仓库。

命令分解:

部分

含义

push

推送

-u

--set-upstream 的简写:把本地 main 与远程 origin/main 绑定"上下游关系",之后只用敲 git push 即可,不用再写 origin main

origin

目标远程仓库(第 7 步定义的)

main

本地要推送的分支

认证:Git for Windows 自带 Git Credential Manager(GCM)。第一次推送到 GitHub 会弹窗登录(浏览器授权即可),之后凭据存入 Windows 凭据管理器,以后不再弹窗。查看已存凭据:cmdkey /listgit 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             # 丢弃 stash

4.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,笔记党福音

五、常见报错与解决

报错

原因

解决

Author identity unknown/ unable to auto-detect email

没配 user.name / user.email

git config user.name "xx" + git config user.email "xx"

repository not found

1. 地址拼错/账号错;2. GitHub 上还没建这个仓库

先去 github.com/new 建好,或 git remote set-url 改地址

! [rejected] ... fetch first

远程有本地没有的提交

git pull(先合并远程改动)或 git pull --rebase 再 push;确认远程为空仓库则不可能出现

fatal: remote origin already exists

git remote add

改用 git remote set-url origin <地址>

push 一直弹窗失败

凭据过期/账号错

控制面板→凭据管理器删除 git:https://github.com 记录,重新 push 授权

Please tell me who you are 后 commit 又好了但名字是邮箱

把 name 和 email 写反了

重新 git config user.name 覆盖

六、安全提醒(重要)

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                       # 暂存当前改动


评论