git的使用

风格不统一 提交于 2020-01-31 13:37:35

一、前言

作为一个软件开发人员,不可能不知道Git。Git作为一个复杂的版本控制系统,命令之多,即使经常使用,一些命令也记不住,一般只记住几个常用的命令,不是所有使用Git命令行都是高效的。本教程不讲Git命令,而是先让你用上git,再去学习git。本教程应该称作TortoiseGit入门指南。因为下面要借助一个图形化的软件,TortoiseGit来操作git。用GUI(图形界面)再谈CLI(命令行),我相信这会更容易让人接受。

二、关于版本控制

什么是版本控制?我为什么要关心它呢?
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制。


而且还可以查看历史版本、文件谁进行提交修改删除的、也就是你对文件的一举一动都在公司的控制范围内
我见过有的优秀的互联网公司,他们所有的员工都会使用版本管理系统(svn\git),他们所有的文档、文件、资料都可以在上面找到
最关键的是他还具有权限的说法,你具有对应的权限才能进行对应的操作

三、Git的简介

3.1 Git的介绍

我们在公司进行研发的时候,对公司来说我们程序员写的代码是最宝贵的财富
那么我们研发的时候如果电脑突然一些事件,导致代码丢失就造成了大量的损失
所以自然而然就出现文件的版本关系管理工具
目前市面上使用最多的是svn和git


3.2 Git 与 SVN 区别

Git 不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
Git 与 SVN 区别点:
    1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
    2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
    3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
    4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
    5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。

3.3 什么是分支

几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间。

我们可以这么理解分支,比如我们做一款通用的用户管理系统,
那么A公司看见这个软件系统很喜欢,但是要求额外添加一个小功能,这个功能是针对A公司独有的功能,
b公司也喜欢这个系统,但是要求删除系统的其中功能。

而我们这个时候针对A,B都研发好了系统
这个时候我们发现主系统有bug需要修复怎么办,在主系统我们修复了这个bug,我们可以合并分支,其他的分支也有自然把bug修复了


突然c公司喜欢这个系统,提出建议,而a,b也很喜欢,那么c写好了后,合并master分支之后,a、b也可以有这个。

在这里面A,B,C和主系统都称为分支,主系统的被称为主分支

分支不影响其他分支

四、软件介绍

4.1 git服务器介绍

git的服务器一般搭建在专门的git服务器上,我们可以简单的理解为一台电脑上,而很多公司的git服务器是内网的这点需要注意
除了直接搭建在内网的git服务器其实也可以搭建在外网上,主要看你们所在的公司运维那边如何搭建服务器了
另外除了公司自己的git服务器以外,我们还有一种选择是免费的git服务器

目前市面上面试的git服务器最出名的有2个,GitHub和码云

GitHub国外的优秀网站,很多人都把自己的代码放在GitHub中,所以有的时候你下载别人的代码时候你会发现是GitHub上的
[https://github.com/](https://github.com/)

码云是国内的代码托管服务器,也是很优秀的,但是在改版之后,公司合作的人数控制在5个以内
[https://gitee.com/](https://gitee.com/)

4.2 git、TortoiseGit、TortoiseGit-LanguagePack

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,我们需要敲命令的方式管理我们的文件。
TortoiseGit是一个开放的GIT版本控制系统的源客户端,可以解放我们的命令,通过图形化的方式直接管理。

TortoiseGit-LanguagePack是我们的语音包

git的下载地址
[https://git-for-windows.github.io/](https://git-for-windows.github.io/)
TortoiseGit和语音包下载地址
[http://tortoisegit.org/download/](https://git-for-windows.github.io/)

image
image

4.3 Git 工作区、暂存区和版本库

 我们先来理解下Git 工作区、暂存区和版本库概念

    工作区:就是你在电脑里能看到的目录。
    暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
    版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

下面这个图展示了工作区、版本库中的暂存区和版本库之间的关系:

在这里插入图片描述

 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。
工作区就是我们本地电脑的文件夹
暂存区可以理解为一个缓存区
版本库中的master就是服务器中的内容
 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。

图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。

图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。

当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。

当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。

当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。

当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。

当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。

当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。

五、git如何使用

5.1 clone克隆

克隆就是将服务器的文件下载到本地电脑中

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

刚到公司的时候,公司会给你git的3个东西:url地址,账号,密码
url:公司给的地址
目录:本地工作区的文件夹
分支:克隆的是哪个分支,默认master主分支

5.2 添加

在这里插入图片描述

当我们在工作区添加一个文件的时候,这个时候服务器并不知道这个文件,仅仅是本地有这个文件
所以我们会看见有一个小问号,有的电脑没有这个问号也无所谓

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

我们点击文件,会看见有一个添加选项,这个时候要注意,其实git版本库(服务器)中其实并没有这个文件,仅仅是告诉暂存区我们要添加文件,并且告诉其文件名,当我们点击提交(commit)到master的时候,这个才是真正的让git版本库获取到了这个文件,最后不要忘记推送到服务器中

5.3 修改

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

当我们这个时候修改1.txt的时候,文件会警告,告诉我们和git版本库中的文件不一致了,这个时候我们点击同步到master就OK了

5.4 删除、重命名

同添加修改一样

5.5 同步

在这里插入图片描述

将git版本库最新的代码更新到本地的工作区中

5.6 查看历史版本、查看日志

5.7 切换分支

5.8 合并分支

如果要将t1->master
那么首先需要当前分支为master,然后点击合并(merge),选择t1分支,这个时候我们会发现t1的文件到master了。
但是这个时候我们需要注意,只是本地的工作区master合并到了t1,这个时候我们需要推送到git版本库中

5.9 代码冲突

在这里插入图片描述

当其他在我们之前提交了代码,我们会发现无法提交上去,因为本地的工作区的版本太低了,所以这个时候我们需要先获取本地的代码,也就是同步,然后解决冲突的地方。
冲突的情况一般分为这3中情况

 1. 其他人写的代码和你写的代码功能相互互补影响,碰见这种情况就需要你把俩个人的代码同时的保留
 2. 其他人写的代码和你写的代码功能有重复部分,这个时候需要你去判断谁写的更好,如果对方写的好,就把自己写的代码删除,然后调用别人写的代码;如果自己写的好,叫上对方和对方讨论一下

其实为了发生这种情况,一般出现冲突的都是公共类部分,
这个时候如果你去修改公共类的话,提前在你们的研发小群里面问题有人去改没,如果有的话就先写其他的功能
注意:工具类的代码一般不要去修改,公司里面技术高超的人多了,根本轮不到你去改,所以不要随意去修改,凡事做事多思考

5.10 Git 生成 RSA加密

六、Git命令

在这里插入图片描述

七、其他帮助

https://www.w3cschool.cn/isrekq/c5t4uozt.html
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!