作为新手而言,如何学习别人优秀的开源代码,如何提交自己的代码到开源社区,如何做到代码的版本控制。而今天通过这篇文章,让我们一起来学习吧!

一、什么是 Git?为什么需要版本控制?

Git 是一个分布式版本控制系统。简单说,它像一个「后悔药 + 时间机器」的组合,核心功能如下:
记录每次修改:谁、什么时候、改了什么。• 随时回退:改坏了可以回到上一个正常版本• 多人协作:各改各的,最后合并在一起

版本控制 vs 普通文件管理

场景普通文件管理Git 版本控制
改坏了文件已保存,无法恢复git revert 一键回退
想看看上周改了啥凭记忆git log 清清楚楚
想同时尝试两个方案复制粘贴多个文件夹git branch 开分支
几台电脑同步代码U 盘拷来拷去git push/pull 同步

二、Git 与 Github 的关系

Git 是本地的版本管理工具,可自行安装。而Github是远程代码托管平台(像自己的 GitHub)。说白了一个是本地环境,仅自己看,一个是线上版本,可开源可私有。

总体流程: 你本地写完代码 → Git 管理版本 → 推送到 Gitea 备份和共享

三、Git 的安装与首次配置

3.1 下载安装

Windows: 官网 https://git-scm.com 下载安装包,一路 Next

验证安装:

git --version

3.2 配置用户名和邮箱(初始化)

git config --global user.name "逍遥子大表哥"
git config --global user.email "你的邮箱@example.com"

四、实战 推送你的第一个项目

接下来我们需要将 D:\ADRUINO 中的项目提交到Github。

步骤 1:进入项目目录

cd D:\ADRUINO

步骤 2:初始化仓库

git init

这会在当前目录生成一个 .git 隐藏文件夹,Git 用它来管理版本。

步骤 3:创建主分支

git checkout -b main
🔔 注意: 新版的 Git 默认分支名叫 main,不是以前的 master。

步骤 4:添加文件到暂存区

git add README.md          # 只添加 README.md
# 或
git add .                  # 添加当前目录所有文件(除了 .gitignore 忽略的)

步骤 5:提交到本地仓库

git commit -m "first commit"

双引号里写本次改动的描述,清晰明了即可。

步骤 6:关联远程仓库

先去 github 上新建一个空仓库,拿到仓库地址:

https://github.com/xiaoyoazi/Arduino.git

然后关联到本地:

git remote add origin https://github.com/xiaoyoazi/Arduino.git
origin 是远程仓库的默认名字,你可以改成任何名字,但大家都用 origin 所以最好保持一致。

步骤 7:推送到远程

git push -u origin main

-u 表示第一次推送时建立关联,以后可以直接 git push

五、踩坑记录 💥

远程仓库名不是 origin 怎么办?

情景: 推送项目提示错误:

git push origin master
# ❌ fatal: 'origin' does not appear to be a git repository

原因: 你的远程仓库名不是默认的 origin,执行下面命令查看当前仓库名。

git remote -v
# 逍遥子  https://github.com/xiaoyoazi/Arduino.git (fetch)
# 逍遥子  https://github.com/xiaoyoazi/Arduino.git (push)

解决方案: 改名或者用原名推送

# 方案一:用原名推送
git push 逍遥子 master
# 方案二:改成标准名字(推荐)
git remote rename 逍遥子 origin
git push origin master

教训:git remote add 时名字别乱取,用 origin 最省心。

分支错误

情景: 推送项目后,提示下面错:

git push origin master
# ❌ error: src refspec master does not match any

原因: 本地的分支叫 main,不是 master

git branch
# * main

解决方案: 推正确的分支:

git push origin main

或者把本地分支改名推:

git branch -M master    # 把 main 改成 master
git push origin master

教训: 推送前先用 git branch 看看本地到底叫什么分支名。

第一次提交忘记 commit 就 push

情景: 新建了仓库,想直接推送:

git push -u origin main
# ❌ error: failed to push some refs

原因: 还没有任何 commit。Git 推的是提交记录,空仓库没有提交就没有分支。

正确顺序:

git init
git checkout -b main    # 创建 main 分支
git add .               # 添加文件
git commit -m "first commit"  # 先提交
git remote add origin    # 再关联远程
git push -u origin main       # 最后推送

六、日常开发工作流

6.1 修改代码后提交

# 1. 看看改了什么
git status
# 2. 添加修改
git add .
# 3. 提交
git commit -m "修复:文章页面XSS过滤"
# 4. 推送到Gitea
git push

6.2 建议的提交信息格式

:
类型:
feat    - 新功能
fix     - 修复bug
docs    - 文档修改
refactor - 重构代码
style   - 格式调整(不影响功能)
举例:
fix: 修复登录页SQL注入漏洞
feat: 新增MQTT消息队列功能
docs: 更新README安装说明

七、版本回退(最核心的能力)

这是版本控制最大的价值——改坏了能回去

7.1 先看提交历史

git log --oneline
# abc1234 (HEAD -> main) 修复:文章页面XSS过滤
# def5678 新增:用户登录功能
# ghi9012 初始提交

abc1234 是 commit ID(哈希值),每个提交的唯一标识。

7.2 场景一:刚提交还没推送

# 撤销最近一次提交,但保留代码修改
git reset --soft HEAD~1
# 彻底回到上一版本(丢弃所有修改)
git reset --hard HEAD~1

7.3 场景二:已经推送到 Gitea

✅ 安全方案:git revert

# 撤销最近一次提交,生成一个新的反向提交
git revert HEAD
git push
# 撤销某次指定的提交(比如那个XSS修复)
git revert abc1234
git push

优点: 不修改历史记录,多人协作时不会搞乱别人。

❌ 暴力方案:git reset + force push

git reset --hard HEAD~1
git push origin main --force

⚠️ 慎用! 强制推送会改写远程历史,如果别人已经拉取了你的代码,他们的仓库会出问题。

7.4 revert vs reset 怎么选?

场景推荐方案
只有你自己在用这个仓库随便,看心情
多人协作开发必须用 git revert
刚提交 5 分钟还没推远程git reset --soft HEAD~1
已经推远程了git revert
就想彻底删除某个提交的所有痕迹git reset --hard + --force

八、几个实用小技巧

查看某个版本改了啥

git show abc1234

只看文件修改列表

git show --stat abc1234

撤销某个文件的修改(还没 add)

git checkout -- src/main.py

只想撤销某个文件的提交(已经 add)

git reset HEAD src/main.py

九、常用命令速查表

命令作用
git init初始化仓库
git status查看当前状态
git add .添加所有修改
git commit -m "描述"提交修改
git push推送到远程
git pull拉取远程更新
git log --oneline查看提交历史
git branch查看分支
git checkout -b <分支名>创建并切换分支
git revert HEAD安全回退最近一次提交
git reset --soft HEAD~1撤销提交,保留修改
git reset --hard HEAD~1彻底回到上一版本
git remote -v查看远程仓库地址
git remote add origin <地址>关联远程仓库

更多精彩文章 欢迎关注我们


本文首发于微信公众号,原文链接:一篇文章掌握Git从入门到实战

最后修改:2026 年 05 月 22 日
可怜可怜吧!正在沿街乞讨~