跳到主要内容

Git版本控制入门

掌握Git,让代码管理更专业

Git概述

什么是Git

Git 是目前世界上最流行的分布式版本控制系统

版本控制 = 记录文件变化历史,可以随时回到过去的状态

没有版本控制:
├── 报告_v1.doc
├── 报告_v2.doc
├── 报告_最终版.doc
├── 报告_最终版2.doc
└── 报告_打死不改了.doc

有了Git:
└── 报告.doc
├── commit 1: 初稿
├── commit 2: 加图表
├── commit 3: 改结论
└── commit 4: 最终版

为什么要用Git

  1. 代码安全:不怕误删或改错
  2. 历史追溯:查看任意时刻的代码
  3. 团队协作:多人同时开发
  4. 分支管理:并行开发不冲突
  5. 开源社区:GitHub/GitLab必备

Git vs GitHub

Git:版本控制工具,安装在本地
GitHub:代码托管平台,在云端

类比:
Git ≈ 相机(拍照工具)
GitHub ≈ 相册网站(存储和分享照片)

Git核心概念

工作区域

┌─────────────┐    ┌─────────────┐    ┌─────────────┐
│ 工作区 │ │ 暂存区 │ │ 仓库 │
│ Working │ -> │ Staging │ -> │ Repository │
│ Directory │ │ Area │ │ │
└─────────────┘ └─────────────┘ └─────────────┘
│ │ │
写代码 git add git commit

工作区(Working Directory):你电脑上的项目目录

暂存区(Staging Area):准备提交的修改

仓库(Repository):保存所有版本历史

文件状态

文件状态流转:
┌──────────────────┐
│ Untracked │ 未跟踪
│ (新建文件) │
└────────┬─────────┘
│ git add

┌─────────────┐ ┌──────────────────┐
│ Modified │ <- │ Staged │ 已暂存
│ (已修改) │ │ (已暂存) │
└──────┬──────┘ └────────┬─────────┘
│ │ git commit
│ git add ↓
└──────────> ┌──────────────────┐
│ Committed │ 已提交
│ (已提交) │
└──────────────────┘

Git安装与配置

安装(见前面章节)

# 检查安装
git --version
# 输出:git version 2.x.x

初始配置

# 设置用户名和邮箱(必须)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"

# 设置默认分支名为main
git config --global init.defaultBranch main

# 设置默认编辑器
git config --global core.editor "code --wait"

# 查看配置
git config --list

# 查看特定配置
git config user.name

基本操作

创建仓库

# 方式一:初始化新仓库
mkdir myproject
cd myproject
git init
# 输出:Initialized empty Git repository in .../myproject/.git/

# 方式二:克隆现有仓库
git clone https://github.com/username/repo.git

第一次提交

# 1. 创建文件
echo "# My Project" > README.md

# 2. 查看状态
git status
# 显示 README.md 为 Untracked(未跟踪)

# 3. 添加到暂存区
git add README.md
# 或 git add . 添加所有文件

# 4. 查看状态
git status
# 显示 README.md 为 Changes to be committed

# 5. 提交
git commit -m "初始化项目,添加README"

# 6. 查看日志
git log

日常工作流

# 1. 修改代码
# ...编辑文件...

# 2. 查看修改了什么
git status # 查看哪些文件改了
git diff # 查看具体改了什么

# 3. 暂存修改
git add . # 暂存所有修改
git add 文件名 # 暂存指定文件

# 4. 提交
git commit -m "描述这次改了什么"

# 5. 查看历史
git log --oneline # 简洁版日志

常用命令详解

git add

git add 文件名          # 添加指定文件
git add . # 添加所有修改
git add *.py # 添加所有py文件
git add -A # 添加所有变化(包括删除)
git add -p # 交互式添加

git commit

git commit -m "提交说明"              # 提交
git commit -am "提交说明" # 添加并提交(仅限已跟踪文件)
git commit --amend -m "新说明" # 修改上次提交(未推送时)

git status

git status              # 完整状态
git status -s # 简短状态
# M file.txt # 已修改
# A new.txt # 新添加
# D deleted.txt # 已删除
# ?? untracked.txt # 未跟踪

git log

git log                            # 完整日志
git log --oneline # 简洁日志
git log --oneline -10 # 最近10条
git log --graph # 图形化显示
git log --author="名字" # 按作者筛选
git log -- 文件名 # 某文件的历史

git diff

git diff                  # 工作区 vs 暂存区
git diff --staged # 暂存区 vs 最新提交
git diff HEAD # 工作区 vs 最新提交
git diff commit1 commit2 # 两个提交之间

撤销与回退

撤销工作区修改

# 丢弃工作区的修改(危险!)
git checkout -- 文件名
git restore 文件名 # 新版本写法

撤销暂存

# 从暂存区撤回(保留修改)
git reset HEAD 文件名
git restore --staged 文件名 # 新版本写法

撤销提交

# 撤销最近一次提交,保留修改
git reset --soft HEAD~1

# 撤销最近一次提交,丢弃修改
git reset --hard HEAD~1

# 创建新提交来撤销(推荐,更安全)
git revert HEAD

恢复删除的文件

# 恢复刚删除的文件
git checkout -- 文件名

# 从某个提交恢复文件
git checkout commit哈希 -- 文件名

分支管理

什么是分支

分支 = 独立的开发线

主分支 main

├── commit 1
├── commit 2
│ └──────── 创建分支 feature
├── commit 3 │
│ ├── commit A
│ └── commit B
└── commit 4 │
└─────────┴── 合并分支

分支操作

# 查看分支
git branch # 本地分支
git branch -a # 所有分支(含远程)

# 创建分支
git branch 分支名

# 切换分支
git checkout 分支名
git switch 分支名 # 新版本写法

# 创建并切换
git checkout -b 分支名
git switch -c 分支名 # 新版本写法

# 删除分支
git branch -d 分支名 # 安全删除(已合并)
git branch -D 分支名 # 强制删除

# 重命名分支
git branch -m 旧名 新名

合并分支

# 切换到目标分支
git checkout main

# 合并其他分支到当前分支
git merge 分支名

解决冲突

# 当合并出现冲突时
# 1. Git会在文件中标记冲突:
<<<<<<< HEAD
当前分支的内容
=======
要合并的分支内容
>>>>>>> feature

# 2. 手动编辑解决冲突
# 3. 删除冲突标记,保留需要的内容
# 4. 保存文件

# 5. 添加并提交
git add .
git commit -m "解决合并冲突"

远程仓库

连接远程仓库

# 添加远程仓库
git remote add origin https://github.com/用户名/仓库名.git

# 查看远程仓库
git remote -v

# 修改远程地址
git remote set-url origin 新地址

推送代码

# 首次推送(设置上游分支)
git push -u origin main

# 之后推送
git push

# 推送指定分支
git push origin 分支名

拉取代码

# 拉取并合并
git pull

# 只拉取不合并
git fetch

克隆仓库

git clone https://github.com/用户名/仓库名.git

# 克隆到指定目录
git clone 地址 目录名

# 克隆指定分支
git clone -b 分支名 地址

.gitignore文件

作用

.gitignore 告诉Git哪些文件不需要版本控制。

常用模板

# Python
__pycache__/
*.py[cod]
venv/
.env

# Node.js
node_modules/
npm-debug.log

# IDE
.vscode/
.idea/
*.swp

# 操作系统
.DS_Store
Thumbs.db

# 日志和临时文件
*.log
*.tmp
*.temp

# 敏感信息
*.pem
*.key
secrets.json

创建.gitignore

# 手动创建
touch .gitignore
code .gitignore

# 或使用在线模板
# https://www.gitignore.io/

工作流程示例

个人项目流程

# 1. 初始化项目
mkdir myproject && cd myproject
git init

# 2. 创建.gitignore
echo "*.pyc\n__pycache__/\nvenv/" > .gitignore

# 3. 开发和提交
# 写代码...
git add .
git commit -m "添加用户登录功能"

# 继续开发...
git add .
git commit -m "添加用户注册功能"

# 4. 推送到GitHub
git remote add origin https://github.com/你的用户名/myproject.git
git push -u origin main

团队协作流程

# 1. 克隆项目
git clone https://github.com/team/project.git
cd project

# 2. 创建功能分支
git checkout -b feature/login

# 3. 开发并提交
# 写代码...
git add .
git commit -m "实现登录功能"

# 4. 推送分支
git push -u origin feature/login

# 5. 创建Pull Request(在GitHub上操作)

# 6. 合并后,更新本地main
git checkout main
git pull

常见问题

提交信息写错了

# 修改最近一次提交信息
git commit --amend -m "新的提交信息"

不小心提交了敏感信息

# 从历史中删除文件(谨慎!)
git filter-branch --force --index-filter \
"git rm --cached --ignore-unmatch 敏感文件" \
--prune-empty --tag-name-filter cat -- --all

# 然后强制推送
git push origin --force --all

想查看某个文件的历史

git log --oneline -- 文件名
git show commit哈希:文件名

合并冲突太复杂

# 放弃合并
git merge --abort

# 然后重新规划合并策略

Git命令速查

基础命令

命令用途
git init初始化仓库
git clone克隆仓库
git add添加到暂存区
git commit提交
git status查看状态
git log查看历史
git diff查看差异

分支命令

命令用途
git branch查看/创建分支
git checkout切换分支
git merge合并分支
git branch -d删除分支

远程命令

命令用途
git remote管理远程仓库
git push推送代码
git pull拉取代码
git fetch获取远程更新

撤销命令

命令用途
git restore恢复文件
git reset重置提交
git revert撤销提交(新提交)

本章小结

  1. 核心概念:工作区、暂存区、仓库
  2. 基本流程:add → commit → push
  3. 分支管理:branch、checkout、merge
  4. 远程操作:clone、push、pull
  5. 善用.gitignore:忽略不必要的文件

下一步

环境搭建篇完成!接下来开始编程语言入门。

→ 继续阅读:13-Python快速入门