版本控制系统是一种软件工具,它帮助开发团队记录和管理文件(通常是源代码)的变更历史。你可以把它理解成一个“超级撤销”或“文件时光机”。
核心要解决的问题是:
在 DevOps 和现代软件开发中,版本控制系统是一切自动化流程的基石。没有它,以下实践都无法实现:
版本控制系统主要经历了三个发展阶段:
代表工具:RCS(Revision Control System)
代表工具:SVN(Subversion)、CVS(Concurrent Versions System)
工作原理: 存在一个中央服务器,保存所有文件的版本历史。开发者从服务器签出代码,修改后提交回服务器。
工作流程:
优点: 管理简单,权限控制集中。
缺点:
代表工具:Git、Mercurial
工作原理: 每个开发者都拥有一个完整的版本库镜像,包括完整的历史记录。因此,你可以在本地提交、创建分支,然后在有网络时再与远程仓库(如 GitHub、GitLab)进行同步。
工作流程:
优点:
缺点: 学习曲线相对陡峭。
今天,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 | 将文件的修改添加到暂存区 | 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 | 查看指定文件的每一行最后是谁修改的 | 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 | 添加一个远程仓库地址并起别名 | git remote add origin https://gitee.com/user/repo.git |
| git fetch | 从远程仓库拉取最新信息到本地,但不自动合并 | git fetch origin |
| git pull | 拉取远程分支并自动合并到当前分支(=fetch+merge) | git pull origin main |
| git push | 推送本地分支到远程仓库 | git push origin main |
| 首次推送并设置上游跟踪分支 | git push -u origin main | |
| git push --delete | 删除远程分支 | git push origin --delete old-branch |
(操作前请谨慎,确认已提交的代码不会丢失!)
| 命令 | 说明 | 适用场景 |
|---|---|---|
| git restore | 丢弃工作区的修改,恢复到最近一次 git add 或 git commit 的状态 | 文件改乱了,想重新开始 |
| git restore --staged | 将文件从暂存区撤回到工作区(取消 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 # 删除已合并的本地分支
最佳实践建议:
| 备注 | 修改日期 | 修改人 |
| 格式调整 | 2025-11-17 20:51:22[当前版本] | 文艺范儿 |
| 内容更新 | 2025-11-17 20:47:15 | 文艺范儿 |
| 创建版本 | 2025-11-17 20:38:45 | 文艺范儿 |