Java笔记-----(14)版本控制工具Git

Git 是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

Git是一个优秀的版本控制管理工具,可以进行代码版本的管理,目前是市场上主流的版本管理工具。

Git的特点

分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的 Git 仓库。

从一般开发者的角度来看,git 有以下功能:
从服务器上克隆完整的 Git 仓库(包括代码和版本信息)到单机上、在自己的机器上根据不同的开发目的,创建分支,修改代码、在单机上自己创建的分支上提交代码、在单机上合并分支、把服务器上最新版的代码 fetch 下来,然后跟自己的主分支合并等。

优点:
适合分布式开发,强调个体。公共服务器压力和数据量都不会太大。速度快、灵活。任意两个开发者之间可以很容易的解决冲突。离线工作。

缺点:
资料少(起码中文资料很少)。学习周期相对而言比较长。不符合常规思维。代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

因其资料的公开性,导致大型商业化工程几乎不会使用 GIT 来托管工程版本信息(除非搭建企业私服)。

Git的工作原理

在这里插入图片描述

  • 工作区:也就是在我们本地的一个git仓库目录下,除了隐藏的.git文件之外的所有内容。(说白了,就是我们本地目录里边的内容)
  • 暂缓区(Stage)数据暂时存放的区域可在工作区和版本库之间进行数据交互
  • 版本库Git本地版本仓库,也就是.git目录下就是版本库。通过git push命令可以将本地的版本推送到远程仓库
  • 远程仓库:是我们在远程进行版本控制的仓库,比如GitLab或者GitHub等服务器上的仓库

相关重要概念示意图:
在这里插入图片描述

这是一个本地的git仓库目录,其中.git文件中是本地版本库,其余内容则是我们的工作区版本库内容如下所示:

在这里插入图片描述

本地版本库中存着分支版本等有效信息。最后,远程仓库就是我们git服务器上的一个仓库,我们找一个GitHub上的仓库地址如下:
https://github.com/chaohuangtianjie994/BlueTooth-AutoPair.git

Git仓库Demo演示

https://github.com 页面,我们点击New可以进入新建仓库的页面,填入如下的信息:
在这里插入图片描述

建立成功之后的页面如下所示:
在这里插入图片描述

接下来,我们打开一个本地目录,如下所示:
在这里插入图片描述

初始化本地仓库:git init

在这里插入图片描述

然后,我们添加一个文件README.txt,也就是我们的工作区添加了新的文件,然后进行add操作:git add

在这里插入图片描述

上图中,我们接着执行了git status命令,用于查看当前的状态,看到了当前有一个文件被提交到了暂缓区中,并且我们可以通过提示命令来撤销add操作。

接下来,我们执行git commit -m "first commit"来进行提交:

  • git commit –m “this is test”:将暂缓区中的内容提交到本地分支

在这里插入图片描述

初始化仓库的时候,我们通过git remote add origin “远程仓库地址” 来将本地仓库和远程仓库建立连接

最后,通过 git push origin master:master命令来将本地版本库中的文件推送到了远程的仓库中

在这里插入图片描述

执行到这里,你可能会遇到push的时候需要输入用户名和密码进行验证。没错,在使用git之前,我们需要进行设置:

  • 配置全局用户名:git config --global user.name "用户名"(跟踪是谁在修改提交)
  • 配置全局邮箱:git config --global user.email "邮箱"(多人开发间的沟通)

设置完信息之后,我们告诉了Git仓库,我们是谁。当然在提交的时候需要进行身份的验证,不过一般情况下,当我们使用HTTPS方式的Git地址可以输入用户名和密码进行验证。

如果你不想每次都输入用户名和密码,那么你可以使用SSH方式的Git地址,这样只需要生成并且保存你的密钥到Git仓库就可以直接推送代码啦。

远程仓库的SSH地址如下所示,我们可以自由切换:

在这里插入图片描述

Git常用命令

Git是一个优秀的版本控制工具。我们常用的命令如下:

在这里插入图片描述
在这里插入图片描述

  • git branch newBranch:在本地新建一个分支(newBranch)
  • git checkout newBranch:切换到你的新分支(newBranch)
  • git branch:查看当前的分支,可以看出当前处于哪个分支。
  • git branch –b newBranch:在本地新建分支(newBranch),并且切换过去(低版本Git不支持)

下来的命令,我们初始化仓库的时候已经进行了演示,这里直接给出作用:

  • git add ./:将改动提交到暂缓区中
  • git commit –m “this is test”:将暂缓区中的内容提交到本地分支
  • git push origin newBranch:将本地分支发布在远程仓库上

接下来,我们演示git pull和git merge 命令。

  • git pull origin master将远程master代码更新到本地当前分支

假设远程仓库现在比本地仓库要新,也就是有其余协作开发的同事推送到了远程仓库。这个时候,我们本地进行push会报错如下:
在这里插入图片描述

这个时候,我们需要执行git pull命令来更新本地仓库,再次推送,则成功。
在这里插入图片描述

  • git merge newBranch将本地newBranch分支代码合并到当前分支上

git merge可以将其余分支的内容merge到当前分支上。比如,我们在分支newBranch上创建了一个b.txt文件,需要merge到本地master上。

在这里插入图片描述
然后,我们切换到master上执行merge命令:

在这里插入图片描述

可以看到,远程master分支上也有了b.txt文件:
在这里插入图片描述

git pull origin master将远程master分支更新到本地master的时候,可能会存在冲突。那么,为什么会产生冲突呢?

冲突是因为git pull命令会从远程拉内容,并且合并到本地仓库的分支上,如果两个人都对同一个文件进行了修改,在合并的时候不可以自动选择应该以哪个版本为准,也就是产生了冲突,需要我们解决冲突,之后重新add-commit-push。举例如下:

在这里插入图片描述

当我们本地也修改了b.txt并且尝试push的时候会出错,如下所示:

在这里插入图片描述

这个时候,我们需要通过git pull 命令来更新本地仓库,然后就发生了冲突:
在这里插入图片描述

那么如何解决冲突呢?
git给出了明确的提示,需要我们去解决冲突,并且重新提交,我们打开b.txt,并且重新修改了该文件之后,重新提交即可

在这里插入图片描述
当然了,同样的道理,在merge的时候,遇到冲突,我们还是同样的解决办法。

接下来是删除分支的命令:

  • git branch -d newBranch:在本地删除一个分支

在这里插入图片描述

  • git push origin :Branch1:在github远程端删除一个分支 (分支名前的冒号表删除)

在这里插入图片描述

在这里插入图片描述

我们可以看到,远程仓库的newBranch分支已经被删除了:

在这里插入图片描述

fetch和push的区别

都是更新内容:

  • fetch
    抓取, 抓取远程的 head 信息。从远程仓库中下载 head 头信息的变更状态。没有下载真实的代码变化。
  • pull
    拉取,相当于先 fetch head 再 pull code。 先下载 head 头的变更,再根据头信息的变更下载真实的代码。
    通常直接 pull 即可

git reset --hard 和 --soft 的区别是啥?(重点掌握)

git中的版本重置命令

通过git log可以查看当前分支的commit_id提交记录。当我们想回退到某个版本的时候,可以采用git reset命令,之后通过git push origin branchName –f 命令来强制将当前分支push到远程仓库

  • –hard 表示将文件恢复到指定的版本,删除掉了所有的改动,包括工作区和暂缓区
  • –soft 则是将当前分支的HEAD指向指定的版本,并且把指定版本到重置之前的所有改动放入了暂缓区中,经常用来合并多个commit_id

这里进行一个简单的分析。首先,我们通过git log命令可以看到当前分支上的版本号commit_id,如下所示:

在这里插入图片描述

HEAD指向了我们最新的一个版本号,这个时候,我们突然发现版本3和版本4有问题,需要回退到版本2上,那么我们可以执行git reset --hard commit_id2,执行结束之后效果的示意图如下所示:

在这里插入图片描述

我们在实际的项目中,给大家演示:

在这里插入图片描述

reset之后,我们可以看到最新的两个版本不存在了,当前HEAD处于新的版本号上。
如果,我们现在又后悔了,想要reset回去,那么通过git reflog可以查看所有的版本号(包括刚刚干掉的版本号,保证git保存的数据不会丢失),然后再次reset即可回去。如下所示:
在这里插入图片描述

git reset 和 git revert 的区别是啥?(掌握)

答:git reset是通过回退HEAD来完成版本回退。git revert是生成了一次新的提交,新的提交和你想去掉的那次提交的内容刚好相反,本质上是一次新的提交,也就是HEAD继续向前进

解析:
git revert的意思是版本继续先后前进,当然commit_id4和commit_id3所做的操作刚刚相反。这种情况一般用于,我们只想去掉某一个坏的版本而不是去掉所有的版本

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值