1.Git概述

Git是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目。Git易于学习,占地面积小,性能极快。它具有廉价的本地库、方便的暂存区域和多个工作流分支等特性,其性能优于Subversion、CVS、Perforce和ClearCase等版本工具。

版本控制:是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。其最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。

集中式版本控制:诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或者提交更新。

  • 优点:每个人都可以在一定程度上看到项目中的其它人正在做些什么,而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
  • 缺点:中央服务器的单点故障问题,如果服务器死机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。

分布式版本控制:诸如Git、Mercurial等,客户端提取的不是最新版本的文件快照,而是把代码仓库完整地镜像下来(本地库),这样任何一处协同工作用的文件发送故障,事后都可以用其它客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。

分布式版本控制系统解决了集中式版本控制系统的缺陷:

  • 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
  • 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全)

Git工作机制:

代码托管中心:是基于网络服务器的远程代码仓库,一般简单称为远程库

  • 局域网:GitLab
  • 互联网:GitHub(外网)、Gitee码云(国内网站)

2.Git操作

常用命令

命令名称 作用
git config –global user.name 用户名 设置用户签名
git config –global user.email 邮箱 设置用户签名
git init 初始化本地库
git status 查看本地库状态
git add 文件名 添加到暂存区
git commit -m “日志信息”文件名 提交到本地库
git reflog 查看历史记录
git reset –hard 版本号 版本穿梭

设置用户签名

基本语法:

  • git config --global user.name lxx
  • git config --global user.email 2235221711@qq.com

查看:在C:\Users\PC目录下的文件.gitconfig里面查看

作用:区分不同操作者身份,用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的(Git首次安装必须设置一下用户签名,否则无法提交代码)。

注意:这里设置的用户签名和将来登录Github(或其它代码托管中心)的账号没有任何关系。

本地库操作

1.初始化本地库

首先需要选择一个仓库目录,这里使用目录C:\study\git_study\git_demo作为工作区,在该目录下打开git bash。

基本语法:

  • git init

结果:在该目录下会生成一个.git文件夹

2.查看本地库状态

基本语法:

  • git status

解释:

  • On branch master:当前本地库在master分支里面
  • No commits yet:当前没有提交过内容(还是空的git库)
  • nothing to commit:当前没有什么可以提交(因为当前还没有要提交的文件)

此时在该git_demo文件夹下添加hello.txt文件:

解释:

  • Untracked files:表示未被追踪的文件(还没有将文件添加到暂存区)
  • 红色标记:表示文件还没有添加到暂存区

3.将本地文件添加到暂存区(git追踪文件)

基本语法:

  • git add 文件名

解释:

  • 当前git已经追踪到了文件hello.txt,此时该文件只是存在于暂存区(还可以删除,无历史版本)
  • 绿色标识:表示文件已经被添加到暂存区

补充:将暂存区的文件删除,但该文件在工作区(git_demo目录下)还是存在的

  • git rm --cached 文件名

4.将暂存区的文件提交到本地库(可以形成一个历史版本)

基本语法:

  • git commit -m “日志信息”文件名

5.查看历史版本

基本语法(两种方式):

  • git reflog
  • git log

6

解释:git reflog查看到的是版本号的前7位,git log查看到的是完整的版本号、谁提交的该版本和提交时间

6.修改文件

操作1:修改文件hello.txt后再次查看本地库状态:

解释:会提示文件被修改了,此时是红色标记,说明修改的文件还没有添加到暂存区

操作2:将修改的hello.txt上传到暂存区,查看状态,并提交到本地库

操作3:查看历史版本

解释:工作区里面永远只会显示一个文件(版本),git底层是通过指针来控制各个版本的

7.版本穿梭

基本语法:

  • git reset --hard 版本号

10

解释:原来有三个版本,且指针是指向第三个版本的(工作区显示),现在通过第二个版本的版本号,将版本穿梭回了第二个版本,此时工作区显示的就是第二个版本的文件内容了。

补充:头指针(工作区能看到的内容)指向master分支,master分支指向当前版本号

  • 在.git目录下面的HEAD文件里面的内容是:

    • ref: refs/heads/master:表示指针指向的是master,当前是在master这个分支上
  • 在.git\refs\heads目录下的master文件里面的内容是当前master指向的版本号(完整)

3.分支

在版本控制过程中,同时推进多个任务,为每个任务,可以创建每个任务的单独分支,使用分支意为着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。即当你文件里有内容时,如果这时你创建了一个副分支,那么在副分支下,你主分支里每个文件的内容,在副分支下都存在(相当于拷贝),但分支底层其实也就是指针的引用。

优点:

  • 同时并行推进多个功能开发,提高开发效率
  • 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可。

分支操作

命令名称 作用
git branch 分支名 创建分支
git branch -v 查看分支
git checkout 分支名 切换分支
git merge 分支名 把指定的分支合并到当前分支上

1.查看分支

2.创建分支hot-fix

3.切换分支

4.合并操作

  • 正常合并:master分支没有修改文件,而hot-fix分支对文件进行修改了,所以将hot-fix分支合并到master分支后,文件的内容是hot-fix分支文件的内容(修改的)。

  • 冲突合并:当在主分支对某个文件hello.txt进行修改(如第一行)时,如果提交到了本地库,在副分支下是不会显示f1修改的内容(因为副分支之前已经创建过,相当于另一条分支了,如果是新创建一个分支,则该分支下会显示f1修改的内容),如果这时你在副分支下,对f1第一行也进行了修改,并且提交到了本地库,当回到主分支进行合并副分支时,就会出现合并冲突,此时只能手动改。

操作1:主分支和副分支分别修改同一个文件hello.txt,并且修改位置(修改的行)是一样的,又分别提交到本地库,在主分支上将副分支合并

操作2:手动打开hello.txt文件进行修改(不需要哪些内容,删除即可),修改完后进行保存

操作3:将hello.txt提交到本地库(使用git commit命令时不能带文件名了)

注意:此时master分支下hello.txt文件是手动修改后的内容,而hot-fix副分支下的hello.txt文件还是之前的内容。因为合并只会修改主分支的内容,即只会修改合并的那个分支,被合并的分支不会被修改。

5.总结

master、hot-fix其实都是指向具体版本记录的指针,当前所在的分支是由HEAD决定的,所以创建分支的本质就是多创建一个指针。

  • HEAD如果指向master,那么此时就在master分支上
  • HEAD如果指向hot-fix,那么此时就在hot-fix分支上
  • 所以切换分支的本质就是移动HEAD指针

4.Git团队协作机制

1.团队内协作

  • 电脑A初始化了一个本地库,通过push命令可以将自己本地库下面的代码推送到代码托管中心,即产生一个远程库A
  • 电脑B可以通过clone命令将远程库A里面的代码克隆到自己的本地库
  • 电脑B在本地库对克隆的代码进行修改后,通过push命令又推送到远程库A(前提:电脑A将电脑B拉进该项目的团队里面)
  • 电脑A就可以通过pull命令来拉取远程库A里面电脑B修改的代码,更新到自己的本地库(电脑B、远程库、电脑A的数据同步了)

2.跨团队协作

  • 在代码托管中心,远程库B通过fork命令得到远程库A里面的代码
  • 电脑B通过clone命令将远程库B里面的代码克隆到自己的本地库
  • 电脑B在本地库对克隆的代码进行修改后,通过push命令推送到远程库B
  • 远程库B发一个拉取请求Pull request给远程库A
  • 远程库A收到请求,进行审核
  • 审核成功,远程库B就通过命令merge命令将远程库A的代码合并过来
  • 电脑B就可以通过pull命令来拉取合并后的远程库A的代码,更新到自己的本地库

5.远程库

常用命令

命令名称 作用
git remote -v 查看当前所有远程地址别名
git remote add 别名 远程库地址 给远程库起别名
git push 别名 分支 推送本地分支上的内容到远程库
git clone 远程地址 将远程库的内容克隆到本地
git pull 远程库地址别名 远程分支名 将远程库对于分支最新的内容拉下来后与当前本地分支直接合并

创建远程库&创建别名

1.登录github账号,点击右上角的+,点击New repository

2.在新建远程库页面设置库名git-demo(在自己账号下不能重名),选择公开

3.进入远程库git-demo,复制远程库链接

4.创建别名

  • git remote -v:查看当前所有远程地址别名
  • git remote add 别名 远程地址:为远程库创建别名,下面通过git-demo为别名

解释:当创建好别名后,再查看当前所有远程库别名就会出现两个git-demo,因为该别名即可用拉取fetch,也可用用来推送push

5.推送本地库

  • git push 别名 分支:如果没有给远程库设置别名,也可以使用链接

6.拉取远程库到本地库

如果自己本地库推送到远程库后,远程库对文件进行了更新,现在将其拉取到本地库。

解释:拉取下来后,查看本地库状态是干净的,说明拉取动作(拉取到本地库的文件)会自动提交到本地库。最后结果就是本地库的代码和远程库的代码已经同步了