Git版本控制工具

# **Git版本控制工具**

# 一、**版本控制[理解]**

## (一)**版本控制思想**

从个人工作和团队协作两个方面(角度)介绍版本控制思想

n 个人工作

往往为了恢复到某一个版本,我们不停的对我们的文件进行复制修改(备份)

n 团队协作

 

版本从何而来呢?

设定场景:

SVN,123

Git,hash码

A提交一次代码,服务器的版本为1

B提交一次代码,服务器的版本为2

每提交一次代码,服务器的文件版本+1,这样每次提交的东西都有一个版本号对应,易于管理,所以这种软件就叫做版本控制软件

 

安装了版本控制软件的服务器叫做,版本控制服务器,作用:团队协作开发。

 

文件上传到版本控制服务器,仅有文件内容还不够,还需要文件的元数据信息(描述数据的数据就叫做元数据)(修改时间、修改人、备注注释信息等),这样才能够便于恢复版本、追责等

 

## (二)**版本控制软件应该具有的功能**

l 协同修改
多人并行不悖的修改服务器端的同一个文件。

l 数据备份
不仅保存目录和文件的当前状态, 还能够保存每一个提交过的历史状态。

l 版本管理

在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空
间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文
件系统快照的方式

l 历史记录
查看修改人、 修改时间、 修改内容、 日志信息。
将本地文件恢复到某一个历史状态。

l 分支管理
允许开发团队在工作过程中多条生产线同时推进任务, 进一步提高效率。

注意:版本控制不仅适用于IT领域

## (三)**版本控制工具介绍**

l 集中式版本控制工具

代表:cvs、svn、vss

弊端:容错性不好,服务器宕机,磁盘坏掉

 

l 分布式版本控制工具

代表性:git、BitKeeper

# 二、**Git介绍[了解]**

## (一)**Git简史**

## (二)**Git官网和Logo**

官网地址:<https://git-scm.com/>

## (三)**Git的优势**

l 大部分操作在本地完成,不需要联网(不折不扣的分布式)

l 完整性保证

Hash算法

l 尽可能添加数据而不是删除或修改数据

l 分支操作非常快捷流畅

l 与 Linux 命令全面兼容

# 三、**Git工作流程[了解]**

一般工作流程如下:

1.从远程仓库中克隆 Git 资源作为本地仓库。

2.从本地仓库中checkout代码然后进行代码修改

3.在提交前先将代码提交到暂存区。

4.提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。

5.在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。

下图展示了 Git 的工作流程:

# 四、**Git的安装[应用]**

最早Git是在Linux上开发的,很长一段时间内,Git也只能在Linux和Unix系统上跑。不过,慢慢地有人把它移植到了Windows上。现在,Git可以在Linux、Unix、Mac和Windows这几大平台上正常运行了。由于开发机大多数情况都是windows,所以本教程只讲解windows下的git的安装及使用。

## (一)**软件下载**

下载地址:<https://git-scm.com/download>

## (二)**软件安装[应用]**

### 1.**安装git for windows**

 

一路“下一步”使用默认选项即可。注意:安装路径不要用中文

n 验证安装是否成功

在任何一个目录下右键看是否有菜单

### 2.**安装TortoiseGit**

一路“下一步”使用默认选项即可。

默认选项下会启动配置画面:

由于目前只有英文语言包,默认即可继续下一步。

 

配置git.exe,在4.2.1中已经安装过git-for-windows了所以在此找到git.exe所在的目录。

 

配置开发者姓名及邮箱,每次提交代码时都会把此信息包含到提交的信息中。

使用默认配置,点击“完成”按钮完成配置。

完整完毕后在系统右键菜单中会出现git的菜单项。

### 3.**安装中文语言包**

安装中文语言包并不是必选项。可以根据个人情况来选择安装。

直接“下一步”完整完毕。

语言包安装完毕后可以在TortoiseGit的设置中调整语言

# 五、**Git的结构[认识]**

## (一)**Git的本地结构**

## (二)**Git的代码托管中心**

代码托管中心的任务:维护远程库

l 局域网环境下

n GitLab服务器

l 外网环境下

n GitHub

n 码云

## (三)**本地库和远程库**

本地库和远程库的交互方式,介绍这么两种:一种是团队内部协作,一种是跨团队协作

l 团队内协作

 

l 跨团队协作

# 六、**Git命令行操作[掌握]**

Git本地项目仓库(可以多个)初始化

命令行操作学习路线:初始化git本地版本库——>在本地版本库管理文件(新建文件 —>把文件加入git的管理 —> 修改文件 —> 恢复到之前某一个版本)

## (一)**创建版本库**

### 1.**使用GitBash**

在当前目录中点击右键中选择Git Bash来启动。

创建仓库执行命令:

n 命令:git init

n 效果

注意:.git目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改

### 2.**使用TortoiseGit**

使用TortoiseGit时只需要在目录中点击右键菜单选择“在这里创建版本库”

版本库创建成功,会在此目录下创建一个.git的隐藏目录,如下所示:

在windows中如何显示隐藏目录隐藏目录请自行百度o(╯□╰)o

**概念:**

**版本库:“.git”目录就是版本库,将来文件都需要保存到版本库中。**

**工作目录:包含“.git”目录的目录,也就是.git目录的上一级目录就是工作目录。只有工作目录中的文件才能保存到版本库中。**

## (二)**设置签名**

n 形式

用户名:tom

Email地址:[helloword@aliyun.com](mailto:helloword@aliyun.com)

n 作用:区分不同开发人员的身份

n 辨析:这里设置的签名和登录远程库(代码托管中心)的账号、 密码没有任何关

n 命令

u 项目级别/仓库级别:仅在当前本地库范围内有效

l git config user.name tom_pro

l git config user.email [helloword@aliyun.com](mailto:helloword@aliyun.com)

l 信息保存位置:.git/config文件

u 系统用户级别:登录当前操作系统的用户范围

l git config --global user.name tom_global

l git config --global user.email [tomabc@aliyun.com](mailto:tomabc@aliyun.com)

信息保存位置:保存在当前仓库目录下的 .git/config 文件中

 

u 级别优先级

l 就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名

l 如果只有系统用户级别的签名,就以系统用户级别的签名为准

l 二者都没有不允许

## (三)**基本操作**

### 1.**添加**

**使用GitBash**

​    git add [filename]

​    将工作区的“新建/修改”添加到暂存区

在~/Desktop/gittest目录下创建一个good.txt文件

 

使用TortoiseGit

### 2.**提交**

**使用GitBash**

​    git commit -m “commit message” [file name]

​    将暂存区的内容提交到本地库(暂存区内容修改后进行提交)

使用TortoiseGit

### 3.**查看历史记录**

**使用GitBash**

​    git log

​        git log --pretty=oneline 美化log日志

​        git log --oneline 美化log日志

​      

git reflog**(推荐)**

​        HEAD@{移动到当前版本需要多少步}

使用TortoiseGit

### 4.**状态查看**

**使用GitBash**

​    git status

​    查看工作区,暂存区状态

文件名红色表明工作目录中的文件尚未被追踪管理

 

n 前进后退

u 本质[了解]

其实内部维护了一个HEAD指针,做这么一个reset操作的时候,其实相当于易懂了HEAD指针(表明的是当前的状态)

u 基于索引值操作[推荐]

git reset --hard [局部索引值/版本号前缀]

u 使用^符号:只能后退

git reset --hard HEAD^ 一个表示后退一步,n个表示后退n步

u 使用~符号:只能后退

git reset --hard HEAD~n

​            注:表示后退n步

### 5.**删除文件**

使用TortoiseGit

需要删除无用的文件时可以使用git提供的删除功能直接将文件从版本库中删除。

注意:不要仅仅从工作目录删除,删除之后也需要git add然后git commit提交到本地仓库管理

### 6.**删除文件并找回**

**使用GitBash**

n 前提:删除前,文件存在时的状态提交到了本地库

n 操作:git reset --hard 指针位置

u 删除操作已经提交到本地库:指针位置指向历史记录

### 7.**比较文件差异**

**使用GitBash**

n git diff [文件名]:将工作区中的文件和暂存区进行比较

git diff 本地仓库中的历史版本 文件名:将工作区中的文件和版本库进行比较(主要)

使用TortoiseGit

### 8.**还原修改**

使用TortoiseGit

当文件修改后不想把修改的内容提交,还想还原到未修改之前的状态。此时可以使用“还原”功能

[

**注意:此操作会撤销所有未提交的修改,所以当做还原操作是需要慎重慎重!!!**

## (四)**工作区和暂存区**

Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

什么是工作区(Working Directory)?

工作区就是你在电脑里能看到的目录,比如我的reporstory文件夹就是一个工作区。

有的同学可能会说repository不是版本库吗怎么是工作区了?其实repository目录是工作区,在这个目录中的“.git”隐藏文件夹才是版本库。这回概念清晰了吧。

Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。

如下图所示:

分支和HEAD的概念我们稍后再讲。前面讲了我们把文件往Git版本库里添加的时候,是分两步执行的:

第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。

## (五)**案例:将java工程提交到版本库**

使用TortoiseGit

 

第一步:将参考资料中的java工程gittest复制到工作目录中

 

第二步:将工程添加到暂存区。

[

点击确定完成暂存区添加。

三、忽略文件或文件夹

在此工程中,并不是所有文件都需要保存到版本库中的例如“.idea”目录及目录下的文件就可以忽略。好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。

如果使用TortoiseGit的话可以使用菜单项直接进行忽略。

选择保留本地文件。完成后在此文件夹内会多出一个.gitignore文件,这个文件就是文件忽略文件,当然也可以手工编辑。其中的内容就是把.idea目录忽略掉。

四、提交代码

将代码添加到master分支上,其中.gitignore文件也需要添加到暂存区,然后提交到版本库。

## (六)**忽略文件语法规范**

空行或是以 # 开头的行即注释行将被忽略。

可以在前面添加正斜杠 / 来避免递归,下面的例子中可以很明白的看出来与下一条的区别。

可以在后面添加正斜杠 / 来忽略文件夹,例如 build/ 即忽略build文件夹。

可以使用 ! 来否定忽略,即比如在前面用了 *.apk ,然后使用 !a.apk ,则这个a.apk不会被忽略。

\* 用来匹配零个或多个字符,如 *.[oa] 忽略所有以".o"或".a"结尾, *~ 忽略所有以 ~ 结尾的文件(这种文件通常被许多编辑器标记为临时文件); [] 用来匹配括号内的任一字符,如 [abc] ,也可以在括号内加连接符,如 [0-9] 匹配0至9的数; ? 用来匹配单个字符。

看了这么多,还是应该来个栗子:

\# 忽略 .a 文件

*.a

\# 但否定忽略 lib.a, 尽管已经在前面忽略了 .a 文件

!lib.a

\# 仅在当前目录下忽略 TODO 文件, 但不包括子目录下的 subdir/TODO

/TODO

\# 忽略 build/ 文件夹下的所有文件

build/

\# 忽略 doc/notes.txt, 不包括 doc/server/arch.txt

doc/*.txt

\# 忽略所有的 .pdf 文件 在 doc/ directory 下的

doc/**/*.pdf

# 七、**Git分支管理[了解]**

往往应用于大型项目,而且分支由项目经理管理

## (一)**什么是分支**

在版本控制过程中,使用多条线同时推进多个任务

## (二)**分支的好处**

n 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响,失败的分支删除重新开始即可

## (三)**分支操作**

### 1.**创建分支**

**使用GitBash**

git branch 分支名

 

使用TortoiseGit

如果想创建完毕后直接切换到新分支可以勾选“切换到新分支”选项或者从菜单中选择“切换/检出”来切换分支:

 

### 2.**查看分支**

**使用GitBash**

git branch -v

### 3.**切换分支(checkout检出)**

**使用GitBash**

 

git checkout 【分支名】

 

### 4.**合并分支**

**使用GitBash**

 

第一步:切换到接受修改的分支

git checkout 【被合并分支名】

第二部:执行merge(合并)命令

git merge 【有新内容分支名】

### 5.**解决冲突**

**使用GitBash**

 

n 冲突的表现

n 冲突的解决

第一步:编辑文件,删除特殊符号

第二步:把文件修改到满意的程度,保存退出

不要留有特殊字符<<<<<<< =>>>>>>

第三步:git add 文件名

第四步:git commit -m ‘日志信息’,注意此时,commit一定不能带具体的文件名,否则会出现错误

# 八、**GitHub[应用]**

## (一)**添加远程仓库**

现在我们已经在本地创建了一个Git仓库,又想让其他人来协作开发,此时就可以把本地仓库同步到远程仓库,同时还增加了本地仓库的一个备份。

常用的远程仓库就是github:<https://github.com/>,接下来我们演示如何将本地代码同步到github。

 

## (二)**账号信息**

GitHub首页就是注册页面:<https://github.com/>

首先你得在github上创建一个账号

| Email地址:github[yuebuqun@aliyun.com](mailto:yuebuqun@aliyun.com)GitHub账号:githubyuebuqun |
| ------------------------------------ | ------------------------------------------------------------ |
| Email地址:github[linghuchong@aliyun.com](mailto:linghuchong@aliyun.com)GitHub账号:githublinghuchong |
| Email地址:github[dongfangbubai@aliyun.com](mailto:dongfangbubai@aliyun.com)GitHub账号:githubdongfangbubai |

## (三)**创建GitHub远程库**

点击“create repository”按钮仓库就创建成功了。

Github支持两种同步方式“https”和“ssh”。如果使用https很简单基本不需要配置就可以使用,但是每次提交代码和下载代码时都需要输入用户名和密码。如果使用ssh方式就需要客户端先生成一个密钥对,即一个公钥一个私钥。然后还需要把公钥放到githib的服务器上。这两种方式在实际开发中都用应用,所以我们都需要掌握。

## (四)**创建远程仓库地址别名**

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

git remote add [别名] [远程地址]

## (五)**同步到远程仓库**

**https方式**

git push [别名] [分支名]

**SSH方式**

git remote rm origin

git remote add origin [ssh仓库地址]

git push -u origin [分支]

## (六)**从远程仓库克隆**

n 命令:git clone [仓库远程地址]

n 效果

l 完整的把远程库下载到本地

l 创建origin远程地址别名

l 初始化本地库

使用TortoiseGit:

## (七)**团队成员邀请**

 

复制邀请连接

​    “岳不群”其他方式把邀请连接发送给“令狐冲”,“令狐冲”登录自己的GitHub账号,访问邀请连接,接受邀请

## (八)**从远程仓库取代码**

l pull = fetch(获取的意思) + merge

l git fetch [远程库地址别名] [远程分支名]

n 如果要查看,需要切换仓库git checkout origin/master,然后cat 文件

例如:

​    git fetch original master

git checkout original/master

cat ….txt

--git checkout master

git merge original/master

l git merge [远程库地址别名/远程分支名]

l git pull [远程库地址别名] [远程分支名]

## (九)**解决冲突**

 

首先需要pull最新的代码

然后处理冲突,和分支合并处理冲突一样,注意commit时不要带文件名,commit后push到远程

n 要点:

n 如果不是基于GitHub远程库的最新版所做的修改,不能推送,必须先拉取

n 拉取下来如果进入冲突状态,模仿分支冲突解决即可

## (十)**跨团队协作**

n 把项目的地址发送给团队外部的人(线下发送)

 

n 团队外部人员登录github,然后访问给出的地址

n 团队外人员把fork后的远程仓库clone到本地进行fork

n 团队外人员本地编辑提交,push到远程

n pull request

n 团队内人员,查看审核请求

团队人员登录

查看修改内容

n 然后将远程库拉取到本地即可,拉取到本地结束跨团队协作的过程

## (十一)**SSH操作**

### 1.**什么是ssh?**

SSH 为 Secure Shell(安全外壳协议)的缩写,由 IETF 的网络小组(Network Working Group)所制定。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。

### 2.**基于密匙的安全验证**

使用ssh协议通信时,推荐使用基于密钥的验证方式。你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。

#### (1)**ssh密钥生成**

在windows下我们可以使用 Git Bash.exe来生成密钥,可以通过开始菜单或者右键菜单打开Git Bash

 

 

git bash 执行命令,生命公钥和私钥

命令: **ssh-keygen -t rsa**

执行命令完成后,在window本地用户.ssh目录C:\Users\用户名\.ssh下面生成如下名称的公钥和私钥:

 

#### (2)**ssh密钥配置**

密钥生成后需要在github上配置密钥本地才可以顺利访问。

在key部分将id_rsa.pub文件内容添加进去,然后点击“Add SSH key”按钮完成配置。

### 3.**SSH原理**

# 九、**Idea中操作Git[掌握]**

## (一)**在Idea中配置git**

安装好IntelliJ IDEA后,如果Git安装在默认路径下,那么idea会自动找到git的位置,如果更改了Git的安装位置则需要手动配置下Git的路径。

选择File→Settings打开设置窗口,找到Version Control下的git选项:

选择git的安装目录后可以点击“Test”按钮测试是否正确配置。

## (二)**将工程添加至git**

1)在idea中创建一个工程,例如创建一个java工程,名称为idea-git-test,如下图所示:

 

2)创建本地仓库

在菜单中选择“vcs”→Import into Version Control→Create Git Repository...

选择工程所在的上级目录。本例中应该选择idea-projects目录,然后点击“OK”按钮,在工程的上级目录创建本地仓库,那么idea-projects目录就是本地仓库的工作目录,此目录中的工程就可以添加到本地仓库中。也就是可以把idea-git-test工程添加到本地仓库中。

选择之后在工具栏上就多出了git相关工具按钮:

 

3)将工程添加至本地仓库

直接点击按钮,将工程提交至本地仓库。

然后点击“commit”按钮,将工程添加至本地仓库。

 

4)推送到远程

在github上创建一个仓库然后将本地仓库推送到远程。

在工程上点击右键,选择git→Repository→push,

或者在菜单中选择vcs→git→push

点击“Define remote”链接,配置https形式的URL,git形式的无法通过。然后点击OK

点击“push”按钮就讲本地仓库推送到远程,如果是第一次配置推送需要输入github的用户名和密码。

## (三)**从远程仓库克隆**

关闭工程后,在idea的欢迎页上有“Check out from version control”下拉框,选择git

 

此处仍然推荐使用htts形式的url,点击“test”按钮后显示连接成功。

点击OK按钮后根据提示将远程仓库克隆下来,然后倒入到idea中。

## (四)**从服务端拉取代码**

如果需要从服务端同步代码可以使用工具条中的“update”按钮

# 十、**Git基本原理[了解]**

## (一)**哈希**

​    哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:

l 不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定

l 哈希算法确定,输入数据确定,输出数据能够保证不变

l 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大

l 哈希算法不可逆

Git底层采用的是SHA-1算法

哈希算法可以被用来验证文件,原理如下图所示

## (二)**Git保存版本的机制**

l 集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本
文件和每个文件随时间逐步累积的差异。

l Git的文件管理机制

​    Git把数据看作是小型文件系统的一组快照。每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个连接指向之前存储的文件。所以Git的工作方式可以称之为快照流

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值