Java笔记-----(14)版本控制工具Git
- Git的特点
- Git的工作原理
- Git仓库Demo演示
- Git常用命令
- fetch和push的区别
- git reset --hard 和 --soft 的区别是啥?(重点掌握)
- git reset 和 git revert 的区别是啥?(掌握)
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所做的操作刚刚相反。这种情况一般用于,我们只想去掉某一个坏的版本而不是去掉所有的版本。