Git
学生作者:吃饱饱坏蜀黍
日期:2023.6.17
GIt版本:2.41.0
IDEA配置Git篇:https://blog.csdn.net/a1978341673/article/details/131318939
Git介绍
Git 是一个分布式版本控制工具,通常用来对软件开发过程中的源代码文件进行管理。通过Git 仓库来存储和管理这些文件,Git 仓库分为两种:
本地仓库:开发人员自己电脑上的Git仓库
远程仓库:远程服务器上的Git仓库
- commit:提交将本地文件和版本信息保存到本地仓库
- push: 推送,将本地仓库文件和版本信息上传到远程仓库
- pull:拉取,将远程仓库文件和版本信息下载到本地仓库
从图我们可以将两个本地仓库当作负责同一个项目的两个不同开发人员,一个开发人员A可以将当前写好的代码部分上传到远程仓库中,另一个开发人员B则可以从远程仓库中下载所需的代码,B编写实现好相应的部分后可以再上传回本地仓库,这样开发人员A也可以从远程仓库下载下B所所完成的部分。
这个过程中远程仓库中会保留有每次上传部分的代码,这样开发人员A、B不管把代码写废了还是丢失了部分代码,都可以从远程仓库中重新下载,这项功能在实际的多人开发中非常有用,因为笔者有时候就经常把代码写废了……
Git 下载与安装
下载地址:https://git-scm.com/download
在Git官网中我们可以选择自己对应的操作系统版本即可,这里我们已Windows操作系统为例,进去后根据自己电脑操作系统位数,选择下载安装包即可。
下载好后,我们会获得下图的安装包。
之后点击运行即可,然后一直点击next即可进入到选择安装路径的界面上,之后咱们选择好自己想要安装的目录即可,后续的所有选择均让其默认即可,不需要修改,一直点击next就行。
判断我们是否安装成功,则看我们在桌面点击鼠标右键的时候看看弹出的选项框中是否有Git GUI Here、Git Bash Here,如果有则说明我们安装成功。
- Git GUI Here:打开Git 图形界面
- Git Bash Here:打开Git 命令行
Git 代码托管服务
常用的 Git 代码托管服务
Git中存在两种类型的仓库,即本地仓库和远程仓库。我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等
- gitHub( 地址: https://github.com/),是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯的版本库格式进行托管,故名gitHub,服务器在国外,因此国内访问速度较慢以及不稳定,解决方法是使用魔法进入
- 码云(地址: htps://gitee.com/),是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快
- GitLab (地址: https://about.gitlab.com/),是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
- BitBucket(地址: https://bitbucket.org/) ,是一家源代码托管网站,采用Mercurial和Git作为分布式版本控制系统,同时提供商业计划和免费账户
这里我们已码云gitee来举例测试,首先这里就需要我们自己去注册相应的gitee账户了,具体的注册我就不在这里操作了。
创建好账户后,我们创建一个仓库备用即可,点击新建仓库然后选择初始化仓库,其他的不用选择了默认即可,之后创建然后初始化即可。
这是我已经创建好的仓库,这里是演示创建仓库的的选择在哪。
这是创建仓库是的一些初始化设置,我们按照自己的需求填写仓库名称,路径会默认生成一个,如果不喜欢,那自己设置一个就可以,默认创建的仓库是私有的,后期可以设置公开开源,初始化仓库记得要选上,然后创建即可。
Git 常用命令
- Git 全局设置
- 获取 Git 仓库
- 工作区、暂存区、版本库 概念
- Git 工作区中文件的状态
- 本地仓库操作
- 远程仓库操作
- 分支操作
- 标签操作
Git全局设置
当安装Git后首先要做的事情是设置用户名称和empail地址。这是非常重要的,因为每次Git提交都会使用该用户信息,说白了就是每次上传的代码是谁上传的,表明身份的。
在Git 命令行中执行下面命令:
设置用户信息
- git config --global user.name"HuaiShuShu":
- git config --global user.email “HuaiShuShu@HuaiShuShu.cn"
其中里面中的config就是配置的意思,global是全局的意思,user.name则是用户名、user.email用户邮箱,后面的字符串就是我们自己设置的,邮箱地址也是我们随便写就行了,不是真实的邮箱地址,只是一个标识作用。
可以看到我们进行配置没有报错的话,那么我们就配置好了
查看配置信息
-
git config --list
我们可以在这里看到我们刚刚配置的全局用户信息,其他的很多都是Git自己的默认配置信息。
注意:上面设置的user.name和user.email并不是我们在注册码云账号时使用的用户名和邮箱,此处可以任意设置
获取Git 仓库
要使用Git对我们的代码进行版本控制,首先需要获得Git仓库。
获取Git仓库通常有两种方式:
- 在本地初始化一个Git仓库 (不常用)
- 从远程仓库克隆(常用)
因为在很多实际开发中我们都是直接从已经创建好的远程仓库中下载项目下来开发的,所以从本地初始化一个Git仓库这个不是经常中,当然我们学习阶段还是要实际操作一下有个印象的。
获取Git 仓库-在本地初始化Git仓库
执行步骤如下:
- 在任意目录下创建一个空目录(例如repo1) 作为我们的本地Git仓库
- 进入这个目录中,点击右键打开Git bash窗口
- 我们在命令行中执行git init命令进行初始化,执行完毕后我们可以看到我们的文件夹中多了一个.git文件夹,当有了这个.git文件后说明我们的仓库已经创建好了,这是一个隐藏的文件夹,如果看不到的小伙伴记得在开启查看隐藏文件。
获取Git 仓库-从远程仓库克隆
可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地命令形式: git clone [远程Git仓库地址
- 远程仓库的地址我们可以在我们前面创建好的仓库中点击克隆/下载这个按钮然后复制里面的地址即可,这样我们就拿到了我们远程仓库的地址了。
-
我们在一个不是仓库的文件夹中重新打开一个新的Git命令行,然后在里面运行这个命令git clone 远程仓库地址,接下来可能会出现让你输入gtiee的账号密码的情况,这是因为我们刚刚创建的仓库是私有的,所以需要账号密码验证,输入你自己的即可。
我们点击进去我们创建好的远程仓库就可以看到我们gitee仓库中的文件了,以及生成了一个.git文件。
这样就说明我们从远程仓库中拷贝下来的文件成功了。
工作区、暂存区、版本库 概念
**版本库:**前面看到的.git隐藏文件夹就是版本库,版本库中存储了很多配置信息、日志信息和文件版本信息等,我们平时在使用的时候这个.git文件不需要操作,这个时又Git自己维护的。
**工作区:**包含.git文件夹的目录就是工作区,也称为工作目录,主要用于存放开发的代码。
和我们.git文件夹同一级的区域的文件就是咱们的工作区。
暂存区:.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以叫做stage。暂存区是一个临时保存修改文件的地方
repo1文件
远程仓库下载下来的文件
我们可以发现在repo1中没有这个index暂存区的文件,这个是因为我们的repo1文件是我们通过本地创建的,里面没有文件,而我们从远程仓库中下载下来的文件,因为在gitee创建的时候就进行了仓库的初始化,里面有两个md文件,所以才会显示这个index,我们只需要在repo1文件夹中创建一个文件,然后在repo1文件中的git命令行执行git add *,这个命令,那么它就会显示有相应的这个index文件。
下图是我们工作区和缓冲区,以及版本库之间的关系了,我们在工作区创建文件后通过git add命令就可以把创建的文件添加到暂存区了,然后在执行git commit命令就可以将其提交到版本库中了。
Git工作区中文件的状态
Git工作区中的文件存在两种状态
- untracked未跟踪(未被纳入版本控制)tracked 已跟踪(被纳入版本控制)
- Unmodified 未修改状态
- Modified 已修改状态
- staged 已暂存状态
注意: 这些文件的状态会随着我们执行Git的命令发生变化
这里我们可以在repo1这个文件夹中创建一个测试的文件,这里我创建的是asd123.java这个文件,之后我们执行git add *这个命令,我们就可以将asd123.java这个文件添加进暂存区了,并且此时其已放去到Git管理了,我们执行git status这个指令就可以看到我们刚刚添加进去的asd123.java这个文件了。
当前的asd123.java文件的状态处于“staged ”已暂存状态,我们可以在创建一个qwe123.java文件进行对比,就可以看到看到其状态了。
因为我们后面创建的这个qwe123.java文件是没有添加进暂存区的,所以此时其的状态就是Unmodified 的状态,没有Git管理,所以没执行git add就是没进行git跟踪管理,执行后才进行了跟踪管理。
本地仓库操作
本地仓库常用命令如下:
- git status 查看文件状态
- git add 将文件的修改加入暂存区
- git reset 将暂存区的文件取消暂存或者是切换到指定版本
- git commit 将暂存区的文件修改提交到版本库
- git log 查看日志
git status:查看暂存区的文件状态
查看暂存区文件的状态,这个我们前面已经做过了,效果是一样的,就是查看一下而已。
git add:将文件添加到暂存区
这里我们可以执行git add * 或者 git add 文件名,我们可以看到我们刚刚将qwe123.java文件也添加进入暂存区了,git add的作用很明显。
git rest:取消暂存或切换版本
使用方式是git rest 文件名,这个就可以将相应的文件从暂存区中取消了,我们可以看到下图就是当我们执行git rest qwe123.java指令后,是没有提示信息的,如何查看是否执行成功需要我们再次执行git statue查看暂存就可以了,我们可以看到qwe123.java报红,状态已变为Untracked为跟踪状态。
git commit:将暂存区的文件修改提交到版本库
我们这里先使用$ git commit -m “init repo” asd123.java指令,将我们的asd123.java先提交到版本库中,然后在查看状态可以看到目前暂存区中是没有文件的,qwe123.java是因为前面我们使用了git rest将其移出了暂存区爆红。
这里的-m "…"里面的是注解提示,方便以后查看日志操作的。
此时的asd123.java文件处于Unmodified 为修改状态。
修改了asd123.java里的内容
再次使用git status指令,我们可以看到asd123.java文件前面多了一个modified已修改的状态,此时是因为我们没将其添加进暂存区什么才爆红的。
这里我们可以使用git add将其添加进去暂存区就不会爆红了,变成绿色代码已添加进暂存盘了,这里的qwe123.java也还处于爆红,所以我们也将其添加进入暂存区即可。
此时我们就可以执行操作将其二者都提交到版本库中去,因为前面的asd123.java是我们修改过的,所以这里需要使用-m "edit asd123.java"命令了,后面的qwe123.java直接提交到版本库中就可以了,其中还需要初始化一下qwe123.java文件
git log:查看日志
在前面演示的过程中,我们已经进行了多次操作,这些都会生成有相应的日志内容的,此时我们就可以通过git log命令来查看了。
此处应该还应该有一个init qwe123.java的操作日志的,但是没有显示,笔者也暂时没找到原因。
远程仓库操作
前面执行的命令操作都是针对的本地仓库,本节我们会学习关于远程仓库的一些操作,具体包括:
- git remote 查看远程仓库
- git remote add 添加远程仓库
- git clone 从远程仓库克降
- git pull 从远程仓库拉取
- git push 推送到远程仓库
git remote:查看远程仓库
这个是查看远程仓库的,这里我们可以看到我们前面创建的两个仓库中,repo1是我们在本地创建的,另一个是我们从gitee上克隆下来的,所以当我们在不同的路径下运行git remote命令,就可以看到不同的效果了。
本地创建的repo1仓库没有显示,因为它不是我们从远程仓库中克隆的,而我们的project-warehouse仓库是我们从远程仓库克隆下来的,所以其显示了origin,这个是远程仓库的简称。
这里我们在通过在其后面添加一个参数 -v 查看其具体路径。
git remote add:添加远程仓库
添加远程仓库,运行 git remote add 添加一个新的远程 Git 仓库,同时指定一个可以引用的简写,就是简称,这个我们可以自定义,但是我们通常都定义为origin,就是我们远程仓库的路径,这个路径得是真实存在的,因此我们需要在gitee上真实有这个仓库。
我们可以将我们前面创建的本地仓库repo1给添加上远程仓库,因此我们需要先在gitee上新建一个仓库repo1仓库,之后将其设置为开源。
通过克隆那个选择复制我们仓库repo1的地址,然后通过git remote add命令来为repo1本地仓库添加上远程仓库。
绑定上远程仓库后,这样我们的本地仓库repo1就可以和我们gitee上的远程仓库repo1进行交互了,可以把本地仓库中的文件推送到远程仓库中,也可以从远程仓库中拷贝文件下来。
git clone:从远程仓库克降
这个命令我们前面创建的project-warehouse仓库就是从远程仓库中拷贝下来的,使用的就是咱们的这个命令。
这里我们就在重新在仓库这个文件夹中新建一个qaz123这个空文件夹,然后在文件夹中打开git命令行,然后执行该命令,url地址使用的是gitee上我们刚刚创建的repo1这个仓库地址。
git push:推送到远程仓库
将本地仓库内容推送到远程仓库,可以使用命令: git push [remote-name] [branch-name]
这里的remote-name指的是我们前面remote add中我们自定义的那个远程仓库的简称origin,branch-name指的就是我们仓库中的分支master。
因为这里的test.txt文件是我们才刚创建的文件,在暂时还没有添加到暂存区中,所有需要先将其添加到暂存区中,然后才能进行推送。
我们执行到git commit命令的时候,这里只是将我们的test.txt添加到了本地仓库中,这里还没有添加到远程仓库。
所以还需要执行git push命令将当前本地仓库中的文件给推送到远程仓库中。
之后我们就可以再远程仓库中进行查看了。
当我们修改了本地的文件后,也是先提交到本地仓库中,然后在重新提交到远程仓库,才能在远程仓库中看到修改后的文件内容。
整体的流程就是先添加到本地仓库中,才能从本地仓库推送到远程仓库,一定是这个流程。
温馨提示
不是所有的远程仓库都是随意推送的,如果是公开开源的仓库,那么就可以直接推送,如果是私有的仓库,那么这个就需要我们进行身份验证了,如果是gitee的仓库,那么就是输入gitee的账户密码进行验证。
当我们进行过身份验证过后,那么我们的身份信息就会保存在Windows当中了,之后在推送就不需要进行身份验证了。
我们还需要注意的就是不是说我们添加了gitee账户就能够推送成功的,我们还需要是gitee中该远程仓库的成员,如果不是成员那么是没有权限进行推送的。
git pull:远程仓库操作- 从远程仓库拉取
git pull 命令的作用是从远程仓库获取最新版本并合并到本地仓库,命令格式: git pull [short-name] [branch-name]
这里的short-name、branch-name和我们前面的git push中是一样的,远程仓库的简称、分支名称。
**演示过程:**这里我们需要先准备两个文件夹来模拟两个开发人员,小白、小黑,来从远程数据库中拉取文件的过程,这两个文件夹我们创建的时候都是空的,然后我们使用gie clone命令从远程仓库中先远程仓库中先拷贝下来创建本地仓库,这样我们就模拟创建了小黑、小白的本地仓库了,然后可以检查一下是否都连接上了远程仓库,这些都是前期准备。
此时如果我们从远程仓库中使用git pull来取文件的话,那么就会出现如下图的提示:Already up to date.,翻译过来的意思是:这个已经是最新的了。
说明我们本地仓库的文件信息和远程仓库的文件是完全一样的,所以无法更新了。
所以我们可以先在小黑或者小白中创建一个文件,并随便先写一些内容,将其推送到远程仓库中,然后在从另一个人的本地仓库中执行git pull命令从远程仓库中拉取。
这里我选择使用小黑来创建文件并编写内容。
然后在小黑的本地仓库中打开命令行,将asd123.txt文件先添加在本地仓库,然后在将其推送到远程仓库中。
然后我们在gitee的helloworld仓库中刷新就可以看到我们刚刚提交上来的asd123.txt文件了,并且也可以看到里面的内容和提交时的注释。
之后我们再在小白那头执行git pull命令进行拉取就可以了。
拉取前
拉取后
这里我们可以看到命令行中提示更新的文件,asd123.txt
**注意:**如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错 (fatal: refusing to merge unrelated histories )解决此问题可以在git pull命令后加入参数–allow-unrelated-histories
现在较新的版本不需要添加–allow-unrelated-histories参数了,也不会报错。
分支操作
分支是Git 使用过程中非常重要的概念。使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线同一个仓库可以有多个分支,各个分支相互独立,互不干扰通过git init 命令创建本地仓库时默认会创建一个master分支。
这里我们讲述常见的分支命令如下:
- git branch 查看分支
- git branch [name] 创建分支
- git checkout [name] 切换分支
- git push [shortName] [name] 推送至远程仓库分支
- git merge [name] 合并分支
我们在gitee中可以看到可以看到我们前面创建的helloworld的仓库中可以看到有一个master的默认分支。
git branch:分支操作- 查看分支
- git branch 列出所有本地分支
- git branch -r 列出所有远程分支
- git branch -a 列出所有本地分支和远程分支
我们这个xiaohei文件夹是前面从gitee远程仓库中拷贝下来的,所以当我们使用git branch命令可以看到该本地仓库的分支,下面是所有branch的命令演示结果。
git branch [name]:创建分支
我们可以使用git branch来创建分支,其中我们创建了asd123、qwe123,这两个分支,我们通过git branch这个命令也确实可以看到我们创建成功了,但是为什么不是绿色的,这是因为git将我们当前使用的分支标识为了绿色,是为了区分而已,绿色代表当前所在的分支。
git checkout [name]:切换分支
我们可以使用该命令来实现在本地仓库中进行分支切换,当我们进行分支切换后,我们可以明显的看到我们本地仓库后面的分支名称也切换为了asd123,并且查看本地仓库的分支的时候也可以看到asd123被标识为了绿色。
git push [shortName] [name]:推送至远程仓库分支
当我们想要将本地仓库中的分支也在远程仓库中拥有,那么我们可以使用git push可以命令,其后面跟上远程仓库的别名和分支的名称即可。
我们可以在gitee远程仓库中查看到我们刚刚提交的asd123的分支,至于qwe123分支的推送方式是一样的,小伙伴们可以自己完成。
分支的作用
分支中的文件可以不同,而且在不同分支中创建的文件,在其他分支中不会显示,下面我们就演示一下分支的作用。
首先我们先在在master分支下创建一个master.txt文件,并在里面随便填写一些内容。
然后我们将其添加本地仓库并将其推送到远程仓库中,笔者这块打码了是因为笔者写错了…,笔者也在学习的过程中。
推送成功后我们可以在gitee仓库中看到我们刚刚更新的master.txt文件了。
当我们在gitee中跟换分支后,我们就会发送刚刚添加进来的master.txt文件没有了。
当我们在本地仓库中将分支切换成asd123.txt,我们也可以看到我们的文件夹中的master.txt文件也不见了。
然后我们在asd123分支下,我们也创建一个测试asd.txt并将其也推送到远程仓库中。
我们在gitee中的asd123分支中可以看到我们刚刚添加的文件。
然后我们在gitee中切换成master分支,发送没有我们刚刚添加的测试asd.txt文件。
从这个例子我们就可以看出来了分支的作用了,不同分支存放的文件不会共享,只能在各自的分支中查询。
git merge [name]:合并分支
合并分支命令格式: git merge [name],该命令的作用就是将分支进行合并。
在进行合并演示之前,我们先进入到master分支,前期提示我们的asd123分支下是有一个测试asd.txt文件的,我们需要做的就是将其合并,这样master分支下就可以看到这个文件了。
我们在该分支中执行git merge命令,将asd123分支和master分支进行合并,执行完操作我们可以看到我们本地仓库中master分支下可以看到多了一个测试asd.tx文件了,这说明我们的分支合并成功了。
此时只是asd123分支的文件在master分支中显示了,但是master的文件还是不会显示在asd123分支的。
老版本的Git在进行分支合并的过程中可能会出现进入如下图类型的命令行中,这里我们直接按ESC建,然后在输入 :wq 就可以了,然后按回车保存就行了。
合并时会出现的问题
当合并分支后,在两个分支中均对被合并的同一个文件进行修改,然后在合并的话会出现报错。
演示报错过程:
前面我们合并了asd123这个分支,然后测试asd.txt文件是合并后的共同文件,然后我们在master分支下修改测试asd.txt文件,并将其提交到本地仓库和推送到远程仓库中。
检查gitee中是否添加成功,这里我们是添加成功了。
我们再切换到asd123分支下对测试asd.txt文件进行修改,然后再保存到本地仓库并推送到远程仓库中。
检查gitee中是否添加成功,这里我们是添加成功了。
报错:CONFLICT (content): Merge conflict in 测试asd.txt
进行到这里我们已经在两个分支中进行了修改并推送到了远程仓库中,之后我们切换回master进行合并分支操作。
这里我们可以看到报错CONFLICT (content): Merge conflict in 测试asd.txt,这就是因为我们同时修改了同一个文件了同一个位置,比如一个地址,A开发人员修改了,B开发人员也修改了,那么合并时采用谁的为主呢,这就是一个问题了。
这里我们就可以手动将合并后的测试asd.txt文件进行修改,我们将多余的内容删掉,只保留我们需要的内容即可。
然后我们在将修改后的文件进行提交并推送就可以了。
但是在我们提交的过程中可能还会出现这个报错,这是因为我们只提交了测试asd.txt这个文件。
解决方法:
- 添加进入暂存使用 git add *,将所有的文件都添加进暂存区,之后执行git commit -m"手动修改" *,将所有文件添加到本地仓库。
- 在git commit -m “手动修改” 测试asd.txt 命令后面加一个-i。
这里我们演示的是在其末尾添加-i。
检查gitee仓库,是否正常推送。
标签操作
Git 中的标签,指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态比较有代表性的是人们会使用这个功能来标记发布结点(v1.0、v1.2等)。下面是mybatis-plus的标签
标签相关的命令:
- git tag 列出已有的标签
- git tag [name] 创建标签
- git push [shortName] [name]将标签推送至远程仓库
- git checkout -b [branch] [name]检出标签
git tag 列出已有的标签
列出已有的标签可以使用命令: git tag
因为当前我的这个仓库是没有标签的,所以没有显示标签。
git tag [name] 创建标签
创建一个标签。
git push [shortName] [name]将标签推送至远程仓库
将标签推送至远程仓库的命令格式: git push [shortName] [name]
shortName还是远程仓库别名,name为标签的名称。
然后我们就可以在gitee中看到我们刚刚添加的新标签了。
git checkout -b [branch] [name]检出标签
检出标签时需要新建一个分支来指向某个标签,检出标签的命令格式:
git checkout -b [branch] [name]
前期准备
我们可以在master分支的本地仓库中新建一个标签.txt文件,然后将其添加到本地仓库中,然后创建标签v0.2,并将标签推送到远程仓库中。
我们就可以在gitee中查看到我们刚刚推送的v0.2标签了。
演示过程
检出标签时需要新建一个分支来指向某个标签,检出标签的命令格式: git checkout -b [branch] [name]
我们使用git checkout -b [branch] [name]该命令进行检出标签,这里我们新建了一个b0.1分支来检出了v0.1标签,我们可以看到v0.1标签中是没有创建 标签.txt 文件,此时是标签v0.1的状态了。
我们在检出v0.2标签,新建一个b0.2分支,可以看到外面前面创建的 标签.txt 文件了,这是我们标签v0.2的时候的状态了。
强调说明
标签是记录的是本地仓库中某个标签创造标签时的状态,它是固定的,创建出来时该分支下是有什么,该标签就记录什么了。
感谢
这篇Git学习文章就写完了,这篇文章是笔者在2023.6.17完成的,这也说明笔者是这个时候学习完了Git的相关知识,很多地方都是跟着黑马的视频学习的,如果有不足之处望大家多多指导,谢谢。文章来源:https://www.toymoban.com/news/detail-755914.html
非常感谢大家的阅读,如有不足之处希望大家多多指导,谢谢。文章来源地址https://www.toymoban.com/news/detail-755914.html
到了这里,关于Git的介绍以及基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!