资讯动态

一文快速了解分布式版本控制系统Git

发布时间:2026/10/17 1:37:54 来源:尧图企业网站定制
文章目录1 版本控制系统的分类1.1 集中式1.2 分布式2 Git的介绍3 Git工作流程图4 Git的安装与配置4.1 Git下载与安装4.2 Git基础配置5 Git本地仓库常用命令5.1 基础命令5.1.1 初始化本地仓库5.1.2 查看仓库状态5.1.3 添加到暂存区5.1.4 提交到本地仓库5.1.5 查看日志5.1.6 版本重置5.1.7 忽略列表5.1.8 为常用命令配置别名5.2 分支命令5.2.1 查看本地分支5.2.2 创建本地分支5.2.3 切换分支5.2.4 合并分支5.2.5 删除分支5.2.6 解决冲突5.3 标记命令5.3.1 查看标记5.3.2 创建标记5.3.3 推送标记到远程仓库5.3.4 切换标记5.3.5 删除标记5.3.6 拉取标记6 Git远程仓库6.1 注册码云账号6.2 创建远程仓库6.3 配置SSH公钥6.4 操作远程仓库6.4.1 添加远程仓库6.4.2 查看远程仓库6.4.3 推送到远程仓库6.4.4 从远程仓库克隆6.4.5 抓取和拉取6.4.6 解决冲突6.4.7 与远程仓库同步分支2023-05-26补充身为一名程序员我们除了自己单人开发项目更多的情况需要多人协同开发。如果你使用硬盘拷贝或者发送压缩包之类的方式虽然我们公司常用那肯定是不如版本控制系统来的安全与高效。不考虑硬盘丢失或文件损坏等意外情况拷贝的代码合并就很令人头疼本文就来带大家快速上手分布式版本控制系统Git。1 版本控制系统的分类1.1 集中式集中式版本控制系统的版本库是集中存放在“中央服务器”的所有操作都需要联网局域网或互联网。比如你修改了某个bug但是你的电脑无法联网或者“中央服务器”宕机了此时你就无法提交到“中央服务器”就会影响到你版本管理。代表工具SVN。1.2 分布式分布式版本控制是没有“中央服务器”的每一台电脑都有完整的版本库你可以在本地分支上提交代码、合并分支、解决冲突等操作。多人协作时只需要把各自的修改推送给对方就能看到对方的操作记录了。代表工具Git。2 Git的介绍Git是一个开源的分布式版本控制系统可以有效、高速地处理从很小到非常大的项目版本管理。也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。先看下面的示意图Git有本地仓库和远程仓库它们俩都有完整的版本库远程仓库的作用是方便开发人员之间代码的推送与拉取。3 Git工作流程图Git命令clone克隆从远程仓库中克隆代码到本地仓库checkout检出从本地仓库中检出一个仓库分支然后进行修订add添加在提交前先将代码保存到暂存区commit提交提交到本地仓库fetch抓取从远程仓库更新版本库到本地仓库不进行合并pull拉取从远程仓库更新版本库到本地仓库并自动进行合并push推送将本地仓库的修改内容推送到远程仓库4 Git的安装与配置4.1 Git下载与安装官网Git官网当前最新版是2.37.3下载后运行程序全部默认即可。安装完成后在桌面或任何文件夹内右键出现下面两个则表示成功Git GUIGit提供的图形界面工具Git BashGit提供的命令行工具本文只介绍Git Bash中的命令了解了命令后界面工具也很容易上手。4.2 Git基础配置安装完成后首先必须要设置用户信息因为Git每次提交版本时都会使用该用户打开Git Bash设置用户信息邮箱可以不是真实邮箱git config--global user.name你的用户名git config--global user.email你的邮箱查看配置信息git config--global user.name git config--global user.email5 Git本地仓库常用命令5.1 基础命令5.1.1 初始化本地仓库命令形式git init新建一个文件夹git_test进入目录后打开Git Bash输入上述命令出现以下内容则表示初始化成功此时在目录中会生成一个隐藏的.git文件夹里面就是你的版本库信息含.git文件夹的目录称为工作目录。5.1.2 查看仓库状态在工作目录中所有文件都有状态新建文件是未跟踪untracked修改已有文件是未暂存unstaged添加到暂存区是已暂存staged提交到仓库是已提交committed。命令形式git status输入以上命令可以查看仓库当前状态命令行提示说在master分支上没有任何内容可以提交创建或复制文件然后使用“git add”命令来跟踪5.1.3 添加到暂存区命令形式git add 文件名|通配符上述命令可以将工作区一个或多个文件添加到暂存区添加单个文件git add 文件名或目录名添加所有修改的文件git add .举例说明在我们的工作目录git_test中新建一个txt文件叫file01可以鼠标右键新建也可以使用命令touch file01.txt此时再执行git status命令会得到另一种提示命令行提示说file01.txt是未被跟踪的文件使用“git add 文件名”来包含要提交的内容 。那我们这里就执行git add file01.txt命令然后再执行git status命令可以发现它的状态发生了改变命令行提示file01.txt文件等待提交使用“git rm --cached ” 可以退回未暂存状态。上面的操作是新增一个文件如果修改已提交的文件则会更改状态为未暂存unstaged。假设你已完成5.1.4 提交到仓库的操作然后修改file01.txt内容添加count1然后再执行git status命令命令行提示你的修改还没有暂存不能提交可以使用git add 来更新要提交的内容或者使用“git restore ”来丢弃工作目录中的更改。那我们这里可以执行git add file01.txt或者git add .命令然后再执行git status命令可以发现它的状态发生了改变可以看到修改后的file01.txt文件被成功添加5.1.4 提交到本地仓库命令形式git commit[-m注释内容]通过该命令可以将已暂存的文件提交到本地仓库[]中的部分表示可选推荐必填。因为注释内容本身是必须的如果在此处不填下一步会打开其他编辑器比如vim编辑器或其他让你填写。此时再执行git status查看状态可以看到已经成功提交了之前的No commits yet也消失了。注意提交步骤需要先添加到暂存区再提交下文说的提交到仓库指的这连续两步。5.1.5 查看日志命令形式git log[option]选项–all 显示所有分支–oneline 将提交信息显示为一行–graph 以图的形式显示通过该命令可以查看仓库的所以操作记录此处commit后面的一长串字符串是版本号commitID后面括号内的HEAD表示当前所在分支这里的意思是当前分支是master分支。Author表示作者Date则表示提交时间add file01就是我们填写的提交信息。我们可以把上面几个常用选项全部加上同时输出不加选项的日志进行比较commitID缩短了用户信息和日期被省略了只留下了关键的分支和注释这样我们看日志会更加清楚明了。同时缩略的commitID使用时效果是一样的因为它是唯一的。5.1.6 版本重置命令形式git reset--hard commitID比如上面已经提交过两次第一次新建file01文件第二次在file01文件修改内容所以有两次提交记录执行上述命令后当前版本就会重置到第一次提交记录上此时你在日志中已经查看不到第二次提交的记录了那我们是否可以通过本条命令重置当前版本到第二次提交记录上答案是可以的我们可以通过上面第二次提交的commitID来执行命令。可以看到日志中又出现了第二次提交的记录但是如果我们清除了命令行工具的内容拿不到commitID那还能重置回去吗答案是可以的这里需要使用另一条命令git reflog。这条命令可以理解为显示所有引用日志它可以查看所有的版本操作记录包含提交与重置而git log只显示当前版本HEAD指针及其之前的版本信息。这里我们对比一下两条命令的输出在git log下面只有两次的提交记录而在git reflog下面有四条记录从上到下是最新到最旧的记录分别是1. 重置到第二次提交2. 重置到第一次提交3. 提交更新文件file01.txt4. 提交新建文件file01.txt。所以我们可以在这拿到想要的commitID。5.1.7 忽略列表我们新增了一个file02.txt文件但是我们不想提交它同时又希望使用git add .来一键全部提交此时可以新建一个.gitignore文件在里面写上file02.txt保存下面我在保存前后分别执行git status查看了文件的状态可以看到保存前未跟踪的文件里包含file02.txt文件保存后则被忽略了。5.1.8 为常用命令配置别名有些命令加上选项会很长但是又经常使用比如git log --oneline --graph此时我们可以给它配置别名。打开用户目录创建.bashrc文件打开【C盘】-【用户】我这里用户目录是【Administrator】打开目录后新建.bashrc文件。部分windows系统不支持创建点开头的文件可以打开Git Bash执行touch ~/.bashrc。在.bashrc文件中输入以下内容alias git-loggit log --all --oneline --graph这样别名就设置成功了我们可以执行git-log试试效果发现确实和执行git log --oneline --graph是一样的注意.bashrc的内容修改后Git Bash需要重启才会生效。5.2 分支命令顾名思义分支就是从主体上分出去的一部分。分支可以把开发环境和生产环境分离开来避免开发影响到生产环境。最常用的分支有两个master生产分支和dev开发分支。其他更细致的分支可以自行百度这里举个例子 比如leader让你开发一个新功能应该在dev分支上创建一个新的分支feature/xxx等到功能完成并且测试通过后先合并到dev分支上然后leader审核通过后再合并到master分支上这样可以在开发新功能的同时保证生产环境的稳定与安全。5.2.1 查看本地分支命令形式git branch初始化仓库时默认创建master分支可以看到当前只有master分支并且当前所在分支就是master分支颜色标绿且前面带有星号5.2.2 创建本地分支命令形式git branch 分支名可以看到已经成功创建了dev分支但是当前所在分支还是master分支。5.2.3 切换分支命令形式git checkout[-b]分支名不加参数-b只能切换已创建的分支添加参数-b可以在分支不存在时创建并切换。5.2.4 合并分支一个分支上的提交可以合并到另一个分支。比如前面提到的master作为生产分支我们新增功能模块是不该在上面开发的可以新建一个dev分支开发完成后再合并到master分支。命令形式git merge 分支名举例说明继续使用前面的例子我们切换到dev分支然后创建一个file03.txt文件按顺序执行git add .git commit -m add file03git-log。此时可以看到最新的版本记录分支是devHEAD指针指向的就是当前分支注释内容是add file03正是我们刚刚提交的。然后切换回master分支可以看到master分支的版本记录只到update count1这一步这时我们想把dev分支的改动合并到master分支上来就可以执行git merge dev。注意我们要合并到master分支那就要切换到master分支不能在dev分支上执行那就没有效果了。可以看到dev分支上的改动已经成功合并到master分支上。5.2.5 删除分支命令形式git branch -d 分支名 // 通常情况使用git branch -D 分支名 // 强制删除在被删除分支比当前分支的版本更新时使用比如dev比master多了一次提交想要删除dev就必须使用该命令5.2.6 解决冲突当我们在两个分支上改动同一个文件就会产生冲突。比如上面的例子master和dev都有file01.txt文件内容都是count1我们切换到dev分支把内容改为count2然后提交再切换到master分支把内容改为count3然后提交然后我们把dev合并到master上此时命令行提示自动合并file01.txt失败需要解决冲突然后提交结果。我们可以使用记事本打开file01.txt两条分支都修改了同一个文件的同一行合并时Git不知如何取舍所以干脆交给执行合并命令的人处理。从HEAD到虚线的是当前分支的内容从虚线到dev的就是dev分支的内容。解决冲突很简单也很暴力那就是留下你需要提交的内容比如这里我要留下count3那就删掉其他内容然后再重新提交一遍就行了5.3 标记命令标记tag用来标记提交commit历史中的某个特定节点通常用来标记版本发布节点v1.0v2.0它不会随着 commit 命令自动更新。Git 分为两种标记1.轻量标记 lightweight tag类似一个不会移动的分支只是一个指向 commit 的指针没有额外元数据。2.附注标记 annotated tag推荐生产发布使用作为完整对象存放在 Git 对象库带作者、日期、备注信息。5.3.1 查看标记# 列出所有本地 taggittag# 模糊查找 tag例如查找 v1 开头gittag-lv1.*# 查找某个 tag 的详情附注标记才能看到完整信息gitshow v1.0.05.3.2 创建标记# 创建轻量标记gittag v1.0.0-light# 创建附注标记gittag-av1.0.0-m版本v1.0.0正式上线# 在指定 commit 上打附注标记gittag-av0.9.0 7a82bc3-m历史版本v0.9.05.3.3 推送标记到远程仓库注意默认git push不会把 tag 推到远程仓库需要单独推送 tag# 推送单个taggitpush origin v1.0.0# 推送所有本地taggitpush origin--tags5.3.4 切换标记tag 本质是 commit 的别名可以直接检出gitcheckout v1.0.05.3.5 删除标记# 本地删除gittag-dv1.0.0# 远程删除gitpush origin-dv1.0.05.3.6 拉取标记# 拉取远程所有tag到本地gitfetch--tags6 Git远程仓库前面我们讲的都是本地仓库的操作命令只有将远程仓库关联进来才是完整的Git工作流程。那么我们如何搭建Git远程仓库呢其实可以通过互联网上提供的一些代码托管服务来实现比如Github码云Gitee等等。Github因为某些原因需要科学上网我们这边就选择码云。6.1 注册码云账号码云是国内的一个代码托管平台想要使用它的服务自然要先注册账号注册流程直接略过。6.2 创建远程仓库在码云右上角有个加号展开后点击【新建仓库】然后填写仓库名称系统会自动填充路径其他都可以不用改动然后立即创建创建后的样子如上图所示6.3 配置SSH公钥现在远程仓库已经创建好了我们想要把本地仓库推送到远程仓库远程仓库需要验证我们的身份有两种方式一种是输入Git的账号和密码一种是SSH公钥推荐使用第二种。首先打开Git Bash执行以下命令来生成公钥ssh-keygen-t rsa然后一直回车即可如果公钥已经存在则会自动覆盖。已经生成过的公钥可以执行以下命令来查看cat~/.ssh/id_rsa.pub这样我们就拿到需要的公钥了然后要把它填到哪呢打开码云展开右上角头像菜单根据上图点击【设置】然后左侧菜单栏点击【SSH公钥】把拿到的公钥填到公钥一栏里标题一栏有时会自动填充你也可以随便改点击确定就添加成功了。那么如何验证公钥生效了呢打开Git Bash执行ssh -T gitgitee.com出现以下内容则表示成功注意如果你是第一次访问它会询问你是否继续访问这里输入 yes 然后回车然后就能看到上图的内容了。6.4 操作远程仓库6.4.1 添加远程仓库命令形式git remote add 远端名称 仓库路径远端名称默认是origin仓库路径从远端服务器获取我们打开码云上新建的仓库从上面获取仓库的SSH地址然后就能在Git Bash中执行命令6.4.2 查看远程仓库命令形式git remote[-v]-v/--verbose: 详细模式不加-v只会列出远程仓库名字比如origin加-v额外显示远程仓库的地址并且区分拉取fetch和推送push地址。6.4.3 推送到远程仓库命令形式git push[-u][远程主机名本地分支名[:远程分支名]]如果直接执行git push会提示当前分支和远程分支没有关联需要我们推送当前分支并绑定关联。方法有两种第一种是git push origin masterorigin是通用的远程主机名本地分支名和远程分支名相同时可省略所以可以只有一个master。这种写法有一个弊端就是每次都要写全。第二种方法是git push-u origin master参数-u是--set-upstream的缩写作用是将当前本地分支即master和远程分支也叫master建立关联之后的推送可以直接执行git push。此时就成功推送到了远程仓库并且创建了master分支origin/master就是远程分支。我们打开码云上的仓库可以看到文件全都推送成功了历史提交的版本也都能查看。我们也可以执行git branch -vv来查看本地分支和远程分支的关联关系下图看到master后面跟着origin/master就说明关联成功了。其他git push命令除了-u还有其他参数此处不做展开有兴趣的可以执行git push -h查看自行研究。回滚远程仓库git push到远程仓库正常推送会被拒绝需要使用强制命令git push -f到远程仓库完成回滚。6.4.4 从远程仓库克隆我们已经成功将本地仓库推送到远程仓库假如我们的同事要协同开发他就可以从远程仓库进行克隆。命令形式git clone[远程仓库路径][本地目录名称]远程仓库路径就是仓库的url可以使SSH或其他如下图这样就成功克隆了仓库。本地目录名称作用是修改本地项目名称如果不加本地项目的目录名称就是远程仓库的名称。比如上面远程仓库名是git_testCloning into git_test就表示在当前目录下创建了一个git_test目录把远程仓库的内容克隆到该目录我们可以加上git_testf_01那么目录名就自动变了。这里我们可以执行ls命令它可以查看当前目录下所有文件可以看到确实是创建了git_test_01目录6.4.5 抓取和拉取抓取命令形式git fetch[远程仓库名[分支名]]提示如果不指定远程仓库名和分支名则抓取对应的分支。继续使用上面的例子在git_test目录下新增file04.txt文件并提交到仓库然后推送到远程仓库。打开git_test_01目录执行抓取命令执行git-log可以看到最新的版本库是origin/master远程分支但是本地master分支并不是最新版本库因此需要执行git merge origin/master合并分支此时本地master分支也是最新版本库了拉取命令形式git pull[远程仓库名[分支名]]提示如果不指定远程仓库名和分支名则抓取对应的分支。抓取和拉取的区别就在于抓取不会自动合并而拉取会在抓取后执行合并。我们可以在git_test目录下新增file05.txt文件并提交到仓库然后推送到远程仓库。打开git_test_01目录执行拉取命令可以看到拉取成功后本地master分支就是最新版本库了。6.4.6 解决冲突**本地仓库更改后在推送到远程仓库前应该先执行抓取再执行推送。**假如用户A修改了file01文件并且推送到了远程仓库用户B也在本地修改了file01文件此时他想推送到远程仓库就会失败。提示说远程仓库有你本地没有的工作建议你先集成远程仓库的更改。这就是先执行抓取的原因。我们执行抓取后通常执行拉取此处抓取是为了输出日志查看。远程更改了count为8本地更改了count为9此时执行合并分支就会产生冲突。如果觉得抓取合并太麻烦你也可以直接执行拉取pull效果是一样的。图中HEAD表示本地最后面的版本号表示远程。出现冲突不用怕解决冲突和前面本地仓库是一样的就是把需要提交的内容留下其余删除然后提交到本地再推送到远程。这里我们就把这段内容删除留下count10然后提交。这样我们就解决了冲突最后一步就是把解决冲突后的文件推送到远程仓库。6.4.7 与远程仓库同步分支2023-05-26补充远程仓库新增一条分支本地可以通过fetch命令同步分支git fetch然后就能通过checkout命令切换到新的分支上git checkout 分支名在vscode中可以在左下角切换分支到这里Git的入门知识就讲完了希望这篇文章能对入门的伙伴有一点帮助。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑