GIT和Github基本知识
- Git:安装在电脑上的版本管理工具,负责记录文件变化、创建分支、合并代码、恢复历史。
- GitHub:托管 Git 仓库的网站,负责远程备份、多人协作、代码评审、Issue、自动化测试等。
即使不用 GitHub,Git 也能独立工作;GitHub 则主要围绕 Git 提供协作服务。
1. 建立 Git 的核心概念
工作区 → 暂存区 → 本地仓库 → GitHub远程仓库 git add git commit git push代码流经的4个区域:
工作区 Working Tree:
就是你正在编辑的项目文件。修改了
app.py,但还没执行任何 Git 命令,此时变化只存在于工作区。暂存区 Staging Area:
你准备放进下一次提交的文件。允许你精确选择这次提交包含哪些变化。
git add app.py # 把 `app.py` 当前的修改放入下一次提交。本地仓库 Local Repository:
git commit -m "添加用户登录功能"Git 会把暂存区中的内容保存为一个本地历史版本。此时提交只在你的电脑上,GitHub 还不知道。
远程仓库 Remote Repository:
git push把本地提交上传到 GitHub。
Git的重要对象:
仓库 Repository:一个被 Git 管理的项目目录,通常简称“repo”。
git init # 初始化新仓库:目录中会生成隐藏的
.git文件夹,里面保存版本历史、分支和配置信息。不要手动修改或删除
.git。提交 Commit:一次有明确意义的版本记录。
git commit -m "修复订单金额计算错误"每次提交都有唯一编号,例如:a7f42c1
可以把 commit 理解为“项目存档点”,但它不是简单复制整个文件夹,而是由 Git 高效管理文件状态和历史关系。
分支 Branch: 分支是一条独立的开发路线。
main ├── feature/login └── fix/payment-errormain:稳定主版本feature/login:开发登录功能fix/payment-error:修复支付错误git switch -c feature/login # 创建并切换分支git switch main # 切换已有分支合并 Merge:把一个分支的修改整合进另一个分支。
git switch main git merge feature/login先来到
main,再把feature/login合并进来。远程仓库 Remote:GitHub 上的仓库通常会被命名为
origin。git remote -v # 查看远程仓库git remote add origin https://github.com/用户名/仓库名.git #添加远程仓库这里的
origin只是一个默认别名,并不是特殊关键字。
2. 第一次使用 Git
1 安装完成后配置身份
git config --global user.name "你的名字" git config --global user.email "你的邮箱"git config --global --list # 查看配置建议使用与 GitHub 账号关联的邮箱,这样 GitHub 更容易把提交识别为你的贡献。
2 设置默认分支名
git config --global init.defaultBranch main3 初始化项目
cd 项目目录 git init4 创建.gitignore
.gitignore用来告诉 Git 哪些文件不要管理,例如:
# 环境变量和密钥 .env # Python __pycache__/ .venv/ # Node.js node_modules/ dist/ # 编辑器配置 .vscode/ .idea/ # 日志 *.log尤其不要提交:密码、API Key、数据库凭、.env`、私钥、大型依赖目录
已经提交过的文件,后来写进.gitignore并不会自动停止跟踪,需要执行:
git rm --cached 文件名5 创建第一次提交
git status # 确认没有意外文件 git add . git commit -m "初始化项目"git add . # 表示暂存当前目录下的所有变化3. 最常用的 Git 命令
查看状态
git status # 查看状态它会显示:当前分支、哪些文件被修改、哪些文件已暂存、哪些文件未被 Git 跟踪、本地分支是否领先或落后于远程分支。不确定该做什么时,先运行git status。
查看修改内容
git diff # 查看尚未暂存的变化 git diff --staged # 查看已经暂存的变化暂存文件
git add app.py # 暂存指定文件git add app.py README.md # 暂存多个文件git add . # 暂存所有变化git add -p # 交互式选择部分变化提交
git commit -m "添加商品搜索功能"好的提交信息通常说明“做了什么”:(如:添加邮箱验证码登录、修复空购物车结算错误、更新本地开发说明、重构订单查询逻辑)
尽量避免:修改、update、完成、再改一下
查看历史
git log --oneline # 简洁查看git log --oneline --graph --decorate --all # 查看分支关系图git show 提交编号 # 查看某次提交查看分支
git branchgit branch -a # 查看本地和远程分支git switch -c feature/login # 创建并切换新分支git branch -d feature/login # 删除已经合并的本地分支克隆仓库
从 GitHub 下载完整仓库:
git clone https://github.com/用户名/仓库名.git它会下载:项目文件、Git 历史、分支信息、远程仓库配置
4. push、pull 和 fetch 的区别
git push
git push # 把本地提交上传到 GitHubgit push -u origin feature/login # 第一次推送新分支-u会建立本地分支与远程分支的追踪关系。以后可以直接执行:git push
git fetch
git fetch origin #从 GitHub获取最新信息,但不修改当前工作分支这是相对安全的“看看远程有什么变化”。
git pull
git pull # 获取远程更新,并整合进当前分支它大致相当于:
git fetch git merge团队开发中,常见做法是:
git switch main git pull然后再从最新main创建功能分支。
5. GitHub 的主要功能
Repository
存放代码、Git 历史和项目文档。
Pull Request
用于提出代码合并请求和进行代码评审。
Issue
用于记录:
- Bug
- 功能需求
- 开发任务
- 技术讨论
- 待办事项
提交信息或 PR 中可以写:
Fixes #123PR 合并后,GitHub 可以自动关闭编号为123的 Issue。
Actions
GitHub 的自动化平台,常用于:
- 自动运行测试
- 检查代码格式
- 构建项目
- 发布软件
- 部署网站
这一类流程通常称为 CI/CD。
Releases
基于 Git 标签发布正式版本,可以附加:
- 更新说明
- 安装包
- 可执行文件
- 压缩包
Fork
把别人的 GitHub 仓库复制到自己的账号下。
常用于参与自己没有写入权限的开源项目:
原项目 → Fork 到自己的账号 → 修改 → PR 回原项目GitHub Pages
可以把仓库内容部署为静态网站,适合:
- 个人主页
- 项目文档
- 博客
- 前端演示页面
使用场景
个人开发场景
个人开发虽然没有队友,Git 仍然非常有价值:
- 保存版本历史
- 错误后恢复
- 同时开发多个功能
- 在多台电脑间同步
- 给项目做远程备份
- 自动部署个人网站
- 展示作品和贡献记录
创建本地项目并上传到 GitHub
先在 GitHub 创建一个空仓库,然后在本地执行:
cd my-project git init git add . git commit -m "初始化项目" git branch -M main git remote add origin https://github.com/用户名/my-project.git git push -u origin main之后的日常流程:
git status git add . git commit -m "添加用户设置页面" git push场景二:从 GitHub 下载已有项目
git clone https://github.com/用户名/my-project.git cd my-project修改后:
git status git add . git commit -m "更新项目说明" git push场景三:开发实验性功能
不要直接破坏稳定版本,可以创建分支:
git switch -c feature/new-editor完成开发并提交:
git add . git commit -m "添加新版编辑器"确认没问题后合并:
git switch main git merge feature/new-editor git push git branch -d feature/new-editor场景四:给项目打版本标签
例如发布v1.0.0:
git tag -a v1.0.0 -m "发布 1.0.0" git push origin v1.0.0查看标签:
git tag标签适合标记正式版本,而普通 commit 更像日常开发记录。
场景五:Fork别人的仓库并修改
1.克隆的是「你自己的 Fork 仓库」
在 GitHub 上点击 “Fork” 后,记得要克隆你自己账号下的那个仓库地址,而不是原作者的地址
# 错误示范:克隆了原作者的(你没有权限直接 push) # git clone https://github.com/原作者/项目名.git # 正确示范:克隆你自己的 Fork git clone https://github.com/你的用户名/项目名.git关联原仓库(Upstream)
原作者后续可能会继续更新代码。为了让你的本地代码能随时拉取原作者的最新改动,强烈建议在本地建立与原仓库的关联(习惯上称原仓库为upstream):
# 进入项目目录 cd 项目名 # 添加原仓库作为远程源,命名为 upstream git remote add upstream https://github.com/原作者/项目名.git提示:你可以运行git remote -v查看,现在应该能看到origin(你自己的)和upstream(原作者的)两个网址。
不要直接在main/master分支上修改
如果你打算把改动合并回原仓库,请务必创建一个新的分支(Feature Branch)进行修改。
原因:如果你直接在
main分支改,当你想提交第二个不同的功能时,你的main分支就变脏了,很难保持独立。正确做法:
# 创建并切换到一个新分支,比如叫 fix-bug git checkout -b fix-bug # 在这个分支上做修改、commit,然后推送到你自己的 GitHub git push origin fix-bug
定期保持与原仓库同步(Sync)
在修改代码前,或者准备提交修改前,先确保你的代码是最新的,否则容易产生代码冲突(Conflict)。
最简单的方法(通过 GitHub 网页):去你自己的 GitHub Fork 仓库页面,点击“Sync fork”按钮,然后点击“Update branch”。之后在本地运行
git pull即可。命令行方法:
git checkout main git fetch upstream git merge upstream/main
如果想把改动贡献给原作者(提交 Pull Request)
如果你觉得你修改的内容很好,想合并到原作者的官方项目中,这就需要提交Pull Request (PR):
- 代码规范:尽量遵循原项目的代码风格(缩进、命名规范等)。
- Commit 信息:简明扼要地写清楚你改了什么,为什么这么改。
- 单一职责:一个 PR 只解决一个问题。不要在一个 PR 里既修了 Bug,又重构了界面,还增加了新功能,这样原作者很难审核,大概率会被拒绝。
- 提交 PR:在你的 GitHub 仓库页面,点击“Contribute” -> “Open pull request”,检查一下改动无误后提交,等待原作者审核(Review)。
如果只是想自己魔改(不打算贡献回去)
如果你 Fork 只是为了把这个项目改造成适合自己用的工具,完全不打算提 PR:
- 遵守原项目的开源许可证(License)。有些许可证(如 GPL)要求你修改后的项目如果公开也必须开源。
- 你可以随意在
main分支修改,甚至可以把仓库重命名,完全当作自己的独立项目来维护。
团队开发场景
团队开发通常不鼓励所有人直接修改main。更常见的是:
同步 main ↓ 创建个人功能分支 ↓ 开发并提交 ↓ 推送到 GitHub ↓ 创建 Pull Request ↓ 代码评审和自动测试 ↓ 合并到 main典型团队流程:
1. 克隆团队仓库
git clone https://github.com/company/project.git cd project2. 同步主分支
git switch main git pull3. 创建任务分支
git switch -c feature/user-avatar推荐使用有意义的分支名:
feature/user-login fix/payment-timeout docs/api-guide refactor/order-service test/login-validation4. 开发并分批提交
git add src/avatar.js git commit -m "添加头像上传接口" git add tests/avatar.test.js git commit -m "添加头像上传测试"一次提交最好只处理一个相对完整的问题。这样更容易评审和回退。
5. 推送功能分支
git push -u origin feature/user-avatar6. 创建 Pull Request
在 GitHub 上把:
feature/user-avatar → main创建为 Pull Request,简称 PR。
PR 的作用包括:
- 描述这次修改
- 关联 Issue
- 让队友评审代码
- 讨论具体代码行
- 自动运行测试
- 获得批准后合并
Pull Request 不是 Git 原生命令,而是 GitHub 提供的协作功能。
7. 根据评审意见继续修改
不需要重新创建 PR。在同一个分支继续提交并推送:
git add . git commit -m "根据评审意见补充文件类型校验" git pushPR 会自动更新。
8. PR 合并后清理分支
git switch main git pull git branch -d feature/user-avatar远程功能分支通常可以在 GitHub 合并 PR 时删除。
合并冲突是什么
当两个人修改了同一个文件的同一个位置,Git 无法判断保留哪一份,就会产生冲突。
文件可能变成:
<<<<<<< HEAD 本地分支的内容 ======= 另一个分支的内容 >>>>>>> feature/login处理方法:
- 阅读双方代码。
- 手动改成最终需要的内容。
- 删除冲突标记。
- 暂存并提交。
git add 冲突文件 git commit合并冲突不是 Git 出故障,而是 Git 在要求开发者做业务判断。
团队中降低冲突的方法:
- 开发前同步最新
main - 功能分支不要存活太久
- PR 尽量小
- 不要多人同时大规模格式化同一个文件
- 及时交流公共模块的修改
个人开发和团队开发的区别
| 方面 | 个人开发 | 团队开发 |
|---|---|---|
| 分支策略 | 可以较简单 | 通常每个任务独立分支 |
main权限 | 可以直接推送 | 通常禁止直接推送 |
| 合并方式 | 本地 merge 或 PR | 通常通过 PR |
| 提交要求 | 自己看懂即可 | 要方便队友评审 |
| 测试 | 可以手动运行 | 常由 GitHub Actions 自动运行 |
| 冲突 | 较少 | 经常需要协调 |
| 历史修改 | 相对自由 | 已共享历史不宜重写 |
| Issue | 可选 | 常用于任务分配和跟踪 |
| Review | 可选 | 通常需要队友批准 |
撤销操作
需要谨慎!!!
撤销尚未暂存的修改
git restore app.py这会丢弃app.py尚未提交的修改,应谨慎使用。
取消暂存,但保留文件修改
git restore --staged app.py相当于把文件从暂存区拿回工作区,代码不会消失。
修改最近一次提交
例如忘记添加文件:
git add forgotten-file.py git commit --amend修改最近一次提交信息:
git commit --amend -m "新的提交信息"如果提交已经推送给团队,谨慎使用--amend,因为它会改变提交历史。
安全撤销已经共享的提交
git revert 提交编号revert会创建一个新的反向提交,不会删除历史,因此适合团队共享分支。
临时保存未完成的工作
git stash恢复:
git stash pop查看临时记录:
git stash liststash适合临时切换任务,不应长期代替正常提交。
关于git reset
git reset可以移动分支和修改暂存状态,其中:
git reset --hard可能直接丢失未提交内容。新手在不清楚后果时不要执行,也不要随意复制网上的“修复命令”。