版本管理工具Git

Git 是一个免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目

1.版本控制

1.1 什么是版本控制

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

1.2为什么需要版本控制

  • 个人开发过渡到团队协作

1.3 版本控制工具

  • 集中式版本控制工具
# CVS、 SVN(Subversion)、 VSS……
	集中化的版本控制系统诸如 CVS、 SVN 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。这种做法带来了许多好处,每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个集中化的版本控制系统, 要远比在各个客户端上维护本地数据库来得轻松容易。

	事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。  
  • 分布式版本控制工具
# Git、 Mercurial、 Bazaar、 Darcs……
	像 Git 这种分布式版本控制工具,客户端提取的不是最新版本的文件
快照,而是把代码仓库完整地镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。


# 分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
    1. 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
    2. 每个客户端保存的也都是整个完整的项目(包含历史记录, 更加安全)

1.4 Git发展历史

1.5 Git工作机制

1.6 Git和代码托管中心

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

  • 局域网
    • GitLab
  • 互联网
    • Github(外网)
    • Gitee(国内网站)

2.Git安装及使用

Git下载地址

一路next即可安装完成

2.1 Git常用命令

首先配置用户名和邮箱

配置完成后,可以在c盘中用户目录下查看到配置的信息。

# 说明:签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。 Git 首次安装必须设置一下用户签名,否则无法提交代码。
	
	※注意: 这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任何关系

2.2 基本语法

1) git init 初始化本地库

2)git status 查看本地库状态

这边我们在这个目录下创建一个新的文件夹,再次查看状态

此时说明文件存在,但是并未被追踪到,这边我们要使用 git add命令去追踪

3)git add 添加暂存区

# CRLF为windows下的换行符。LF为Linux下的换行符

此时,可以看到文件已经编程了绿色,这表明git已经追踪到了这个文件,此时文件处于暂存区当中。使用git rm -- cached 可以直接删除掉文件。此时只是删除了暂存区的文件,但是文件并不会被删除

4)git rm --cached(文件名) 删除暂存区文件

5)git commit -m "日志信息" (文件名) 将暂存区文件提交到本地库

6)git reflog 查看日志信息

7)git log 查看详细日志信息

其中那串较长的数字为详细版本号

8)git reset --hard (版本号)版本穿梭

我们对文件修改后再次进行提交

再次查看版本信息

可以看到出现了两个版本,这里我们通过版本穿梭命令,回到之前的版本

可以看到现在的版本已经回到了第二次提交的地方,此时也可以看到修改的文件内容也发生了变化。可以看到在.git文件夹下的ref文件中的heads中master指向了第二个版本信息。

# git的版本切换,底层就是通过移动master的指针实现的

3.Git分支操作

3.1 什么是分支

在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来, 开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)

3.2分支的优势

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

3.3分支操作

1) git branch -v 查看分支

可以看到当前只有一个分支

2)git branch (分支名) 创建分支

再次查看分支

3)git checkout(分支名)切换分支

可以看到我们切换到了fix-hot分支了。

此时我们对文件进行修改,然后再次提交修改。

然后我们切换回master分支

我们发现切换回原来的分支后,文件没有被修改,这里我们要使用到分支合并了。

4) git merge(分支名) 将指定分支合并到当前分支上

可以看到,当前分支的内容被覆盖掉了。

3.4 产生冲突

合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。 Git 无法替我们决定使用哪一个。必须人为决定新代码内容

这时候我们需要手动的去合并代码,我们先查看下文件内容。

这边我们将所有的特殊符号都删除掉

# dd为删除一行 u为撤销指令 ctrl+z为中断操作,但是后台还会运行,fg/bg操作继续前台或后台的任务,fg命令重新启动前台被中断的任务,bg命令把被中断的任务放在后台执行.

然后使用git add命令将文件放入暂存区当中。然后再次提交(注意:这次提交不可以带文件名)

此时文件就提交成功了。

# 注意,在哪个文件中被修改之后修改当前的分支,本例当中hot-fix分支中的内容不会被修改。

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

  • HEAD 如果指向 master,那么我们现在就在 master 分支上。
  • HEAD 如果执行 hotfix,那么我们现在就在 hotfix 分支上

3.5Git团队协作

团队内协作

跨团队协作

4.GitHub

4.1 远程仓库操作

首先创建远程仓库,然后复制https连接,对其起别名

1)git remote add(别名)远程地址

2)git remote -v 查看当前所有远程地址别名

为什么创建的别名信息又两个呀?

这是因为创建的别名既可以拉取也可以推送。

3)git push (别名) (分支)

这边可以看到,本地的代码成功被推送到了GitHub上。

4)git pull (远程地址库别名) (远程分支名)

如果我们对GitHub上的文件进行了操作,这里我们就要重新进行拉取。

5)git clone (远程地址)将远程库的内容克隆到本地

clone操作会帮我们做三件事:

  • 拉取代码
  • 创建本地库
  • 创建别名

可以看到git自动给我们创建了origin的别名

4.2邀请加入团队

这样被邀请的那个人也可以操作这个远程库了。

然后就可以clone下来内容然后进行修改之后,push到远程仓库。

4.3跨团队协作

首先将仓库的地址发送给邀请跨团队协作的人

然后点击fork将项目叉到自己的本地仓库

然后就可以在自己的仓库中,看到仓库信息,自己修改完成提交后,自己仓库的内容发生了改变,这边要使用pull request提交,原来的项目管理者同意之后,就可以将提交的代码merge到仓库之中。

4.4SSH免密登录

--进入当前用户的家目录
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ cd
--删除.ssh 目录
Layne@LAPTOP-Layne MINGW64 ~
$ rm -rvf .ssh
removed '.ssh/known_hosts'

然后生成密钥之后,将公钥设置到github的SSH中,即可实现免密登录。

Q.E.D.


勤俭节约,艰苦奋斗。