Git 核心原理与基础使用详解(上)
深入剖析 Git 的核心原理与基础使用。首先介绍了版本控制的概念及 Git 的优势,随后详细讲解了在 CentOS、Ubuntu 及 Windows 系统下的安装方法。接着阐述了工作区、暂存区和版本库的三大区域机制,演示了文件添加、修改、回退及删除等基本操作。最后重点解析了分支管理的策略,包括分支创建切换合并、冲突解决、Fast-forward 模式以及 Bug 分支处理。旨在帮助开发者建立对 Git 的系统性认知,从原理到实操全面掌握版本控制工具。

深入剖析 Git 的核心原理与基础使用。首先介绍了版本控制的概念及 Git 的优势,随后详细讲解了在 CentOS、Ubuntu 及 Windows 系统下的安装方法。接着阐述了工作区、暂存区和版本库的三大区域机制,演示了文件添加、修改、回退及删除等基本操作。最后重点解析了分支管理的策略,包括分支创建切换合并、冲突解决、Fast-forward 模式以及 Bug 分支处理。旨在帮助开发者建立对 Git 的系统性认知,从原理到实操全面掌握版本控制工具。

在软件开发的全流程中,版本控制是保障协作效率、规避开发风险的核心基石。Git 作为目前最流行、最强大的分布式版本控制系统,已渗透到从个人开发到大型企业级项目的每一个环节。无论是多人协作时的代码冲突解决、开发过程中的版本回溯,还是跨环境的代码同步、分支管理,Git 都以其高效、安全、灵活的特性,成为开发者必备的核心工具。
在编写文档或代码时,为了防止丢失或修改失误,通常需要复制多个副本(如 v1, v2, 最终版等)。随着版本数量增多,管理变得困难。版本控制器(Version Control System)能记录工程的每一次改动和版本迭代,方便多人协同作业。
目前最主流的版本控制器是 Git。Git 可以控制电脑上所有格式的文件,但对于开发人员来说,最重要的是管理源代码文件。
注意事项: 所有的版本控制系统(包括 Git)只能跟踪文本文件的改动(如 TXT、网页、程序代码)。对于图片、视频等二进制文件,虽然也能管理,但无法跟踪具体变化,只能记录文件大小变更。
Git 是开放源代码的代码托管工具,最早在 Linux 下开发,现已支持 Linux、Unix、Mac 和 Windows 平台。
以 CentOS 7.6 为例: 首先检查是否已安装:
git -bash: git: command not found
若未安装,执行以下命令:
sudo yum -y install git
git --version
以 Ubuntu 22.04 为例: 检查安装情况:
git Command 'git' not found, but can be installed with: sudo apt install git
安装命令:
sudo apt-get install git -y
git --version
Windows 用户可前往官网下载并安装 Git for Windows。
仓库是进行版本控制的一个文件目录。创建 Git 本地仓库的命令为 git init,需在目标目录下执行。
执行后当前目录下会多出一个 .git 隐藏目录,这是 Git 用来跟踪管理仓库的,切勿手动修改其中文件。
安装 Git 后需设置用户名和邮箱地址:
git config --global user.name "Your Name"
git config --global user.email "[email protected]"
--global 为可选参数,表示该机器上所有 Git 仓库均使用此配置。若不添加,则仅在当前仓库生效。
查看配置:git config -l
删除配置:git config [--global] --unset user.name
.git 目录下的 index 文件中。.git,它不算工作区,而是 Git 的版本库。工作机制:
git add 命令时,暂存区目录树的文件索引会被更新。git commit 时,master 分支会做相应更新,暂存区的目录树才会被真正写到版本库中。在包含 .git 的目录下新建文件,可使用 git add 将文件添加到暂存区:
git add [file1] [file2] ...git add [dir]git add .再使用 git commit 将暂存区内容添加到本地仓库:
git commit -m "message"git commit [file1] [file2] ... -m "message"注意:-m 选项后的 message 由用户自己完成,用于记录提交细节。
查看历史提交记录:git log
若嫌输出信息太多,可加上 --pretty=oneline 参数。
每次提交的 commit id 是一个 SHA1 计算出来的十六进制数字。
.git 目录结构解析:
git add 后会更新该内容。查找 object 时需将 commit id 分成两部分,前 2 位是文件夹名称,后 38 位是文件名称。可使用 git cat-file 命令来查看版本库对象的内容。
若新增了两个文件 file4 和 file5,但未对 file5 执行 git add,则 git commit 时只会提交 file4。如需提交 file5,需再次 add 并 commit。
Git 跟踪并管理的是修改,而非文件。例如新增一行、删除一行、更改字符等均为修改。
查看当前仓库状态:git status
显示暂存区和工作区文件的差异:git diff [file]
查看版本库和工作区文件的区别:git diff HEAD -- [file]
执行 git reset 命令用于回退版本,语法格式为:
git reset [--soft | --mixed | --hard] [HEAD]
HEAD 说明:
~ 数字表示,如 HEAD~1 表示上一个版本。若清屏导致 commit 展示信息消失,可使用 git reflog 命令补救,该命令用来记录本地的每一次命令。
针对工作区的代码,还没有 add。
使用 git checkout -- [file] 命令让工作区的文件回到最近一次 add 或 commit 时的状态。注意命令中的 -- 很重要,不可省略。
已经 add,但没有 commit。
使用 git reset 回退暂存区的内容,工作区文件保持不变。随后丢弃工作区的修改。
已经 add,并且也 commit 了。
使用 git reset --hard HEAD^ 回退到上一个版本。前提是尚未把本地版本库推送到远程。
在 Git 中,删除也是一个修改操作。
若直接在工作区删除文件,需使用 git rm 将文件从暂存区和工作区中删除,并且 commit。
若误删,可使用 git checkout -- [file] 恢复。
分支就是科幻电影里的平行宇宙。在版本回退里,每次提交,Git 都把它们串成一条时间线,这条时间线就可以理解为一个分支。截止到目前,只有一条时间线,即 master 分支。
HEAD 严格来说不是指向提交,而是指向 master,master 才是指向提交的,所以 HEAD 指向的就是当前分支。
git branch devgit checkout dev
切换到 dev 分支后,HEAD 指向 dev。在 dev 分支下修改并提交后,切回 master 分支,发现新内容不见了,因为 master 的提交点并未改变。git merge dev
将 dev 分支合并到当前分支。Fast-forward 代表'快进模式',直接把 master 指向 dev 的当前提交。合并完成后,dev 分支若无用可删除。注意如果当前正处于某分支下,就不能删除当前分支。
命令:git branch -d dev
在实际分支合并时,可能会遇到代码冲突。
Git 会用 <<<<<<<, =======, >>>>>>> 来标记出不同分支的冲突内容。此时必须手动调整冲突代码,并再次提交修正后的结果。
通常合并分支时,如果可能,Git 会采用 Fast forward 模式。但这会导致分支历史信息丢失。
Git 支持强制禁用 Fast forward 模式,使用 --no-ff 参数。这样在 merge 时会生成一个新的 commit,从分支历史上可以看出分支信息。
实际开发中的基本原则:
假如正在开发中发现 master 上有 bug,需要修复。
每个 bug 都可以通过一个新的临时分支来修复,修复后合并分支,然后删除临时分支。
若当前工作区有未提交的代码,可使用 git stash 命令将当前工作区信息进行储藏。
恢复现场:git stash pop(恢复的同时会把 stash 也删了)。
建议在自己分支上先合并 master,再让 master 去合并自己的分支,以便在本地解决冲突。
每添加一个新功能,最好新建一个 feature 分支,开发完成后合并,最后删除该 feature 分支。
若中途停止开发,可使用 git branch -d 删除分支。
分支的实际用途: 假设准备开发一个新功能,需要两周完成。第一周写了 50% 的代码,如果立即提交,不完整的代码库会影响他人;如果等写完再提交,存在丢失每天进度的风险。有了分支,可以在自己的分支上干活,想提交就提交,直到开发完毕后一次性合并到原来的分支上,既安全又不影响别人工作。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online