boxmoe_header_banner_img

⋅無⋅限⋅進⋅步⋅

加载中

文章导读

Git原理与实践


avatar
yuhui 2025年10月21日 29

Git原理与实践

举例说明,在修改某个文档时,可能会有多个更改版本,此时存在多个修改版本,如果某个修改需要回退,需要打开多个文件进行查找十分不便

版本控制:增加修改描述及版本号

增加修改描述信息能够更为直观的展示版本的变化

一天中可能会产生多个副本,为明确这些副本的演进关系,增加版本号信息:

文件名中添加修改描述及版本号信息,可以直观看到每个副本所对应的修改内容,以及多个副本在时间维度的演进关系

1741862713200-a3cb3aee-0354-4261-82cd-ed257db6d897.png

当论文被多个导师评审修改意见后,出现新的问题

1741862713222-d165bdd7-ffc2-4bb6-8ca6-8404d2773545.png

1741862713190-041e4687-6b47-4ac5-9105-1735dd3b1388.png1741862713196-0cd56cb2-14d2-4e54-a5cd-0bef023bd2b6.png

涉及多人修改的情况,文件名还需要添加修改人信息

版本控制系统所起的作用,跟上述例子起名作用类似

版本控制简介:对软件开发过程中程序代码、配置文件及说明文档等文件变更的管理,可以记录一个或若干文件的内容变化,追踪文件的变更,以便将来查阅特定版本修订情况

作用:

记录每一次修改并且备注修改的内容及修改人

可以在项目的各个历史版本之间自如切换

可以一目了然的比较出两个版本之间的差异

可以从当前的修改中撤销某些操作

可以自如创建分支,合并分支

可以多人协作开发

1741862713198-e303481a-537c-45e8-b166-6a5378b2b5e3.png

版本控制系统分类:

版本控制系统根据其工作方式分为:

1741862733592-b3226f42-92e4-4cb0-801c-b714f7a37327.png1741862733595-3a152201-07d4-465c-be3d-aa313cd3a449.png

本地版本控制系统 集中式版本控制系统

1741862733597-2ee72a5d-eda2-4f48-af02-8a574ad964dc.png

分布式版本控制系统

本地版本控制系统:安装在一台本地PC上的,采用某种简单的数据库来记录文件的历次更新差异,利用这些差异可以重新计算出各个版本的文件内容,保证内容不会丢失。本地所以无法多人协作开发

集中式版本控制系统:有一个单一的集中管理服务器,保存所有文件的修订版本,协同工作的人们通过客户端连接到这台服务器,去除最新的文件或者提交更新,相对于本地版本控制系,集中式版本控制系统可以多人开发,管理员轻松掌握用户开发权限,但缺点是服务器单点故障,如果网络不通,开发者都无法提交更新,如果服务器磁盘损坏,没有备份,那么所有数据都会丢失,包括项目整个变更历史,集中式代码管理的核心是服务器,所有开发者在开始新一天的工作之前必须从服务器上获取最新代码,然后开发,解决冲突,提交,脱离服务器开发者无法工作

分布式版本控制系统:相较于集中式版本控制系统最大区别于 客户端不只是提取最新版本的文件快照。而是把整个代码仓库完整的镜像,如果远程仓库服务器网络不通,开发者可以提交到本地仓库,同时也可以回退文件到任意一个历史版本。而集中式版本控制系统则不行,因为集中式版本控制系统,变更记录都是保存在中央服务器上的,网络不同的话,客户端无法获得变更记录,分布式版本的服务器发生故障,事后都可以用任何一个开发者的本地仓库回复,在容灾与备份方面有天生优势

分布式版本控制系统基本概念:

远程仓库:在服务器上创建的代码仓库

本地仓库:开发人员在本地的PC代码仓库

分支:代码仓库中代码的一个副本

克隆:将远程仓库复制到本地PC

推送:将本地仓库的代码修改合入到远程仓库

分布式版本控制系统工作原理:

1741862733675-0a63d87c-8257-488e-8965-77911412b70c.png

1741862733725-957cbb6f-c89e-4d72-9e76-386706a0c0ed.png

Git是开源的分布式软件版本控制工具,用于管理软件开发过程中的变化

1741862734487-e2957b3a-9fed-4ef6-b257-7c3eb38d4ef1.png

应用场景:

1741862734501-22cd2fa2-d4dd-409f-a750-1290797bc465.png

1741862734688-f69d2131-cac1-4357-8dee-3633e79585c9.png

基本概念:

·远程长款:远端服务器上保存版本信息的仓库

·git仓库:git用来保存版本信息的本地仓库

·工作区:开发者的当前目录,可以提交变更到仓库

·暂存区:工作区与仓库之间的区域,开发者提交到仓库前必须先提交到暂存区

·分支:代码仓库中代码的一个副本

·检出:从本地git仓库提取出某个版本的内容到工作区

·获取:把远程仓库的修改更新到本地仓库,但是不会把修改检出到工作区

·拉取:把远程仓库的修改更新到本地仓,并检出到工作区

工作区文件修改提交到git仓库,需要通过暂存区中转,先添加文件到暂存区,再提交到git仓

1741862734476-ba38d8ff-c4a9-4379-942a-a766dacd396a.png1741862734495-b5595a4d-10e6-4cc4-9902-c5ddf7e3d6fc.png

git仓库就是开发者克隆下来的在本地PC的仓库

git本地工作空间包括 工作区 暂存区 git仓库

git仓库保存了所有的历史快照

工作区是对git仓库中项目的某个版本独立提取出来的内容,这些从git仓库压缩数据库中提取出来的文件,放在工作区供开发者使用和修改

暂存区保存了下次将要提交到git仓库的文件列表信息

远程仓库:一个git服务器,成为origin,与本地仓库一样,跟开发者的本地仓库平等

可以用来永久保存代码备份,也可以让其他开发者通过该仓库来协作

远程仓库与本地仓库区别:

1)提供URL方便远程访问代码仓库

2)提供SSH安全连接方式

基于git服务器创建的配置管理仓库有:

github gitlab、codehub、码云等

相关命令:

克隆远程仓库:git clone

将本地分支推送到远程仓库:git push

获取远程仓库更新:git fetch

拉取远程仓库更新并合并到本地分支:git pull

1741862736336-b89827bc-00d3-469a-ac50-ca0e9b672b38.png

创建Master分支:

在git中分支只是一个指针,Master分支拥有一个Master指针,指向Master分支的头部,其他分支也拥有自己的指针。HEAD指针代表当前工作目录指向分支

创建Hotfix分支

分支创建:从开发主线上分离开,不影响主线的同时继续工作,创建分支并不会进行物理靠北,只有修改分支的文件并提交,才会真正存储

分支切换:同一个工作目录下面,可以切换到同一仓库的不同分支;切换分支,就是修改HEAD指针指向,git会用该分支的最后提交的快照替换你的工作目录的内容

1741862736286-96443ca7-a619-4bf1-9067-0e6bf5345ea8.png

创建并切换到当前分支:git checkout -b

创建分支:git branch

切换分支:git switch

合并某分支到当前分支:git merge

删除分支:git branch -d

git工具:

git有命令行和图形界面两种方式,命令行是默认方式

图形界面有多种,如 TortoiseGit、SourceTree,SmartGit,GitEye,下面以TortoiseGit为主,其有中文语言包可以安装

1741862736321-70cda1bb-df6b-4177-b114-40f9ac87a001.png

克隆(命令行)

1741862736296-3f3d5a8e-dd4f-4942-93e4-0566d43bbe40.png

1741862736340-010ab425-6439-4fa4-97d9-44c2faac016a.png

1741862738465-43865881-e17b-43ae-8501-7623a7fb1745.png

1741862738642-1a8773e1-4f17-4c15-8a6c-b7ce01e2a72f.png

克隆(TortoiseGit)

1741862738529-45696ba3-6a06-439e-952b-a52449b80940.png

拉取(命令行)

1741862738493-1aa5d0c6-8922-4be3-854b-33f801102bd1.png

1741862738585-c50c97f7-f8f0-422a-af7b-0696f97a9c05.png1741862740393-aefc91cd-8de2-4f12-8a7e-31b292d7b076.png

1741862740513-89ac8024-4a97-4e0d-bd2e-42631c349a62.png

拉取(TortoiseGit)

1741862740487-08cde5dd-627f-4d05-a88e-46843cd16512.png

推送(命令行):将本地分支的修改推送到Git远程仓库

1741862740402-9ac654a8-f04b-440f-975c-ea179c86e08c.png1741862740457-272c1455-361c-40e8-9ab1-33da4856e2c8.png

1741862742454-02a6b999-54a6-498a-8e2e-533d641fc46e.png

1741862742466-ad778186-fe4e-47b8-a4fe-6a76b7e3b335.png

推送(TortoiseGit)

1741862742525-f06874b9-97dd-4e9c-ad0c-45e91396894f.png

合并(命令行):合并是一个分支的内容合入另一个分支

1741862742520-21fba7a6-ae41-42cc-82a9-82c0759c168a.png

1741862742578-6c6b8aa3-8784-4fa0-9a71-fcf512f6b808.png

1741862744803-d5d14157-87f8-4193-9480-492dff50384d.png

1741862744802-64de9751-2458-4229-8af7-5eda8e8d4b2b.png

合并(TortoiseGit)

1741862744856-df7f7b84-6eaf-4552-bd5f-9575002c9b3e.png

切换到hotfix分支,进行工作并提交到本地仓库

1741862744804-0814d77c-d2f8-4bed-bda8-11e22b87eeb7.png

切换回master分支,合并hotfix分支的修改

1741862744812-f4e274b1-bb28-4437-a8c3-f7662f8fb9b3.png

华为云的代码托管

1741862747162-b988f6f2-f4b3-418e-ade0-05267b7592ab.png

编码步骤

1741862747112-2ac55e8c-40e4-4bcd-a30f-4f25d5ebbca3.png

本地PC生成SSH密钥

1741862747121-41833843-8ae9-451d-a737-f7cc9ee2437f.png

1741862747124-e273d092-b7b3-4070-bdd0-99ab2aa39268.png

1741862747067-522fe9c8-f621-4dfe-bfca-b125c03078c1.png

创建项目:华为云代码托管服务依赖项目管理服务,使用前开通项目管理服务

1741862749682-341188d4-6c2c-4928-b9c8-281dc881174b.png

添加SSH公钥:

1741862749758-528cd6d1-a6cc-4d70-b932-f107441fb110.png

设置HTTPS密码:

1741862749697-ed0d7e0a-0e99-4d80-b087-1e8417bd5cfa.png

创建代码仓:

1741862749703-7d2edc09-d97c-47ff-b375-ee0872d96c72.png

克隆到本地:

1741862749710-437e6fc9-44c3-49b3-bf1d-f931266f2887.png

云端管理代码:

1741862752592-79a0fdfa-94b6-4b27-a96d-0c4b3f848d64.png

Git安装:双击运行安装包,在弹出的窗口一次单击下一步(NEXT),最后点击安装(INSTALL)完成安装

1741862752538-a623b1fb-2167-400c-b96a-86299b8f9f60.png

1741862752605-8206bfec-e36e-4217-be65-5af6d1f215d7.png

路径根据自身需求

GIT配置:

在“开始”搜索栏中搜索 git bash 打开命令行终端

输入以下命令行创建用户

1741862752534-7e2b11ed-6b54-4c0a-950f-5a4f444b8d22.png

1741862752543-388c6177-888c-4699-a5b7-4f2ec2e133b1.png

配置好后可以用 git config -l查看配置

生成SSH密钥,用以和Git远程仓库服务端进行鉴权认证:

ssh-keygen -t rsa -C “<您的邮箱>”

然后输入3个回车即可,密钥保存在“~/.ssh/id_rsa、~/.ssh/id_rsa.pub”

1741862755580-bb279b68-821e-4ef0-ac54-92a81ce4c404.png

1741862755521-b68792df-46dc-4b7d-8c9f-2c28f4f2d119.png

1741862755513-ded1f07b-2830-429a-812e-7b2dcaca8ce6.png

TortoiseGit安装:需要先安装Git才能运行

安装程序与中文包见附件

1741862755511-96c3a2bd-250a-42ff-9333-338289f49477.png

按照默认设置安装程序

中文包安装

1741862755548-523b8bf8-acab-49fb-855e-8ee034a7cafd.png

1741862758988-dba18984-ca1c-4596-ba1f-347c075a4115.png

安装之后在TortoiseGit右键菜单常规设置中,语言栏有English和中文

配置:Tortoise也需要一个密钥和代码托管服务端进行鉴权认证,之前在Git bash中已经生成了密钥,将TortoiseGit设置的Network选项中的SSH client修改成Git安装目录下的ssh.exe 即可使用Git bash生成的SSH密钥

1741862758893-81c296be-5d05-4c96-8f38-00b4147acc94.png

操作方式在上述内容中已经讲解

创建本地Git库

1741862758859-c1d19f15-26e9-466a-8303-ddebfdeb2a2a.png

使用git init命令将该文件夹转换成git可以管理的仓库

1741862758868-f32d2329-7493-4211-96c9-70be85316493.png

执行命令后 Git仓库就创建好了,是一个空仓库,在原先的空文件夹下多了一个.git文件夹,用来跟踪管理版本库的

1741862758888-82418160-0346-4c5e-bf8f-a86fa2e50b5f.png

提交修改到本地Git仓库

编写一个read.txt文件输入 this is a git repository,添加到git仓库

使用git status 可以查看git仓库状态

1741862761999-cb368115-3a3f-426c-bf5f-4518c4a9cba1.png

Untracked files 表示还没有被Git跟踪的文件,使用git add命令将文件添加到暂存区

1741862762027-c7ea915f-7449-4d7c-9f6d-3b015bc865f7.png

继续使用git status查看git仓库状态

1741862762032-d22e57de-cc9a-44fc-aba2-0982931da380.png

changes to be commited表示待提交

new file 表示新增文件

使用git commit提交修改

1741862762002-0b2594cf-8abb-4f58-9396-019ce9c20a2a.png

-m表示本次提交说明,这样方便地从历史记录里找到这次提交记录

查看历史提交记录

1741862762015-c379f0e2-7432-45b5-b4e1-fc1773d16578.png

–pretty=oneline表示一行显示一条历史记录

1741862765491-d2102418-3ca1-4d2b-9de8-b19b1e38ff18.png

更多信息参考Git – Viewing the Commit History


创建分支

使用git branch创建feature的分支并新增功能

1741862765517-2f4e4cb0-6fc0-492b-887a-6fa5278b0484.png

创建分支然后使用switch切换到分支

1741862765491-a3aba670-70af-4606-b88f-5ca843c2565a.png

在命令行中显示已经切换到该分支

在分支中新增一个helloworld.md文件,代表新增功能

1741862765483-497de3a7-8e05-4737-945b-1945dad6eef4.png

可以看到在feature分支下创建了一个新文件

1741862765476-5e42966a-0a02-4a87-b4d2-3d8a4383fecf.png

合并分支

切换回master分支

合并feature分支

git merge输出显示,新增了一个文件

1741862769012-6df85cb8-e094-4d5d-ab67-16ef536f4eba.png

制造冲突

冲突是合并中可能的情况,合入分支和被合入分支同时对某一文件进行修改,合并这两个分支时,有可能会产生冲突而导致无法合并,这时需要解决冲突

切换到feature分支,对helloworld.md文件修改后提交到git

1741862768976-3ef878f8-543d-482b-ad79-fab9318f67c5.png

1741862769003-90c5c2ae-d804-4c07-99eb-0920ea03459c.png

切换到master,对helloworld.md文件进行修改后提交到git

1741862768983-8b2bf970-67ea-4f1e-8854-3bbf02aaac8f.png

在master分支合入feature分支

1741862768961-226db155-86c8-48b5-9212-03d11a4f9ed9.png

CONFILCT表示冲突

这时在命令行显示有MERGING字段

1741862772240-ac0abbed-2c23-4958-b2a8-3545db5dd60b.png

解决冲突

使用git status查看产生冲突的文件

1741862772247-d6ff5e83-b58e-4e29-a297-e06a65c4b035.png

显示同时对helloworld.md文件进行了修改,需要打开冲突文件进行手动修改

vim helloworld.md

1741862772538-5e6e9e02-a24c-4bc9-8bc3-6e18dd8d58c3.png

1741862772274-5e13eff1-8658-41c8-8884-e8db55be789d.png

1741862772243-26337133-dcfe-45a3-a404-0b8cb997bd9f.png

重新添加到暂存区

输入git commit 然后在弹出的窗口输入:q 重新合入

1741862775727-5b1ec3a6-6fc3-4a58-a61a-a1cbc01d981b.png

使用git log 待–graph选项命令 查看分支合并过程

1741862775749-110abb43-a817-47f5-b027-71e660b54297.png

TortoiseGit图形化操作方式

使用TortoiseGit创建Git仓库,首先创建一个文件夹,并在下面创建一个.git文件夹,该文件夹是TortoiseGit创建的Git仓库所在文件夹,外层文件夹是本地工作空间,Git仓库会将文件检出到外层文件夹供开发人员编码工作

1741862775726-eaecbf20-62fe-4155-953a-5d20ce937367.png

在GitLearning文件夹内部空白处右键,单击 Git Create Repostitory here 点击OK

1741862775725-7169860c-76f3-4219-b766-26490aef00d8.png

1741862775743-6504efc4-56de-4f83-98ec-a1e394786b18.png

此时,外层文件夹图标有一个标志

1741862779331-2bf5749e-ec3c-4092-be2f-458d78710695.png

这是TortoiseGit显示状态的标志

之前创建的.git文件夹已经变成透明状态,并且TortoiseGit在其内部生成了一些文件,并将该文件夹初始化为Git仓库

1741862779295-a0cad1d1-5ab1-4f7c-be90-d9b69092481f.png

在GitLearning文件夹下,用记事本创建文件夹,输入This is a Git Repository

1741862779291-c324b2db-48ec-4ab7-b111-7b9e6ebbf70f.png

可以直观看出,read.txt没有被git管理,因为没有任何状态标识

在文件夹空白处右键单击Git commit

1741862779283-922e5822-46fc-4dbc-983a-e73c4f47e4d9.png

1741862779300-8b4e85e0-a19b-4280-abfa-f16e3dde18cc.png

勾选新增文件,设置上传时间和用户,附带备注消息然后点击commit

1741862782822-c58555a4-8969-43af-915e-5f0bbeaa4d88.png

1741862782834-b1c6a89e-d70a-418c-8284-9dfddbf11771.png

查看历史提交记录

1741862782906-6547a249-8e14-4e86-b176-337d0535276b.png

1741862782825-2fc17f69-d9f0-47de-a2e4-fba1f750ecb2.png

创建分支

1741862782848-43bb91c9-d64d-41ab-8009-1a93b0c7739f.png

1741862786180-94c479ba-caaf-4b40-a12c-ca8e831187b2.png

1741862786213-01d0fb7f-dcb2-47f3-97c2-b1042f175d1b.png

创建一个文件提交到feature分支下

1741862786214-89e9d575-dd44-4155-b2b5-5d577fd08f46.png

1741862786291-1e4018f3-f122-43f0-bc25-948419ea3fcd.png

合并分支

切换分支回到master

1741862786206-63a2b132-c938-4740-bfd4-f2fe0ca742de.png

1741862789769-4b03a2e3-cc1f-42a2-8e15-48a62feae407.png

工作空间恢复了

1741862789766-ee701965-4f63-44a0-9727-c680c1613de6.png

1741862789785-ccbabfc6-afa0-4909-a9ae-cae4992859e1.png

合并分支

选择要合并的分支

1741862789795-bf14d2a3-c5e9-4371-936f-5feaec3a1c46.png

1741862789823-a3b1bd7f-f475-4547-81ed-547ee99f00e6.png

制造冲突:

切换到f分支对helloworld.md文件修改后提交到仓库

切换到m分支对helloworld.md文件修改后提交到仓库

f文件文本为:

Hello,World!

This is a feature branch.

m文件文本为:

Hello,World!

This is a master branch.

1741862793462-a837238f-5583-42ea-a804-c7f105c1bc42.png

合并分支制造冲突

在master分支上合并feature

1741862793486-bdb3a234-5e87-43a1-9f0e-a0fae1c7bbbd.png

1741862793484-5d018a0a-044c-41d7-b7ef-4bfb1c680b29.png

在resolve可以看到产生冲突的文件

1741862793464-94c428d7-a9e3-42f4-9bf9-7a54f45d0e0b.png

双击文件

1741862793482-c2e0c3d5-fb06-453c-8cf9-d846b8cf0c4f.png

1为feature分支文件内容,2为当前分支,3是文件合并内容,此时因为文件冲突需要手动合并,点击Mark as resolved然后关闭窗口,在文件夹空白区域右键点击Git commit 弹出

1741862797155-638d71e3-3404-4369-9f82-a57bb93b1128.png

1741862797167-d2776561-4136-4f6c-88fd-de819b230d76.png

查看历史记录

1741862797183-28725766-c5ed-4fcf-87c5-7a51609b72ed.png

华为云代码托管实践:

共建智能世界云底座-华为云

填写个人信息,进行实名认证

打开git bash客户端 查看SSH密钥

1741862797161-4c9fae7e-7cb7-4e00-8444-4919da8fbc83.png

打开https://devcloud.huaweicloud.com/codehub/home/

点击设置密钥

1741862797157-2cefdbf5-f21f-49ad-a9d3-3af8e983304b.png

添加密钥

1741862800766-b9b97e40-a2cc-43fa-a31a-46285cc5c112.png

设置HTTPS密码

1741862800670-076e50c1-9748-44c8-949e-0f62d1ca3a88.png

项目创建

1、进入Devcloud主页面,选择华北-北京四

1741862800674-aec76518-5104-4a36-9c29-3a69f059005e.png

2、新建Scrum项目-新建项目-Scrum-填写名称和描述

3、进入项目,此为工作区

切换到代码托管页面

菜单-代码-代码托管

1741862800673-ded4bcf8-196b-40a6-a09f-a18b6a529406.png

新建仓库-普通仓库

1741862800690-1831c0f7-8fc0-4a19-8e26-57815da7c209.png

新建的代码仓库只有一个自带的readme.md文件

本地git仓库与远程仓库交互

1、进入代码仓库,点击克隆/下载 复制SSH克隆地址

1741862804473-473503df-8f34-4796-9632-3034ad5e26ae.png

1741862804482-906a2a12-28e4-4100-a85e-842b5d0fbf22.png

1741862804469-343bcd4b-7a96-4d23-908e-bfc9cb6df927.png

git clone可以在仓库地址后加文件夹名称 表示本地文件夹

若加文件夹名称表示将远程仓库克隆到本地仓库的该文件夹下 不带参数的情况下,本地文件夹名称默认与远程仓库相同

推送

在本地新增功能推送到远程仓库

新增一个py文件

1741862804530-998a3444-e02c-432b-8034-3df45af73bf5.png

1741862804484-de3945a7-b2f1-48f0-9334-a102a54c263c.png

提交到本地仓库

1741862808309-16ee9ae6-3bf0-45b9-a148-fa3b2d48230c.png

1741862808322-97eb9538-c9a1-4750-8e0b-00bba560a4bc.png

1741862808323-d65a1b87-188c-4d40-b043-bb79387c084d.png

git push 推送 -f意为忽略版本强制推送

1741862808308-3b82d993-702d-48cf-93bf-04e7bc1ddd0f.png

更新

若有他人将新的py文件修改后推送到远程仓库,我们需要更新到本地

1741862808335-22b39337-252b-44c0-ad49-8ad9757bdea2.png

![]()

将修改后的helloworld.py提交到本地仓库,推送到远程仓库

1741862812228-249984ed-85e0-4bb4-80da-c946e3edbe59.png

1741862812241-d14fd87c-7de5-4634-9134-45c4f85dce1c.png

![]()

![]()

将开发人员B的推送拉取到本地

![]()

![]()

TortoiseGit操作与上述步骤基本机制,且图形化操作界面更为方便,如有不认识的可以多背单词:)

更新: 2025-03-13 18:47:11
原文: https://www.yuque.com/yuhui.net/network/evggfskhn6eshm0x



评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字

插入代码