Git 本地项目推送到 GitHub 实战:init、commit、push 详解
刚开始学 Git 的时候,很多人都会卡在这几个问题上:
- 我已经在本地写好了项目,接下来怎么上传到 GitHub?
git init、git add、git commit、git push到底分别在干什么?- 本地仓库和远程仓库有什么区别?
- 为什么我一推送就报错?
本文将不只讲解命令,还会尽量把背后的逻辑讲清楚。
详细讲解了将本地 Git 项目推送到 GitHub 的完整流程。内容包括创建本地目录、初始化仓库、配置 .gitignore、理解暂存区与提交、绑定远程地址及执行推送。此外,还总结了 fatal 错误、远程已存在、分支不匹配及认证失败等常见问题及其解决方法,旨在帮助开发者掌握 Git 版本控制的核心工作流。
刚开始学 Git 的时候,很多人都会卡在这几个问题上:
git init、git add、git commit、git push 到底分别在干什么?本文将不只讲解命令,还会尽量把背后的逻辑讲清楚。
如果你现在的状态是:
那这篇文章会比较适合你。
本文会一步一步带你走完下面这条主线:
本文使用的示例项目名是 RepoCopilot,你也可以把它替换成自己的项目名来操作。
如果只记一句话,可以记这个:
也就是说,Git 主要负责本地版本管理,GitHub 主要负责远程托管和协作。
一个项目从本地推到 GitHub,通常会经历下面这条主线:
先在本地新建一个文件夹作为项目根目录:
mkdir RepoCopilot
cd RepoCopilot
这时它还只是一个普通文件夹,不是 Git 仓库。
你可以先放一些基础文件进去,比如:
README.md.gitignoreLICENSE例如:
touch README.md .gitignore
mkdir apps
在项目目录执行:
git init -b main
这一步做了两件事:
.git 目录参数 -b main 的作用是把默认分支直接设为 main。
执行后,你可以用下面命令检查当前状态:
git status
如果成功,通常会看到类似信息:
On branch main
No commits yet
Untracked files: (use "git add <file>..." to include in what will be committed)
这表示仓库已经初始化成功,但还没有任何提交记录。
.gitignore很多新手会直接 git add .,结果把不该上传的内容也一起传上去了。
所以初始化之后,最好先写一个 .gitignore。
例如 Python 或全栈项目常见写法:
__pycache__/
*.py[cod]
.venv/
node_modules/
.env
dist/
build/
.gitignore 的作用是告诉 Git:
典型不应该提交的内容包括:
git add 在做什么Git 里有一个很重要的概念叫'暂存区'。
可以把它理解成三层:
如果你想把当前修改准备提交,需要先执行:
git add .
这里的 . 表示把当前目录下的所有变更加入暂存区。
然后执行:
git status
你通常会看到类似:
Changes to be committed:
new file: README.md
new file: .gitignore
说明这些文件已经准备好进入下一次提交。
git commit 在做什么git add 只是把文件放进暂存区,还没有真正写进版本历史。
真正生成一个'历史快照'的命令是:
git commit -m "chore: bootstrap RepoCopilot project"
这里:
commit 表示创建一次提交-m 表示直接写提交说明一次 commit 可以理解为项目在某个时刻的一个快照。
提交后,可以查看历史:
git log --oneline
例如:
423c79d chore: bootstrap RepoCopilot project
这表示你已经有了第一条版本记录。
在提交之前,建议先配置用户名和邮箱。
全局配置方式:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
如果你只想给当前项目配置:
git config user.name "Your Name"
git config user.email "[email protected]"
建议邮箱尽量和 GitHub 账号关联邮箱保持一致,这样提交记录更容易在 GitHub 上正确归属到你的账号。
本地仓库准备好后,下一步是在 GitHub 上创建远程仓库。
创建时通常需要填写:
如果你的本地已经有 README.md、.gitignore、LICENSE,建议创建远程仓库时不要再勾选初始化这些文件。
原因很简单:
第一次推送时就更容易出现冲突。
创建完成后,GitHub 会给你一个仓库地址。
HTTPS 形式通常是:
https://github.com/你的用户名/RepoCopilot.git
SSH 形式通常是:
git@github.com:你的用户名/RepoCopilot.git
如果你刚开始使用,HTTPS 会更直观一些。
现在本地仓库还不知道 GitHub 上对应的是哪个远程仓库,所以需要先绑定:
git remote add origin https://github.com/你的用户名/RepoCopilot.git
这里:
remote 表示远程仓库add 表示新增一个远程origin 是远程仓库的默认名字你可以用下面命令检查绑定结果:
git remote -v
通常会看到:
origin https://github.com/你的用户名/RepoCopilot.git (fetch)
origin https://github.com/你的用户名/RepoCopilot.git (push)
这说明本地已经成功关联远程仓库。
执行下面这条命令:
git push -u origin main
这条命令可以拆成几个部分理解:
push:把本地提交上传到远程origin:远程仓库名main:要推送的分支-u:建立本地 main 和远程 origin/main 的跟踪关系第一次推送成功后,后面如果你一直在 main 分支开发,通常只需要:
git push
刷新 GitHub 页面后,你就能看到本地项目已经同步到了远程仓库。
第一次推送完成后,后面的开发大多会进入一个固定循环:
常见命令流程如下:
git status
git add .
git commit -m "feat: add repository health endpoint"
git push
这就是最典型的 Git 日常开发流程。
fatal: not a git repository原因通常有两个:
git init解决方式:
git init -b main
或者先进入正确目录再执行 Git 命令。
remote origin already exists说明你已经添加过一个名为 origin 的远程仓库。
解决方法一,先删再加:
git remote remove origin
git remote add origin https://github.com/你的用户名/RepoCopilot.git
解决方法二,直接修改远程地址:
git remote set-url origin https://github.com/你的用户名/RepoCopilot.git
src refspec main does not match any这个错误通常出现在:
git push解决方式是先创建至少一次提交:
git add .
git commit -m "init"
git push -u origin main
如果你使用 HTTPS 地址,GitHub 往往不会再接受账号密码直接推送,而是需要:
如果你已经在本机配置过 GitHub Desktop、VS Code GitHub 登录或凭据管理器,很多时候可以直接推送成功。
比如:
README.mdREADME这时两边初始历史不同,第一次推送可能失败。
通常可以先拉取再处理:
git pull --rebase origin main
git push origin main
更简单的做法是:远程仓库初建时不要额外勾选初始化文件。
dubious ownership 或 safe.directory这是 Git 的安全检查机制,常见于:
解决方式:
git config --global --add safe.directory D:/Program/RepoCopilot
这表示你把该目录加入 Git 的安全目录列表。
如果你想快速回顾,可以只看下面这些命令:
mkdir RepoCopilot
cd RepoCopilot
git init -b main
git config user.name "Your Name"
git config user.email "[email protected]"
git add .
git commit -m "chore: bootstrap RepoCopilot project"
git remote add origin https://github.com/yourname/RepoCopilot.git
git push -u origin main
后续更新:
git add .
git commit -m "feat: add new API endpoint"
git push
把一个本地项目推到 GitHub,看起来命令不多,但背后其实涉及了几个非常核心的概念:
git add 管理的是暂存区git commit 生成的是版本快照git remote add 建立的是本地和远程的连接git push 完成的是远程同步如果把这条主线理解清楚,后面学习分支、协作、Pull Request、Rebase 就会容易很多。
一句话总结这篇文章的核心:
本地仓库负责记录开发历史,远程仓库负责同步、备份和协作,而
git init -> git add -> git commit -> git remote add -> git push就是把一个本地项目发布到 GitHub 的完整主线。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online