linux学习笔记(45)git详解

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. 学习建议

新手学习路径:

  1. 先掌握基础命令:add, commit, status, log, push, pull
  2. 然后学习分支管理:branch, checkout, merge
  3. 最后学习高级功能: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次提交记录
相关推荐
Maple_land4 小时前
常见Linux环境变量深度解析
linux·运维·服务器·c++·centos
百锦再4 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
Larry_Yanan4 小时前
QML学习笔记(四十四)QML与C++交互:对QML对象设置objectName
开发语言·c++·笔记·qt·学习·ui·交互
摇滚侠5 小时前
Spring Boot 3零基础教程,WEB 开发 默认页签图标 Favicon 笔记29
java·spring boot·笔记
Jeled5 小时前
AI: 生成Android自我学习路线规划与实战
android·学习·面试·kotlin
小白银子5 小时前
零基础从头教学Linux(Day 53)
linux·运维·python
skywalk81636 小时前
基于频域的数字盲水印blind-watermark
linux·开发语言·python
Wang's Blog7 小时前
Linux小课堂: 定时与延时执行机制之date、at、sleep 与 crontab 的深度解析
linux·运维·服务器
酌量7 小时前
基于3D激光点云的障碍物检测与跟踪---(1)体素下采样、ROI 区域裁剪与地面点云分割
笔记·机器人·ransac·障碍物检测·激光点云·roi·体素下采样