Git 与 GitHub 从零到实战 —— 新手完全操作手册
本文面向完全零基础的新手,从概念到命令,从本地到远程,手把手教你使用 Git 和 GitHub。
所有命令均附有详细解释,放心跟着敲。
第一部分:Git 是什么?为什么要学?
Git是一个分布式版本控制系统,简单说就是能帮你记录文件的每一次修改,像游戏存档一样,你可以随时回到任意一个历史版本。
它还能让多人同时协作开发,各自修改,最后合并,互不干扰。
GitHub是一个基于 Git 的代码托管平台,相当于把 Git 仓库放在云上,方便备份和团队共享。
哪怕你只是为了下载开源项目,学会
git clone也会比手动下载更“专业”且方便更新。
第二部分:安装与初始配置
2.1 下载安装 Git
官网下载:Git - Install
Windows 用户下载
.exe,一路默认安装即可。安装完成后,在任意文件夹空白处右键,如果出现
Git Bash Here和Git GUI Here,说明安装成功。
Git Bash是 Git 提供的命令行终端,我们所有操作都在它里面执行。
习惯用 Windows CMD 或 PowerShell 也可以,但本文统一用 Git Bash。
2.2 配置用户信息(全球唯一标识)
Git 每次提交都会记录“是谁”提交的,所以需要设置用户名和邮箱(只需做一次):
git config --global user.name "你的名字" git config --global user.email "你的邮箱@example.com"
--global表示全局配置,对所有仓库生效。你也可以去掉--global为单个仓库单独配置。
这个信息会出现在你的提交日志中,建议和 GitHub 账号一致,方便关联。
查看是否配置成功:
(输入以下命令会出现你的名字和邮箱)
git config user.name git config user.email2.3 配置默认编辑器(可选)
默认使用 Vim,新手不习惯可以改成记事本或 VSCode:
git config --global core.editor "code --wait" # 设为 VSCode第三部分:核心概念 —— 四个区(仓库)
理解这四个区,就理解了 Git 的整个工作流:
| 区域 | 说明 |
|---|---|
| 工作区 (Workspace) | 你电脑上能看到的项目文件夹,是你正在编辑的地方。 |
| 暂存区 (Staging Area) | 一个临时存放“即将提交”的修改的地方。你可以把部分修改放入暂存区,分批提交。 |
| 本地仓库 (Local Repository) | 在你电脑上的.git隐藏文件夹,保存所有历史提交记录。 |
| 远程仓库 (Remote Repository) | 托管在 GitHub/GitLab 等服务器上的仓库,用于备份和协作。 |
工作流程:
工作区修改 →git add→ 暂存区 →git commit→ 本地仓库 →git push→ 远程仓库。
反过来:远程仓库 →git pull→ 本地仓库 →git checkout→ 工作区。
第四部分:本地基本操作(从零开始)
4.1 初始化一个仓库(git init)
可以先切换到你想要初始化仓库的地方,如
cd /d/git创建一个空文件夹(例如my_project),进入后右键Git Bash Here,输入:
git init你会看到提示Initialized empty Git repository,并且文件夹里多了一个.git隐藏文件夹(需要开启“显示隐藏项目”才能看到)。
这个.git就是你的本地仓库,千万不要乱删!
4.2 查看状态(git status)
任何时候想了解当前工作区和暂存区的状态,输入:
git status它会告诉你哪些文件被修改了、哪些在暂存区、哪些还未跟踪。建议频繁使用。
4.3 添加文件到暂存区(git add)
新建一个文件hello.txt,然后:
git add hello.txt # 添加单个文件 git add . # 添加当前目录下所有新/修改的文件(常用) git add *.c # 添加所有 .c 文件此时再用git status,文件会变成绿色,表示已进入暂存区。
为什么要有暂存区?
因为你可以只选择部分修改提交,而不是一次性提交所有改动。比如你改了三个功能,但只想先提交其中一个,就可以只add那个文件。
🎯 一个小建议
每当你准备进行重要操作(比如切换分支、拉取代码、回退版本)之前,都可以先敲一遍git status,确保看到 “working tree clean” 再动手,这样能有效防止误操作丢失代码。这是一个非常好的习惯!
4.4 提交到本地仓库(git commit)
暂存区的内容确认无误后,提交到本地仓库(生成一个永久快照):
git commit -m "添加了hello.txt,内容为Hello World"-m后面跟的是提交说明,务必写清楚本次改了什么,方便以后查看。
提交后,git status会显示“nothing to commit, working tree clean”。
如果不写
-m,Git 会弹出编辑器让你写说明(用前面配置的编辑器)。
4.5 查看提交历史(git log)
git log # 完整日志(按 q 退出) git log --pretty=oneline # 一行显示,只显示哈希和说明 git log --oneline # 更简短的哈希 git log --graph # 图形化显示分支走向每次提交都有一个唯一的 40 位哈希值(如7c20a4b...),用来标识版本。
4.6 查看文件差异(git diff)
想对比工作区和暂存区/本地仓库的区别:
git diff # 工作区 vs 暂存区 git diff --staged # 暂存区 vs 最新提交(即即将提交的内容) git diff HEAD # 工作区 vs 最新提交 git diff 分支1 分支2 # 比较两个分支4.7 版本回退(git reset)
如果提交错了想回到上一个版本:
git reset --hard HEAD^ # 回退到上一次提交(HEAD^ 表示上一个,HEAD^^ 表示上上个) git reset --hard <版本号> # 回退到指定哈希值的版本--hard会丢弃工作区和暂存区的所有改动,慎用!如果想保留改动,用--soft或--mixed。
回退后,
git log可能看不到被回退掉的提交了,但可以用git reflog查看所有操作记录,找回任意版本号。
第五部分:分支管理
分支让你可以并行开发多个功能,互不影响。默认分支叫master或main。
🌿 分支到底有什么用?我为什么要用它?
你可以把分支想象成平行宇宙或者草稿纸:
主分支(master/main)是你项目的“正式发布版”,要求永远稳定、可运行。
其他分支是你的“实验区”或“草稿纸”。当你想要增加新功能、修 Bug,或者尝试一个冒险的想法时,直接在
master上改是很危险的——万一改坏了,整个项目就崩溃了。
有了分支,你就可以这样做:
从
master拉一条新分支(比如叫dev或feature-login)。在新分支上随便改代码、折腾实验,完全不影响
master。改好了、测试通过了,再把这个分支合并(merge)回
master。如果改坏了,直接删除这个分支,重开一个就行,
master依然是干净的。
🎯 举个生活中的例子
你写了一篇毕业论文(这是
master分支)。
导师让你加一个实验数据,但你不知道加上去会不会把论文搞砸。
于是你复制了一份草稿(创建新分支),在草稿上拼命改。
如果改得很好,你就把草稿的内容抄回原稿(合并);
如果改砸了,直接把草稿扔了,原稿完好无损。
5.1 查看分支
git branch # 列出本地分支,当前分支前有 * 号 git branch -v # 更详细,包含最新提交信息5.2 创建分支
git branch dev # 创建名为 dev 的分支(基于当前所在分支)5.3 切换分支
git checkout dev # 切换到 dev 分支 git switch dev # 新命令,功能相同(更推荐)5.4 创建并切换
git checkout -b feature # 创建 feature 分支并立即切换过去 git switch -c feature # 新命令5.5 合并分支
假设你现在在master分支,想把dev的改动合并进来:
git merge devGit 会自动将dev的修改应用到master。如果两个分支修改了同一文件的同一行,就会产生冲突,需要手动解决。
5.6 删除分支
git branch -d dev # 删除已合并的分支 git branch -D dev # 强制删除(即使未合并)第六部分:远程仓库(GitHub)操作
6.1 注册 GitHub 账号
访问 https://github.com,注册账号(需要验证邮箱)。
6.2 创建远程仓库
登录后,点击右上角+→New repository。
填写仓库名(如my_project),描述可选,选择公开/私有,然后点击Create repository。
创建后会给出一些指引,我们按“已有本地仓库”的方式操作。
6.3 关联本地仓库与远程仓库(git remote add)
复制你新建仓库的HTTPS或SSH地址(例如https://github.com/你的用户名/my_project.git)。
在本地仓库目录下执行:
git remote add origin https://github.com/你的用户名/my_project.git如果提示fatal: remote origin already exists(远程别名已存在),说明你之前关联过别的地址。没关系,执行下面这行覆盖掉它:
git remote set-url origin https://github.com/你的用户名/my_project.gitorigin是远程仓库的别名(可以自定义,但惯例叫 origin)。这个命令把本地仓库和远程仓库关联起来。
查看关联情况:
git remote -v # 显示远程仓库别名和地址6.4 推送到远程(git push)
将本地master分支推送到远程仓库(第一次推送需要加-u建立追踪关系):
git push -u origin master-u表示设置上游(upstream),以后再次推送只需git push即可。如果远程是空仓库,首次推送会自动创建
master分支。
如果远程仓库已有内容(比如你创建时勾选了 README),推送可能被拒绝,需要先
git pull合并。
6.5 克隆远程仓库(git clone)
如果想从 GitHub 下载一个项目到本地,不需要先init,直接:
git clone https://github.com/用户名/仓库名.git这会在当前目录下创建一个以仓库名命名的文件夹,里面自动包含了.git和所有文件。
如果你想把项目放在指定文件夹:
git clone https://github.com/.../xxx.git 我的项目6.6 拉取更新(git pull)
当远程仓库有新提交(别人推送了),你需要更新本地:
git pull origin master # 从远程 master 拉取并合并到当前分支git pull等价于git fetch+git merge。
6.7 抓取更新(git fetch)
如果你只想看看远程有哪些更新,但暂时不合并:
git fetch origin # 抓取所有分支的更新到 .git 中 git log origin/master # 查看远程分支的提交 git diff master origin/master # 比较本地和远程的差异之后用git merge origin/master手动合并。
第七部分:解决冲突(Conflict)
冲突产生条件:两个人修改了同一个文件的同一行,或者一个人修改了文件并提交,另一个人也修改了同一文件,后拉取的人合并时 Git 无法自动决定保留哪个版本。
典型场景:
你在本地修改了a.txt并提交,然后git pull拉取远程更新,发现远程也有对a.txt的修改且和你的位置重叠,Git 会提示冲突。
解决步骤:
执行
git pull或git merge,看到类似输出:Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result.
打开冲突文件
a.txt,会看到类似内容:<<<<<<< HEAD 这是你本地的修改 ======= 这是远程的修改 >>>>>>> branch-nameHEAD到=======之间是你的修改;=======到>>>>>>>之间是远程的修改。
手动编辑,删除标记符号,保留你希望的内容(可以全部保留、取其一或重新编写)。
保存文件后,执行:
git add a.txt git commit -m "解决了冲突"冲突解决完毕,可以继续
git push。
建议:在团队协作时,尽量频繁
git pull避免长时间不同步,减少冲突概率。
第八部分:标签(Tag)与暂存(Stash)
8.1 标签(标记版本发布)
给某个提交打一个易记的标签,比如v1.0:
git tag v1.0 # 轻量标签 git tag -a v1.0 -m "版本1.0发布" # 附注标签(推荐)推送到远程:
git push origin --tags查看所有标签:git tag
8.2 暂存工作(git stash)
当你正在写代码,突然需要切换到其他分支修 Bug,但不想提交半成品:
git stash # 保存当前工作区和暂存区的改动,恢复到干净状态 git checkout bugfix # 切换分支修 Bug # 修完后切回来 git checkout 原分支 git stash pop # 恢复之前暂存的改动(并删除 stash 记录)查看 stash 列表:git stash list
恢复特定 stash:git stash apply stash@{0}
删除特定 stash:git stash drop stash@{0}
🏷️ 1. 标签(Tag)——“游戏里的存档点”
场景类比:
你玩《超级马里奥》,每通过一个大关卡,你都会按一下“保存”键,并备注为“第一关通关存档”、“拿到无限蘑菇存档”。以后你想重温这一关,直接读取这个存档名就行了,不用在一堆日期里乱翻。
在 Git 里有什么用?
你的代码每提交一次,Git 都会给你一串长长的版本号(比如8e86b65...),这串数字根本记不住。当你开发完一个重大功能,或者发布了第 1.0 版软件时,你打个标签叫v1.0。
好处:以后老板问你“去年发布的那个版本代码在哪?”,你不需要去翻几百条日志,直接执行
git tag看到v1.0,轻轻一点就能穿越回那个版本。这在开源项目里极其常见(比如你下载的 Spring Boot 源码,到处都是v2.0.0、v3.0.0)。
怎么用?
项目做完发布时:git tag -a v1.0 -m "第一个正式版本发布了"
同步到 GitHub:git push origin --tags(这样别人在网页上就能看到你的版本标签了)
🧹 2. 暂存(Stash)——“厨房里的‘先停手’按钮”
场景类比:
你正在厨房做红烧肉(切好肉了,刚下锅炒了一半,调料还没放),这时候快递小哥打电话说你有一个到付快递必须立刻下楼取。
你会怎么做?你肯定先把燃气灶关掉(避免糊锅),把手擦干净(保持整洁),然后冲下楼取快递。等你回来,再把燃气灶打开,继续倒酱油炖肉。
在 Git 里有什么用?
你正在feature分支写一个新功能,代码写到一半,还没写完、还不能提交(提交了会影响别人)。这时候测试组突然跑来告诉你:“线上有个严重 Bug,赶快去master分支修!”
不用 Stash 的后果:你硬切分支,Git 报错“你的修改会丢失,不让切”,导致你手忙脚乱。
用 Stash 的操作:你执行
git stash。Git 立马把你“半成品的红烧肉”从锅里铲出来放到冰箱里,你的代码区变得跟master分支一样干净。切换修 Bug:
git checkout master-> 修 Bug ->git commit -m "修好啦"。切回来继续炒菜:
git checkout feature->git stash pop。你之前没写完的代码完美地回到了屏幕上,你接着继续写,就像什么都没发生过。
怎么用?
紧急切分支前:git stash(存好半成品)
修完回来继续写:git stash pop(把半成品拿回来继续改)
💡 总结一句话
Tag(标签):为了记住“好日子”(给重要的版本起个响亮的名字)。
Stash(暂存):为了应对“突发情况”(临时存起手头乱糟糟的代码,回来接着干)。
这两个命令是新手进阶为“老手”的标配,等你以后遇到突发 Bug 要切分支时,你会回来感谢git stash的!😄
第九部分:配置 SSH 免密登录(推荐)
使用 HTTPS 推送每次都要输入用户名和密码,很麻烦。用 SSH 可以免密。
9.1 生成 SSH 密钥
在 Git Bash 中输入:
ssh-keygen -t rsa -b 4096 -C "你的邮箱@example.com"一路回车(不设置密码),会在~/.ssh/目录下生成id_rsa(私钥)和id_rsa.pub(公钥)。
9.2 添加公钥到 GitHub
复制公钥内容:
cat ~/.ssh/id_rsa.pub然后复制全部。登录 GitHub → 右上角头像 → Settings → SSH and GPG keys → New SSH Key。
粘贴公钥,取名(任意),保存。
9.3 修改远程地址为 SSH
如果你之前用的 HTTPS,可以修改:
git remote set-url origin git@github.com:用户名/仓库名.git之后git push/pull就不需要密码了。
第十部分:新手常见场景全流程
场景1:首次上传本地项目到 GitHub
cd 项目文件夹 git init git add . git commit -m "首次提交" # 在 GitHub 新建仓库,复制仓库地址 git remote add origin https://github.com/你的用户名/仓库名.git git push -u origin master场景2:下载并参与开源项目(fork + clone)
在 GitHub 上找到感兴趣的项目,点
Fork到自己的账号下。克隆你 fork 的仓库到本地:
git clone https://github.com/你的用户名/项目名.git进入文件夹,新建分支开发:
git checkout -b my-feature修改代码,提交,推送:
git push origin my-feature在 GitHub 上发起 Pull Request(PR)。
场景3:同步远程最新代码
每天开始工作前:
git pull origin master # 或者 git fetch + git merge场景4:撤销错误的提交(尚未 push)
如果刚刚commit了但发现错误,想撤销提交并保留修改:
git reset --soft HEAD^ # 撤回到提交前,修改保留在暂存区如果想完全丢弃修改:
git reset --hard HEAD^场景5:撤销已经 push 的提交
如果已经 push 到远程,想回退:
git reset --hard <正确的版本号> git push --force origin master # 强制覆盖远程(谨慎!团队协作慎用)如果团队其他人已经拉取了你的错误提交,强制推送会给他们带来麻烦,所以最好用
git revert生成一个反向提交。
场景6:使用 .gitignore 忽略不需要的文件
在项目根目录创建.gitignore文件,写入要忽略的模式,例如:
*.log temp/ .idea/这样 Git 就不会追踪这些文件。
第十一部分:常用命令速查表
| 命令 | 说明 |
|---|---|
git init | 初始化本地仓库 |
git status | 查看状态 |
git add <file> | 添加文件到暂存区 |
git add . | 添加所有修改到暂存区 |
git commit -m "message" | 提交到本地仓库 |
git log | 查看提交历史 |
git reflog | 查看所有操作记录(包括回退后的) |
git diff | 查看工作区和暂存区的差异 |
git diff HEAD | 查看工作区和最新提交的差异 |
git reset --hard <版本号> | 回退到指定版本 |
git branch | 查看分支 |
git branch <name> | 创建分支 |
git checkout <name> | 切换分支 |
git checkout -b <name> | 创建并切换 |
git merge <name> | 合并分支到当前分支 |
git branch -d <name> | 删除分支 |
git remote add origin <url> | 关联远程仓库 |
git remote -v | 查看远程仓库地址 |
git push -u origin master | 首次推送并建立跟踪 |
git pull | 拉取并合并远程更新 |
git fetch | 抓取远程更新但不合并 |
git clone <url> | 克隆远程仓库 |
git stash | 暂存当前修改 |
git stash pop | 恢复暂存并删除记录 |
git tag <name> | 创建标签 |
git push --tags | 推送标签到远程 |
第十二部分:常见报错及解决
| 报错信息 | 可能原因 | 解决方法 |
|---|---|---|
fatal: not a git repository | 当前目录不是 Git 仓库 | 执行git init或进入正确目录 |
Permission denied (publickey) | SSH 密钥未添加或地址错误 | 检查 SSH key 是否添加到 GitHub,或改用 HTTPS |
failed to push some refs | 远程有更新,本地落后 | 先git pull再 push |
CONFLICT (content) | 合并冲突 | 手动解决冲突,然后 add+commit |
Your branch is ahead of origin/master | 本地有未推送的提交 | 执行git push |
写在最后
以上内容涵盖了 Git 和 GitHub 日常使用中 90% 以上的场景。实践是学习 Git 最好的方式,建议你跟着命令一步步操作,遇到问题大胆搜索,因为 Git 的报错信息通常都很明确。
记住几点心法:
多
git status,随时掌握当前状态。提交前
git diff确认改了什么。提交信息要清晰,方便日后回溯。
经常
git pull保持和远程同步。