| 备注 | 修改日期 | 修改人 |
| 格式调整 | 2025-11-17 20:51:22[当前版本] | 文艺范儿 |
| 内容更新 | 2025-11-17 20:47:15 | 文艺范儿 |
| 创建版本 | 2025-11-17 20:38:45 | 文艺范儿 |
版本控制系统是一种软件工具,它帮助开发团队记录和管理文件(通常是源代码)的变更历史。你可以把它理解成一个“超级撤销”或“文件时光机”。
核心要解决的问题是:
备份与恢复: 可以回溯到任何一个历史版本,再也不用担心改错代码后无法挽回。
协同合作: 允许多人在同一个项目上工作而不会互相覆盖对方的修改。
历史追踪: 记录每一次修改是谁、在什么时间、为什么做出的(通过提交信息),便于追查问题。
分支管理: 可以创建独立的开发线(分支),在不影响主线(主分支)的情况下开发新功能或修复bug,完成后可以合并回主线。
在 DevOps 和现代软件开发中,版本控制系统是一切自动化流程的基石。没有它,以下实践都无法实现:
持续集成: CI 工具(如 Jenkins、GitLab CI)需要从版本库中拉取最新的代码进行构建和测试。
协作开发: 它是团队协作的唯一可信数据源。
代码审查: 通过发起合并请求或拉取请求,便于团队成员对代码变更进行评审。
基础设施即代码: 不仅是应用代码,服务器配置、部署脚本等也纳入版本控制,实现环境的一致性。
版本控制系统主要经历了三个发展阶段:
代表工具:RCS(Revision Control System)
工作原理: 在本地计算机上维护文件的版本历史。通过记录每个版本的补丁来节省空间。
缺点: 无法实现团队协作,所有版本信息仅存在于单台机器上,风险高。
代表工具:SVN(Subversion)、CVS(Concurrent Versions System)
工作原理: 存在一个中央服务器,保存所有文件的版本历史。开发者从服务器签出代码,修改后提交回服务器。
工作流程:
优点: 管理简单,权限控制集中。
缺点:
单点故障: 中央服务器宕机,则所有人都无法提交代码或协同工作。
单点风险: 如果服务器磁盘损坏且没有备份,整个项目的历史记录将丢失(当然,这是管理失误)。
代表工具:Git、Mercurial
工作原理: 每个开发者都拥有一个完整的版本库镜像,包括完整的历史记录。因此,你可以在本地提交、创建分支,然后在有网络时再与远程仓库(如 GitHub、GitLab)进行同步。
工作流程:
优点:
强大离线工作: 可以在本地进行提交、查看历史等几乎所有操作。
高性能: 因为操作大多在本地,速度极快。
可靠性强: 每个开发者的机器都是一个完整的备份,极大地降低了数据丢失的风险。
灵活的工作流: 非常适合特性分支工作流、GitFlow 等现代协作模式。
缺点: 学习曲线相对陡峭。
今天,Git 是绝对的主流和事实上的标准。由 Linus Torvalds 为管理 Linux 内核开发而创建。
Git 的核心概念:
仓库(Repository): 一个被 Git 管理的项目文件夹。
工作区、暂存区、仓库:
工作区: 你电脑上能看到的项目文件。
暂存区: 一个中间区域,临时存放你打算下次提交的变更。
仓库: 存放所有提交历史的地方。
提交(Commit): 将暂存区的变更永久保存到本地仓库,形成一个版本记录。每次提交都有一个唯一的哈希值 ID。
分支(Branch): 指向某个提交的可变指针。默认的主分支通常叫 main 或 master。创建新分支意味着从主线分叉出去独立开发。
合并(Merge) 与 变基(Rebase): 将分支上的工作整合回主分支的两种不同方法。
远程仓库(Remote): 托管在网络上的仓库,用于团队协作(如 GitHub、GitLab、Gitee)。
#yum安装 [root@200-gitlab ~]# yum -y install git #用法 [root@200-gitlab ~]# git config 用法:git config [选项] 配置文件位置 --global 使用全局配置文件 --system 使用系统级配置文件 --local 使用版本库级配置文件 -f, --file <文件> 使用指定的配置文件 --blob <blob-id> read config from given blob object 操作 --get 获取值:name [value-regex] --get-all 获得所有的值:key [value-regex] --get-regexp 根据正则表达式获得值:name-regex [value-regex] --replace-all 替换所有匹配的变量:name value [value_regex] --add 添加一个新的变量:name value --unset 删除一个变量:name [value-regex] --unset-all 删除所有匹配项:name [value-regex] --rename-section 重命名小节:old-name new-name --remove-section 删除一个小节:name -l, --list 列出所有 -e, --edit 打开一个编辑器 --get-color <slot> 找到配置的颜色:[默认] --get-colorbool <slot> 找到颜色设置:[stdout-is-tty] 类型 --bool 值是 "true" 或 "false" --int 值是十进制数 --bool-or-int 值是 --bool or --int --path 值是一个路径(文件或目录名) 其它 -z, --null 终止值是NUL字节 --includes 查询时参照 include 指令递归查找 #配置git使用用户 [root@200-gitlab ~]# git config --global user.name "admin" #配置git使用邮箱 [root@200-gitlab ~]# git config --global user.email "admin@mail.com" #语法高亮 [root@200-gitlab ~]# git config --global color.ui true #列出当前所有配置 [root@200-gitlab ~]# git config --list user.name=admin user.email=admin@mail.com color.ui=true [root@200-gitlab ~]# cat .gitconfig [user] name = admin email = admin@mail.com [color] ui = true
初始化工作目录、对已存在的目录进行初始化
[root@200-gitlab ~]# mkdir git_data [root@200-gitlab ~]# cd git_data/ #初始化 [root@200-gitlab git_data]# git init 初始化空的 Git 版本库于 /root/git_data/.git/ #查看工作区状态 [root@200-gitlab git_data]# git status # 位于分支 master # # 初始提交 # 无文件要提交(创建/拷贝文件并使用 "git add" 建立跟踪) [root@200-gitlab git_data]# cd .git/ [root@200-gitlab .git]# ll -a 总用量 12 drwxr-xr-x 7 root root 119 11月 15 18:31 . drwxr-xr-x 3 root root 18 11月 15 18:26 .. drwxr-xr-x 2 root root 6 11月 15 18:26 branches #分支目录 -rw-r--r-- 1 root root 92 11月 15 18:26 config #定义项目特有的配置选项 -rw-r--r-- 1 root root 73 11月 15 18:26 description #仅供git web程序使用 -rw-r--r-- 1 root root 23 11月 15 18:26 HEAD #指示当前的分支 drwxr-xr-x 2 root root 242 11月 15 18:26 hooks #包含git钩子文件 drwxr-xr-x 2 root root 21 11月 15 18:26 info #包含一个全局排除文件(exclude) drwxr-xr-x 4 root root 30 11月 15 18:26 objects #存放所有数据内容。有info和pack两个子文件夹 drwxr-xr-x 4 root root 31 11月 15 18:26 refs #存放指向数据(分支)的提交对象的指针
| 命令 | 说明 | 示例 |
|---|---|---|
| git init | 在当前目录初始化一个新的 Git 仓库 | git init |
| git clone <repo_url> | 克隆(下载)一个远程仓库到本地 | git clone https://github.com/user/repo.git |
这三个命令构成了最基本的 Git 工作流:
| 命令 | 说明 | 示例 |
|---|---|---|
| git add <file> | 将文件的修改添加到暂存区 | git add main.py(添加特定文件) |
| git add .(添加所有修改) | ||
| git commit -m "message" | 将暂存区的内容提交到本地仓库,创建一个版本记录 | git commit -m "修复了登录BUG" |
| git status | 查看工作区和暂存区的状态(哪些文件被修改了、哪些已暂存) | git status |
记忆技巧: 工作区 -> add -> 暂存区 -> commit -> 本地仓库
| 命令 | 说明 | 示例 |
|---|---|---|
| git lo | 查看提交历史 | git log |
| git log --oneline(简洁模式) | ||
| git log -p(显示具体内容差异) | ||
| git diff | 查看工作区和暂存区的差异 | git diff |
| 查看工作区和最新提交的差异 | git diff HEAD | |
| 查看暂存区和最新提交的差异 | git diff --staged | |
| git show <commit_id> | 显示某次提交的详细信息 | git show a1b2c3d |
| git blame <file> | 查看指定文件的每一行最后是谁修改的 | git blame README.md |
| 命令 | 说明 | 示例 |
|---|---|---|
| git branch | 查看所有本地分支 | git branch |
| git branch <branch_name | 创建一个新分支 | git branch feature-login |
| git checkout <branch_name> | 切换到指定分支 | git checkout feature-login |
| git switch <branch_name> | (Git 2.23+) 切换到指定分支(更安全) | git switch main |
| git checkout -b <branch_name> | 创建并切换到新分支(经典组合) | git checkout -b hotfix-1 |
| git switch -c <branch_name> | (Git 2.23+) 创建并切换到新分支 | git switch -c hotfix-1 |
| git merge <branch_name> | 将指定分支合并到当前分支 | git switch main git merge feature-login |
| git branch -d <branch_name> | 删除已合并的分支 | git branch -d feature-login |
| git branch -D <branch_name> | 强制删除分支,即使它未合并 | git branch -D experiment |
| 命令 | 说明 | 示例 |
|---|---|---|
| git remote -v | 查看关联的远程仓库地址 | git remote -v |
| git remote add <name> <url> | 添加一个远程仓库地址并起别名 | git remote add origin https://gitee.com/user/repo.git |
| git fetch <remote> | 从远程仓库拉取最新信息到本地,但不自动合并 | git fetch origin |
| git pull <remote> <branch> | 拉取远程分支并自动合并到当前分支(=fetch+merge) | git pull origin main |
| git push <remote> <branch> | 推送本地分支到远程仓库 | git push origin main |
| 首次推送并设置上游跟踪分支 | git push -u origin main | |
| git push --delete <remote> <branch> | 删除远程分支 | git push origin --delete old-branch |
(操作前请谨慎,确认已提交的代码不会丢失!)
| 命令 | 说明 | 适用场景 |
|---|---|---|
| git restore <file> | 丢弃工作区的修改,恢复到最近一次 git add 或 git commit 的状态 | 文件改乱了,想重新开始 |
| git restore --staged <file> | 将文件从暂存区撤回到工作区(取消 git add) | 不小心把不该提交的文件 add 了 |
| git reset --soft <commit_id> | 回退到某个提交,但保留工作区和暂存区的修改 | 回退版本,但想重新组织提交信息 |
| git reset --mixed <commit_id> | (默认) 回退到某个提交,保留工作区,但清空暂存区 | 回退版本,想重新检查代码再提交 |
| git reset --hard <commit_id> | 彻底回退到某个提交,丢弃工作区和暂存区的所有修改 | 彻底放弃最近几次提交的代码 |
| git revert <commit_id> | 创建一个新的提交来撤销某次提交的更改(更安全,推荐用于公共分支) | 撤销已经推送到远程仓库的提交 |
| 命令 | 说明 | 示例 |
|---|---|---|
| git stash | 将当前工作区的修改临时储藏起来 | git stash |
| git stash list | 查看所有的储藏列表 | git stash list |
| git stash pop | 恢复最近一次储藏的修改,并删除储藏记录 | git stash pop |
| git stash apply | 恢复储藏的修改,但不删除储藏记录 | git stash apply stash@{0} |
| git stash drop | 删除一个储藏 | git stash drop stash@{0} |
使用场景: 当你正在一个分支上工作到一半,需要紧急切换到另一个分支修复 Bug 时,可以先 git stash 储藏当前工作,修复完后再 git stash pop 恢复。
# 日常最高频组合 git status # 查看状态 git add . # 添加所有修改到暂存区 git commit -m "描述" # 提交到本地仓库 git pull origin main # 拉取远程最新代码(避免冲突) git push origin main # 推送到远程仓库 # 分支操作高频组合 git checkout -b new-feature # 创建并切换到新分支 git switch -c new-feature # (新版)创建并切换到新分支 ... (在新分支上开发) ... git switch main # 切换回主分支 git merge new-feature # 将新分支合并到主分支 git branch -d new-feature # 删除已合并的本地分支
最佳实践建议:
提交前先 pull:推送前先拉取远程最新代码,减少冲突。
提交信息清晰:使用有意义的提交信息,便于日后回溯。
勤用分支:为新功能或修复创建独立分支,不要直接在主分支上开发。
理解后再撤销:在对 reset 和 revert 有充分理解前,谨慎使用。