git
好的!我来给你详细讲解 Git,这是程序员必备的版本控制工具。
1. 什么是 Git?
Git 是一个分布式版本控制系统,就像游戏的"存档系统":
生活场景比喻:
写文档时的痛苦:
v1_报告初稿.doc
v2_报告修改版.doc
v3_报告最终版.doc
v4_报告真的最终版.doc
v5_报告老板要改版.doc
使用 Git 后:
只需要:报告.doc
Git 帮你保存所有历史版本!
2. Git 的核心概念
三个重要区域:
工作区 (Working Directory) - 你正在编辑的文件
暂存区 (Staging Area) - 准备提交的文件
版本库 (Repository) - 永久保存的版本
文件状态周期:
cpp
未跟踪 (Untracked) → 已跟踪 (Tracked)
↓
已修改 (Modified)
↓
已暂存 (Staged)
↓
已提交 (Committed)
3. Git 基础命令
3.1 初始化和配置
cpp
# 初始化新仓库
git init
# 配置用户信息(重要!)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
# 查看配置
git config --list
3.2 基本工作流程
cpp
# 1. 查看状态
git status
# 2. 添加文件到暂存区
git add 文件名 # 添加特定文件
git add . # 添加所有文件
git add *.c # 添加所有.c文件
# 3. 提交到版本库
git commit -m "提交说明"
# 4. 查看提交历史
git log
git log --oneline # 简洁显示
4. 完整的使用示例
让我们实际创建一个项目来演示:
步骤1:创建项目并初始化
cpp
# 创建项目目录
mkdir myproject
cd myproject
# 初始化 Git 仓库
git init
# 查看状态
git status
步骤2:创建文件并提交
cpp
# 创建C源文件
echo "#include <stdio.h>" > main.c
echo "int main() { printf(\"Hello Git!\\n\"); return 0; }" >> main.c
# 创建README文件
echo "# My C Project" > README.md
# 查看状态(会显示未跟踪的文件)
git status
# 添加文件到暂存区
git add .
# 提交到版本库
git commit -m "Initial commit: add main.c and README.md"
# 查看提交历史
git log
5. 分支管理
什么是分支?
主分支 (main/master):稳定版本
功能分支 (feature):开发新功能
修复分支 (hotfix):紧急修复bug
分支命令:
cpp
# 查看分支
git branch
# 创建新分支
git branch feature-awesome
# 切换分支
git checkout feature-awesome
# 或者(新版Git)
git switch feature-awesome
# 创建并切换分支
git checkout -b feature-new
git switch -c feature-new
# 合并分支
git checkout main
git merge feature-awesome
# 删除分支
git branch -d feature-awesome
git stash****基本用法
保存当前工作
cpp
# 保存所有未提交的修改
git stash
# 或者带描述信息
git stash push -m "正在开发用户登录功能"
查看保存的存档:
cpp
# 查看所有存档
git stash list
# 输出:
# stash@{0}: On main: 正在开发用户登录功能
# stash@{1}: WIP on main: abc123 初始化项目
恢复工作:
cpp
# 恢复最新的存档(不删除存档)
git stash apply
# 恢复最新的存档(并删除该存档)
git stash pop
# 恢复指定的存档
git stash apply stash@{1}
删除存档:
cpp
# 删除最新的存档
git stash drop
# 删除所有存档
git stash clear
6. 远程仓库(GitHub/GitLab)
连接远程仓库:
cpp
# 添加远程仓库
git remote add origin https://github.com/用户名/仓库名.git
# 查看远程仓库
git remote -v
# 推送到远程仓库
git push -u origin main
# 从远程仓库拉取更新
git pull origin main
# 克隆远程仓库
git clone https://github.com/用户名/仓库名.git
7. 实际开发工作流
典型的功能开发流程:
cpp
# 1. 从主分支开始
git checkout main
git pull origin main
# 2. 创建功能分支
git checkout -b feature-user-login
# 3. 开发功能(多次提交)
git add .
git commit -m "Add user authentication"
git add .
git commit -m "Implement login validation"
# 4. 推送到远程
git push origin feature-user-login
# 5. 创建Pull Request(在GitHub界面操作)
# 6. 合并后删除本地分支
git checkout main
git pull origin main
git branch -d feature-user-login
8. 常用命令速查
查看信息类:
cpp
git status # 查看状态
git log # 查看提交历史
git log --oneline --graph --all # 图形化查看历史
git diff # 查看文件差异
git show 提交id # 查看特定提交内容
撤销和恢复:
cpp
git restore 文件名 # 撤销工作区的修改
git restore --staged 文件名 # 从暂存区移除文件
git reset HEAD~1 # 撤销最后一次提交(保留修改)
git reset --hard HEAD~1 # 彻底撤销最后一次提交
git checkout -- 文件名 # 丢弃工作区的修改(旧版本命令)
标签管理:
cpp
git tag v1.0.0 # 创建标签
git tag # 查看所有标签
git push origin v1.0.0 # 推送标签到远程
9. .gitignore 文件
cpp
# 忽略编译产物
*.o
*.exe
*.out
*.so
*.a
# 忽略IDE文件
.vscode/
.idea/
*.swp
*.swo
# 忽略系统文件
.DS_Store
Thumbs.db
# 忽略日志文件
*.log
# 忽略临时文件
tmp/
temp/
10. 解决冲突
当多人修改同一文件时可能出现冲突:
cpp
# 冲突出现时,文件内容像这样:
<<<<<<< HEAD
你的代码
=======
别人的代码
>>>>>>> branch-name
# 解决步骤:
# 1. 编辑文件,选择要保留的代码
# 2. 删除冲突标记 (<<<<<<<, =======, >>>>>>>)
# 3. 添加解决后的文件
git add 文件名
# 4. 完成合并
git commit
11. 实际练习项目
让我们创建一个完整的练习:
cpp
# 1. 创建项目
mkdir git-practice
cd git-practice
git init
# 2. 创建.gitignore
echo "*.o" > .gitignore
echo "main" >> .gitignore
# 3. 创建源代码
cat > main.c << 'EOF'
#include <stdio.h>
int main() {
printf("Hello Git!\n");
printf("Learning version control\n");
return 0;
}
EOF
# 4. 初始提交
git add .
git commit -m "Initial project structure"
# 5. 创建功能分支
git checkout -b feature-calculation
# 6. 添加新功能
cat >> main.c << 'EOF'
int add(int a, int b) {
return a + b;
}
EOF
git add main.c
git commit -m "Add add function"
# 7. 切换回主分支并合并
git checkout main
git merge feature-calculation
# 8. 查看历史
git log --oneline --graph --all
12. Git 图形化工具
如果你不喜欢命令行,可以使用图形化工具:
- GitKraken - 功能强大,界面美观
- SourceTree - 免费,功能全面
- VS Code Git集成 - 编辑器内置,方便快捷
- GitHub Desktop - 简单易用
13. 学习建议
新手学习路径:
- 先掌握基础命令:add, commit, status, log, push, pull
- 然后学习分支管理:branch, checkout, merge
- 最后学习高级功能:rebase, stash, cherry-pick
重要原则:
- 频繁提交:小步快跑,不要积累大量修改一次提交
- 写清晰的提交信息:说明这次提交做了什么
- 使用分支:不要在main分支上直接开发
- 及时推送:定期推送到远程仓库备份
总结
Git 是程序员最重要的工具之一,它帮你:
- ✅ 版本管理:再也不怕改坏代码
- ✅ 协作开发:多人合作不会冲突
- ✅ 代码备份:远程仓库安全存储
- ✅ 实验功能:分支让你大胆尝试
记住核心工作流:
cpp
预先设置邮箱 用户名
创建文件夹------工作区
git init
git add main.c
git commit -m'版本信息描述'
git status
git log /git reflog
git diff
git reset ------card HEAD^ |符号
git checkout main.c
🎯 Git 使用完整流程
cpp
# ====================
# 1. 初始设置(一次性的)
# ====================
# 设置用户名和邮箱(重要!)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
# ====================
# 2. 项目初始化
# ====================
# 创建项目文件夹并进入
mkdir myproject
cd myproject
# 初始化Git仓库
git init
# ====================
# 3. 日常开发工作流
# ====================
# 创建或编辑文件(比如main.c)
# ... 编写代码 ...
# 查看当前状态(哪些文件有变动)
git status
# 添加文件到暂存区
git add main.c
# 或者添加所有文件:git add .
# 提交到版本库
git commit -m '版本信息描述'
# ====================
# 4. 查看和比较
# ====================
# 查看提交历史
git log
# 简洁版历史:git reflog
# 查看文件差异
git diff
# ====================
# 5. 撤销和恢复
# ====================
# 恢复文件到最新提交状态(丢弃修改)
git checkout main.c
# 回退到上一个版本(危险!会丢失代码)
git reset --hard HEAD^
🔍 详细命令解释
1. 初始设置 ( git config )
cpp
git config --global user.name "张三"
git config --global user.email "zhangsan@example.com"
作用:设置你的身份信息,每次提交都会记录这个信息。
2. 查看状态 ( git status )
git status
输出示例:
cpp
On branch main
Changes not staged for commit:
modified: main.c
作用:查看哪些文件被修改了,哪些已经准备好提交。
3. 提交历史 ( git log vs git reflog )
cpp
# 详细历史
git log
# 输出:
# commit abc123 (HEAD -> main)
# Author: 张三 <zhangsan@example.com>
# Date: Mon Dec 1 10:00:00 2023
# 版本信息描述
# 简洁历史
git reflog
# 输出:
# abc123 (HEAD -> main) HEAD@{0}: commit: 版本信息描述
区别:
- git log:显示完整的提交信息
- git reflog:显示所有操作记录(包括被删除的提交)
4. 版本回退 ( git reset --hard HEAD^ )
cpp
# 回退到上一个版本
git reset --hard HEAD^
# 回退到上上个版本
git reset --hard HEAD^^
# 回退到特定版本
git reset --hard abc123
符号说明:
- HEAD^ = 上一个版本
- HEAD^^ = 上上个版本
- HEAD~2 = 往前2个版本
⚠️ 重要注意事项
1. git reset --hard 很危险!
这个命令会永久删除未提交的修改!
git reset --hard HEAD^
安全做法:
cpp
# 先备份你的代码,或者使用更安全的方式
git stash # 临时保存修改
git reset --hard HEAD^
git stash pop # 恢复修改
流程中缺少的重要命令
我建议补充这些常用命令:
cpp
# 查看具体的修改内容(比git diff更详细)
git diff main.c
# 安全的撤销修改(新版本Git推荐)
git restore main.c # 代替 git checkout main.c
git restore --staged main.c # 从暂存区移除文件
# 添加所有修改的文件
git add .
# 推送到远程仓库(如果用了GitHub)
git push origin main
🛠️ 实际练习示例
cpp
# 1. 设置用户信息(只需要做一次)
git config --global user.name "小明"
git config --global user.email "xiaoming@school.com"
# 2. 创建项目
mkdir my_first_git
cd my_first_git
# 3. 初始化Git
git init
# 4. 创建main.c文件
echo "#include <stdio.h>" > main.c
echo "int main() { return 0; }" >> main.c
# 5. 查看状态
git status # 会显示main.c是未跟踪文件
# 6. 添加并提交
git add main.c
git commit -m '初始化项目,添加main.c文件'
# 7. 修改main.c
echo "// 新增功能" >> main.c
# 8. 查看差异
git diff # 会显示你添加的那行代码
# 9. 再次提交
git add main.c
git commit -m '在main.c中添加注释'
# 10. 查看历史
git log # 看到2次提交记录