目录
一、基本介绍
1.1 版本控制
包括软件版本和文件版本,软件版本就是比较熟悉的VS,有很多版本,VS2022、VS2017。
文件版本就是对文件进行修改后,又产生了一个版本。多次修改,就是有很多个版本,例如text_v1、text_v2、text_v3。主要为了保存重要的历史纪录,一旦出现问题,可以恢复数据。
如果文件特别多,每一次都给他手动修改文件名,这时候就可以使用版本控制软件,它可以自动帮助我们完成版本号的生成。
1.2 版本控制软件的基础功能
(1)保存和管理文件
如果一份文件有3个版本,版本管理软件可以自动生成版本号,并且对这3个版本的文件进行保存。
(2)提供客户端工具进行访问
一份文件有3个版本,如果一个用户想直接访问这三个文件是不可以的,必须通过客户端工具,才能访问这3个文件。主要防止直接在这个文件上篡改。
(3)提供不同版本文件之间的比对功能
文件和文件之间的不同,通过版本控制工具完成的。
1.3 多人协作开发/集中式版本控制
有一台电脑存储所有文件,然后不同的人就可以同时访问中央服务器,体现了多人协作开发的功能。
如果一个人想要修改文件,首先需要将中央服务器的文件下载到本地,然后在本地进行操作,修改完成后,在把文件上传至中央服务器。
如果三个人都下载了文件,第一个用户修改文件之后,将文件上传到了中央服务器,第二个用户也将文件进行了修改,改完之后,也把文件上传至中央服务器后,就会把之前第一个用户的文件覆盖了。同理第三个用户更改完之后,会覆盖第一个和第二个用户修改的文件,这个就是文件冲突问题。
VSS应对这个文件冲突得的方法是对文件进行锁定,当没有人修改的时候,文件是没有上锁的,当第一个用户下载了文件之后,这个文件就被上锁了,第二个用户就无法对此第一个用户正在修改的文件进行修改。只有当第一用户将文件修改完成之后,上传至中央服务器,然后这个文件就会解锁。此时第二个用户就可以下载了,拿到的文件是最新的文件,也就是第一个用户修改之后的文件,那么第二个用户就可以在第一个用户的修改基础上修改了。
这种集中式版本控制超级麻烦,别人在修改的时候,你就不可以修改,效率非常低。后来出现了CVS和SVN这两个工具,也是没有解决文件冲突问题,但是可以规定一个文件不同部分由不同的人修改,例如用户1修改文件的第一行,用户2修改文件的第二行。当提交文件的时候,只需要对文件进行比对就可以了。具体就是三个用户都下载了一下这个文件,然后约束第一个人只更改第一行,第二个人更改第二行,第三个人更改第三行。然后上传的时候,第一个人修改的就会替换第一行,第二个人修改的就会替换第二行,第三个人修改的就会替换第三行。这个由版本控制工具完成,如果三个人同时对文件的同一处进行修改,还是会出现文件冲突问题,无法解决,只能人工控制。如果中央服务器坏了,那么就无法进行工作了,文件也会丢失。
1.4 分布式版本控制
除了中央服务器存储所有文件以外,在本地也有一个库,同样存储着文件。本质上这两个库是一样。
这个时候,用户还是通过客户端对文件进行访问,这时候访问的就不是中央服务器了,访问的是本地的库。这种分布式的好处在于,一旦中央服务器出现了问题一以后,用户还是可以通过本地的仓库工作,还是可以提交,只不过提交的不是中央服务器,提交的是本地仓库。当中央服务器恢复以后,将本地仓库和中央服务器的仓库进行同步即可。
总结:分布式不受网络和中央服务器的限制,而集中式控制受网络和服务器的限制。
二、Git安装
2.1下载git
进去之后点击DownLoad即可,选择自己电脑对应的版本。
同时,除了下载git以后,最好再点击GUI Client,下载一下GUI界面。将两个软件下载好以后,双击即可安装。
2.2 使用Github Desktop软件
2.2.1 创建本地仓库
打开这个软件之后,右边有4个选项
(1)创建一个历程库,用于学习的
(2)从网络上克隆一个仓库,这个意思就是从中央服务器上克隆仓库。
(3)创建一个本地仓库
(4)将本地已经存在的仓库田添加进来
如果登陆了github账号,那么软件的左边会展示你这个账号的github上面的仓库。
创建一个本地仓库:
(1)最上面的是仓库名字
(2) 第二个是对这个仓库的描述
(3)选择本地仓库路径,可以将下面的README也选上,也就是在创建仓库的时候自动创建一个RTEADME文件。
然后点击Create respository即可创建一个本地仓库。
创建完成后,即可看到仓库窗口了。
(1)文件操作状态区:主要保存文件的更改、删除等操作
(2)左下角区域用与将本地仓库传出至云端仓库
2.2.2 删除本地仓库
点击file->new repository在创建一个仓库,如果想删除仓库,可以右键仓库然后选择remov,这里可以将仓库从软件里移除,还可以直接删除仓库,删除的仓库回收站里边有。
默认是不删除文件夹里的仓库的,只是从软件里删除了。
同时可以直接拖拽一个仓库到软件里,会自动识别是一个仓库,点击添加即可。
2.2.3 仓库文件操作
创建文件提交:在仓库文件夹里边,创建一个新文件a.text,在这个文件里写入4个A,然后关闭文件,即可看到软件自动识别到了新创建的文件,还有文件里更改的部分。软件只能动态识别仓库路径里的文件,不在仓库路径下的文件是不能动态识别的。
创建的文件不是直接在本地仓库里边的,本地仓库的文件夹实际是维护在.git文件夹下面的。刚才创建文件的路径是操作文件的路径,和本地仓库路径是两个完全不同的路径。
而既然是两个完全不同的路径,软件可以动态识别更改,就是比对功能。 当创建一个新文件后,操作路径有了文件,但是本地仓库里边是没有这个新文件的,这时候比对功能就可以发现这个新创建的文件。
而如果想把这个文件存储到本地仓库路径下,就需要提交,称为commit。在软件的左下角进行操作。
测试提交以后,发现软件就变化了,没有变化的文件了。
提交以后,本地仓库里的文件和操作路径下的文件是相同的,比对之后也就没有文件修改了。
修改文件提交:这个时候本地仓库里边已经有了两个文件,一个是a.text,另一个是c.text.如果这时候更改c.text文件,在里面添加4个c,这时候软件软件又会自动识别到更改,然后添加描述后,再次体提交。
之前是仓库没有文件,直接添加文件。这次是有这个文件,更改文件内容。仓库里有一个旧版本的使用黑色表示,新版本的使用橙色表示。
提交完成后,仓库里会存储两个版本的文件,一个是橙色的,一个是黑色的。对应本地仓库也就是两个版本号。提交之后也就是下图。
版本号: 版本号git使用40个16进制的数字表示,也称为提交码,在软件的history里边可以看到。通过版本号也可以找到文件更改信息,去.git文件夹下的object里边找。
文件删除: 将操作空间里边的C.text文件删除,可以看到软件再次发现变化,显示c.text文件被删除了。
删除文件之后,再次向本地仓库提交,因为本地仓库是办保存所有版本的,即使是删除文件也要进行提交。提交完成之后,变化又变成0了。同时本地仓库里边保存了一个删除文件测版本,也就是第三个版本了。如果再创建一个文件,软件还是会识别。
2.2.4 多人协作
如果三个人分别开发不同的功能,有一个工程仓库,里边存储了这个工程的所有文件,在开发过程中,三个人随时可以上传自己修改的文件,这样就会出现很多个版本,提交顺序非常乱。同时三个人可能同时修改同一个文件,出现文件冲突问题。而且频繁的提交会出现非常多的版本信息,容量就会变大,比对的时候效率就会变慢。
为了解决上面这些问题,git提供了一个分支的功能,分支就是当前仓库的一个副本,可以在副本上进行操作。最后将每个人的分支进行合并,最后可能还是会有文件冲突,因为最后每个人只提交一个版本,只需要解决一次冲突即可。
2.2.4.1 分支创建
假设王五为项目经理,只负责维护这个项目的工程库,张三和李四都是开发人员,首先这两个开发人员分别开一个分支,也就是拷贝一个项目工程库,然后在自己的分支上不算提交,最后将分支合并,都合并到王五这个分支上。
演示:首先创建一个新的版本库,创建完成之后,可以看到,最开始就有一个分支,叫做main分支,可以右键对main进行改名,这个main也可以在option->git里边设置。
点击上方的New branch即可创建新的分支,这里创建两个分支,一个是user,一个是order分支,创建完即可在软件中看到。√号表示当前软件对哪个分支进行操作。
首先操作user分支,点击show in holder,进入user分支,然后创建新的user.text文件,更改这个文件。然后使用软件提交到user分支上。然后切换到order分支上,然后点击show in holder发现,文件夹里没有刚才创建的user.text文件。这是因为切换之后,文件夹里保存的就是对应分支的库。
然后切换到order分支里面,创建一个文件叫order.text文件,然后提交到order分支上。这时候order分支库里就有一个order文件了。切换到user分支,文件夹里就是user文件。切换到main分支,文件夹里啥也没有。
2.2.4.2 分支合并
将user和order分支都合并到main分支上,选择最下面的合并按钮即可。这里注意你要往哪个分支上合并,就选择哪个分支,我要往main分支上合并,所以选择main。
点击完选择合并按钮后,对要合并的分支进行选择,这里向把user合并到main,所以选择user,下方会出现提示,提示from user into main 。
在分支合并过程中,碰到了同样的文件。这里首先在user分支里创建一个common.text文件,然后对user分支进行提交,提交完成后把user分支合并到main分支上,此时main分支的文件夹里就多了common.text文件了。
这时候再将order分支合并到main分支上的时候,软件会提示有文件冲突。
然后点击创建合并提交,会弹出解决冲突文件,这时候进入默认编辑器进行处理冲突文件,
打开文件之后,发现里边有一个HEAD,表示此文件所在分支,下面的是此份之下存的值,下面还有一个order,表示order分支下存储的值。进行修改。
修改后的,将两个都保存。
修改完成后软件自动检测到,冲突已经解决,然后再点击合并即可解决冲突文件的合并。
2.2.4.3 标签
进行分支合并的时候,是软件自动完成的,没有写描述,可以在历史记录上添加标签。
添加完标签以后,即可看到标签显示在合并分支的旁边。 同时删除标签也是右键,删除tag。
2.2.5 远程仓库
2.2.5.1 创建远程github仓库
登陆github账号以后,点击New即可创建新的仓库,在弹出的窗口里,需要对如下下图红框里边内容进行设置,首先是仓库名字,然后是对仓库的描述,设置仓库是公开的还是私密的,选择是否创建仓库的时候添加README文件。
创建好一个新仓库后,就可以看到一个main分支了,同时有Add File按钮,点击之后,可以选择直接添加文件,或者上传文件。
这里演示一下直接创建文件。
需要对添加的文件名字进行设置,然后点击右上角的提交,会弹出来一个窗口,对提交进行描述,然后点击commit按键即可向仓库提交,同时仓库中可以看到新的文件。
提交完成之后,仓库也会出现一个提交码,类似于版本号。
github支持在线更改文件,点击要更改的文件,然后选择右边的铅笔,更改完之后,再次提交。
提交完成之后,可以在History里边看历史版本。
2.2.5.2 创建分支
点击branch按钮,即可进入分支。
点击New branch按钮,即可创建新的分支。填写完分支名字以后,点击创建新的分支,即可发现出现了两个分支。这个操作跟本地操作是一样的。
2.2.5.3 下载远程仓库
点击file里的clone仓库按键
在下载的远程仓库文件夹里边,创建一个a.test文件,然后按之前一样,进行本地提交。远程仓库并没有这个文件,点击push操作,将本地仓库提交到远端仓库。
2.2.5.3 创建远程gitee仓库
登陆gitee账号,在活跃仓库里边点击新建,然后填写仓库信息即可完成创建。
新建好仓库以后,使用软件克隆gitee远端仓库。首先点击克隆/下载,复制HTTPS地址 。
在软件克隆下载里边选择URL,将复制的地址输入进入。
克隆完成之后,操作跟github一样,创建一个a.text文件,更改里边内容,然后提交到本地仓库,再推送到gitee远端仓库即可。
2.2.6 README文件
在创建仓库的时候,可以选择初始化一个README文件,这个README文件一般存储在仓库的根目录下,用于对仓库进行描述。
2.2.7 忽略文件
在创建仓库的时候,有一个选项就是忽略文件,里边可以选择在比对的时候,不参与比对的文件。
可以在创建仓库的时候,不选择忽略文件选项,后面在比对的时候,通过对想忽略文件右键,添加忽略即可。这里使用NotePad++,在设置里边开启简单备份功能,每当更改的时候,会在目录里出现一个.bak文件。创建一个a.text文件,并且更改会产生一个a.bak文件,这个文件同样会被比对,在软件里显示出来。
这个备份问文件是没有用的,不希望存储当仓库里边,就使用忽略功能。
在比对发现文件更改时,选择想要忽略的文件,右键添加到忽略文件中,也就是只把a.txt.bak文件添加到忽略文件中了。
这时候再创建一个b.text文件,然后更改,发现此时b.txt.bak文件还是被比对了,如果想让所有的备份文件都忽略,可以右键选择将所有的.bak文件都添加到忽略文件中。
补充:比对功能只针对文本文件,例如像word、压缩包这种文件,不能比对变化了什么,只能发现更改了。
2.2.8 多文件同时修改
在一个仓库已经有a.text和b.text文件的基础上,删除a.text,修改b.text,创建c.text文件,可以发现比对时会标注不同。对a文件标注红色,表示删除了,对b文件标注黄色,表示更改了,对c文件标注绿色,表示增加了。
除了直接显示文件的操作以外,在比对文件有一行比对信息,其中-1,表示旧的文件,后面的2表示,从旧的文件的第二行开始变化。+1表示新的文件,后面的4表示新文件变化到第四行。
这个红色部分就是原来的,绿色就是后来的,4表示到第四行都变化了,3表示到新文件的第三行
2.2.9 版本号
版本号是40位的,通过特殊的公式计算出来的。通过版本号可以避免在合并的时候出现文件冲突,还可以通过版本号定位文件,版本号由2 + 38组成,在.git文件夹下的object文件夹下找到前两位的文件夹。
直接打开这个文件是看不了的,需要使用git自带的命令查看。正常文件应该是右边绿色的,但是直接 使用记事本打开是乱码的。
在仓库文件夹选择 Git Bash here
在命令行输入命令即可查看。
git cat-file -p 版本号
可是看到的并不是我们想要的内容,提示了一个tree,后面还有一个版本号,继续查看这个文件。
查看这个版本号文件之后,又弹出来一个版本号,继续查看。
这个时候即可看到我们想看的内容。也就说git在提交一次之后,会保存多个内容,所以需要查看多次。
增加文件:一个版本号里边存着多个信息。
修改文件:会多一个a.text文件的版本号
删除文件:将a.text文件删除,提交信息还是会保存上一次的提交版本号,但是文件状态不会保存删除的文件了,因为这个版本删除了文件。删除文件并没有把文件真正删除,只是文件没有关联。
2.2.10 分支存储
提交信息里边只存储了关联状态,那么软件是怎么知道版本顺序的?
1、在.git里边有一个HEAD的文件,这个里边存储的是一个路径
2、按这个路径可以再找到一个文件,叫做main文件,这个文件里边存储一个版本号,这个版本号就是最新的文件的版本号。
因为现在只有一个分支,就是main分支,如果再创建一个分支user,即可看到这个路径下出现两个文件,一个main,一个是user。
此时软件里边选择的是user分支,也就是软件操作的是user分支,此时HEAD文件自动更改为了user文件的路径。
这个HEAD文件是随操作软件里边的分支更改的。
更创建完user的时候,user和main里边存储的是相同的版本号,因为是同一份提交信息。
当user里边再次提交信息,就会再创建一个新的提交信息,然后user就会存储新提交的版本号。
并没有产生新的仓库,只是再不同的分支中引用不同的提交信息。
那么为啥不同分支显示不同的文件?
因为不同分支指向的提交文件不同,比如两个分支,可能指向不同的提交状态文件,而不同的提交状态文件可能包含不同的文件。所以在切换分支的时候,软件对读取分支指向的提交状态文件,来取出不同的文件。
2.2.11 暂存区、工作区、存储区
工作区就是我们操作的文件夹,暂存区就是进行比对操作的,存储区就是仓库了。
当在工作区修改一个文件后,如果想进行比对,需要将想比对的文件添加到暂存区,使用git add指令即可,当然想忽略的文件就不需要添加到暂存区了。比对完成以后,如果想存储到仓库里边,需要进行提交,使用git commit指令即可完成提交。
三、git 常用命令
git仓库分为本地仓库和云端仓库,云端仓库常用的就是gitee和github,通过克隆可以将云端仓库下载到本地,通过发布可以将本地仓库发布至云端仓库。本地仓库分为三个区域,一个是工作区,用于编辑文件的,第二个是暂存区,用于比对文件的,第三个是存储区,用于存储文件的。 工作区文件通过git add 添加到暂存区,暂存区比对完成后,通过git commit 提交到存储区。如果本地仓库如果发生了变化,可以通过push操作推送到云端,同时如果云端文件发生了改变,通过pull可以将远端文件拉去到本地。软件里都是通过红框来进行pull 和 push,如果本地更改了,云端也更改了,在你push推送的时候,它就会给你报文件冲突,这时候你就必须处理文件冲突才能上传。
3.1 产看git 版本命令
创建一个仓库文件夹,右键即可看到Git Bash Here 按键,输入git -v回车
git -v
3.2 创建仓库命令
3.2.1 创建本地仓库
手动创建一个文件夹,用于作为库文件夹。输入git init 即可创建一个本地仓库。注意使用这个命令,并不会自动进行初始化提交,只会创建一个主分支master,所以.git文件夹下面的HEAD文件只有一个master路径,但是这个路径里边是空的。而使用软件创建仓库会自动进行初始化提交。
git init
3.2.2 克隆远端仓库
使用gitee在创建一个远端仓库,然后复制Http地址,使用git clone克隆远端仓库到本地。
git clone 远端仓库地址
如果不想个远端仓库文件夹名字一样 可以在网址后面加上自己定义的名字
git clone 远端仓库网址 自定义仓库名字
在clone过程中可能问你要gitee账号和密码,正常输入就可以,也可以使用账号和私人令牌,私人令牌在gitee个人主页可以领取。
克隆完成后,发现HEAD文件里保存的路径里的文件,里边存储的版本号和官网的最新版本号是一样的,也就是说将整个仓库都下载下来了。
3.3 git用户名和邮箱配置
git在操作仓库的时候,需要有一个有户名和邮箱,通过git config命令进行配置即可,配置好用户名和邮箱即可在.git文件夹下的config里边看到,也可以直接在这里边改。当然这只是更改了一个仓库的配置,如果多个仓库需要都配置一边,比较麻烦,可以使用参数--global进行全局配置,这个直接对C盘用户目录下的.gitconfig进行配置。如果使用的软件可以在option里边更改,或者在仓库设置里边更改。
配置用户名:
git config user.name 用户名
配置用户邮箱:
git config user.email 用户邮箱
配置全局用户名:
git config --global user.name 用户名
配置全局用户邮箱:
git config -global user.email 用户邮箱
3.4 产看仓库状态命令
使用git status命令即可查看仓库分支、提交状态。
git statue
3.5 向暂存区添加文件命令
在仓库工作区新建一个文件,再使用git status可以看到显示有一个文件是没有追踪到,这个和直接把仓库拖拽到软件里,软件也显示有一个文件没有追踪是一样的。
使用git add命令将想比对的文件,使用git status即可产看到暂存区已经有一个暂存文件了。
向暂存区添加文件:
git add 要对比的文件
git add *.txt #将所有的txt文件都放到暂存区
从暂存区删除文件:
git rm -cached 要放回工作区的文件
3.6 提交命令
将暂存区的文件提交到存储区,使用git commit命令,其中-m 后面接消息信息
git commit -m 描述信息
3.7 查看提交信息
查看历史提交信息,使用git log命令,会在控制台打印出历史的提交信息。如果感觉看着太乱了,可以使用--oneline命令,让消息显示在一行。
git log
git log --oneline #显示在一行
3.8 恢复删除文件命令
3.8.1 删除文件没有提交
如果是误删除了某一个文件,使用git restore命令即可恢复。
git restore 要恢复文件名
3.8.1 删除文件已经提交了
1、可以使用git reset 命令恢复,同时要加上--hard参数。恢复完成后,再次查看提交信息,发现删除文件的提交信息也被删除了。
git reset --hard 要恢复的版本号
2、使用git revert命令进行提交,这个后面接的版本号是要恢复到这个提交版本号之前的操作。
git revert 要恢复版本号之前操作的版本号
3.9 分支命令
在使用命令行初始化一个仓库后,如果直接进行分支操作,会报错,因为命令行初始化仓库不会提交初始化,而分支操作必须在分支基础上才行。所以需要先提交再创建分支。
创建分支:
git branch 分支名字
查看分支:
git branch -v
切换分支:
git checkout 切换到哪个分支名
创建分支同时切换分支:
git checkout -b 要创建的分支名字
删除分支:
git checkout -d 要删除的分支名字
合并分支:
如果有两个分支,一个是master分支,另一个是oder分支,master分支和order分支都有一个a.text文件,在order分支里边更改了a.text文件,然后想把order分支合并到master分支上,首先需要使用git checkout命令切换到master分支上,然后使用git merge命令合并分支。然后会提示有文件冲突,显示为merging中,这时候直接打开冲突文件,进行修改,然后再次add commit即可。
注意:只有两个分支同时修改了同一部分才会出现冲突。
合并分支命令:
git merge 要合并的分支名字
3.10 标签命令
通过git log查看提交信息的时候,版本号非常长,看起来比较麻烦,可以通过git tag命令给某一次提交添加标签,然后可以直接通过git log 标签名查看提交状态。
添加标签:
git tag 标签名字 版本号
查看所有标签:
git tag
通过标签查看提交信息:
git log 标签名字
删除标签:
git tag -d 标签名字
通标签进行分支创建:
git checkout -b 标签名字
3.11 远程仓库操作命令
在仓库的.git文件夹下里边的config文件里,有一个remote,就是表示远程仓库的。可以使用remote后面的名字代表远程仓库,而里边的url就是远程仓库的地址。可能有的仓库不提供HTTP地址,提供SSH地址,直接把SSH地址复制到URL上边。
如果config里边没有remote,说明是一个本地仓库,可以通过命令添加
git remote add 名称 仓库地址
删除一个远程:
git remote remove 远程名字
更改名字:
git remote rename 新名字
更新远端仓库:将本地仓库推送到远端
git push 远端名字
如果是SSH连接会报错,显示权限不对,这时候需要生成SSH密钥
ssh-keygen -t rsa -C SSH仓库地址
然后一直回车即可,最后密钥文件会生成在C盘用户目录下.ssh文件夹下,有一个.pub的文件,把里边内容全部复制,进入gitee仓库,在个人主页设置里边点生成SSH密钥,把复制的内容添加进进去即可。
添加完SSH密钥以后,再次执行git push命令即可推送到远端仓库。
更新本地仓库:远端仓库内容发生更改,需要更新本地仓库
git pull 远端名字
四、总结
1、本博客对应B站视频
尚硅谷新版Git快速入门(3h迅速掌握git)_哔哩哔哩_bilibili
2、推荐一个git学习网站
最后,如果有任何问题可随时联系我,有侵权立马删除!