Git——有这一篇就够了

一、Git简介

什么是Git?

Git是世界上最先进的分布式版本控制系统

二、集中式(SVN)VS分布式(GIT)

集中式版本控制系统:版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。如下图示意:

集中式版本控制系统的缺点是:必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,效率低下。

分布式版本控制系统:分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。如下图示意:

三、Git安装

Git的下载地址:https://pan.baidu.com/s/1r-XCZtqA8qgdEKbPWo6rTA

               密码: y4k3

四、Git入门

1:基本配置

我们本地仓库中的代码最终是要上传到GitHub中,而在上传的时候,必须要指定我们的信息,包括用户名和邮箱地址!方便团队或者项目组中其他人员知道是谁修改或者上传了代码!

所以我们首先要设置用户名和邮箱地址

1.1设置用户名和邮箱

安装成功之后,右键点击桌面空白位置===》Git Bash Here

git config --global user.name 用户名

git config --global user.email  邮箱地址

git config --list 展示自己信息列表

1.2修改用户信息

vim  ~/.gitconfig

 

在这个文件中也可以,新增name和email

1.3删除用户信息

 git config --global  --unset user.name  删除用户名

 git config --global --unset user.email  删除邮箱

如果有多个用户,想删除指定的用户可以使用:

git config --global --unset user.name 用户名

 2.基本操作

2.1创建本地仓库

git init

2.2创建并编辑文件

vim  gitDemo.txt

 

进入如下界面:

进入默认是命令模式并不能输入字如果想输入按a、i都可以切换到输入模式

输入完成后按esc键退出编辑模式然后按ZZ(大写)或者:wq!保存并强制退出返回git界面

2.3将文件新增到暂存区

我们刚才创建的gitDemo.txt文件虽然在我们的仓库目录下,但是并没有被仓库所管理!

需要使用git add让文件被仓库管理(进入暂存区

2.4将文件提交到历史仓库

 

2.5对文件进行修改

以下两种方式自己选择:

 

此时,我们对修改的文件有两种处理方式!

  1. 确实需要修改,那么我们使用git add将文件放进暂存区
  2. 如果是误修改,我们可以将文件回滚到之前的版本

2.6对比文件差异

 

2.6.1撤销修改

这里的撤销指的是,我们修改的文件还没有被提交到暂存区!

之后,还有一种方式是===》已经提交到了暂存区之后怎么撤销?

 

3.工作区,暂存区,历史仓库

 3.1基本介绍

我们使用了git init初始化git仓库之后,在文件夹中会多出一个.git隐藏文件夹!

这个.git隐藏文件夹就是git的版本库repository。

我们创建的myRepertory文件夹就是工作区 working directory。

暂存区:暂存区可以理解为一个虚拟工作区,这个虚拟工作区会跟踪工作区的文件变化(增删改等操作)。这个工作区的位于.git文件夹下的index目录下

3.2注意点

  1. 当需要对工作区的修改提交到版本库前,暂存区会与工作区进行差异比较,如果工作区与暂存区的文件不一致,那么需要同步工作区的修改到暂存区,然后才可以提交到版本库;
  2. 暂存区可以说是工作区和版本库的桥梁,我们对文件的修改可以先放在暂存区中,如果后悔了不仅可以非常方便撤销,而且不会影响到现有的版本库;
  3. 只要我们使用过git add,那么文件就会被跟踪,暂存区跟踪记录了工作区的文件名和文件状态(在index文件中会记录修改时间,文件大小等信息);
  4. 下次我们对文件进行修改的时候,会比较时间戳来判断文件是否被修改,在执行git status时,首先会到.git/index下查看被跟踪的工作区文件的时间戳,如果发现自上次执行git add(执行git add可以让工作区的文件被跟踪)以来,文件的时间戳发生了变化,那么判断文件发生了改动,于是会与暂存区的原始文件与工作区中的该文件进行差异比较,如果发现两个文件内容不一致,那么就给出差异信息。

 3.3实例演示

 

3.4查询历史提交记录

 1. git log

2. git log --pretty=oneline

 

也可以查询某个指定文件的提交历史

 

3.git reflog

 

4.git log和git reflog的区别

01.Git log查询的是commit id,作者以及提交时间和提交信息但是不包括之前删除的历史记录

02.git reflog查询的是简洁的commit id和提交信息也会包含之前删除的历史记录

5.回退历史版本

git  reset  版本ID

 

6.撤销修改

这里的修改,就是我们的文件已经到达了暂存区了,需要把修改的文件还原到工作区!

 

7.误删除工作区的文件

 

8.真正删除文件

 

五、远程仓库

使用GitHub时,国内的用户经常遇到的问题是访问速度太慢,有时候还会出现无法连接的情况(原因你懂的)。

如果我们希望体验Git飞一般的速度,可以使用国内的Git托管服务——码云gitee.com)。

和GitHub相比,码云也提供免费的Git仓库。此外,还集成了代码质量检测、项目演示等功能。对于团队协作开发,码云还提供了项目管理、代码托管、文档管理的服务,5人以下小团队免费。

 

5.1 创建ssh公钥

打开gitbash:ssh-keygen -t rsa -C "dzm8888@126.com"

其中,请将dzm8888@126.com替换成自己在码云上注册的邮箱。

 

找到位于上图:/c/Users/用户名/.ssh/id_rsa.pub的公钥文件。

             

编辑其内容,将内容复制到码云上:

 

 5.2 添加远程仓库

 

 目前,在码云上的这个test1仓库还是空的,Git告诉我们,可以从这个仓库克隆出新的仓库,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到远程仓库。

 5.3 将本地仓库中的内容推送到远程仓库

 步骤1、关联本地仓库+远程仓库

在gitbash中运行:git remote add origin 远程仓库地址。

步骤2、将本地库master分支同步到远程仓库,根据提示输入用户名密码:

             命令:git push -u origin master

遇到的问题1: error: src refspec master does not match any.

     解决办法:将文件新增或提交。

 

  遇到的问题2:

 解决办法:git pull --rebase origin master(取回远程主机上的master分支,合并后推送)

 

  再次执行git push -u origin master

 

查看远程仓库

 

 从现在起,只要本地做了提交,就可以通过命令:git push origin master 把本地master分支的最新修改推送到码云上。

  5.4 从远程库上克隆

  将我们在码云上构建的工程克隆到本地上。

 

 切换到d:gitclone目录下,查看

 

六、分支管理

分支就是科幻电影里面的平行宇宙,当你正在电脑前努力学习Git的时候,另一个你正在另一个平行宇宙里努力学习SVN。

如果两个平行宇宙互不干扰,那对现在的你也没啥影响。不过,在某个时间点,两个平行宇宙合并了,结果,你既学会了Git又学会了SVN!

 

分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。

现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

 6.1 创建分支和合并分支

在版本回退中,你已经知道,每次提交,Git都会把它串成一条时间线。这条时间线就是一个分支。截止到目前,在Git中只有一条分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,而master才是指向提交的,所以HEAD指向的是当前的分支。

 

每次提交,master都会沿当前时间线向前移动一步。这样随着你不停的提交,master分支也会越来越长。   

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master做相同的提交,再把HEAD指向dev,就表示当前分支在dev上。

 

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

 

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

 

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

 

下面完成对应的分支案例:

    使用: git checkout -b dev 创建并切换到dev分支

 

  使用git branch查看当前分支

 编辑a.txt,适当添加内容

 

现在dev分支的工作任务结束,切换到master分支。使用cat语句查看发现 没有刚刚在dev分支上操作的内容。

 

现在,我们把dev分支的工作成果合并到master分支上。

 

合并完成后,就可以放心的移除dev分支了。

 

  查看内容如下:

 

  6.2 解决冲突

创建新的分支如下,进行全新的分支案例。

 

修改a.txt文件的最后一行内容如下:

 

在test1分支上提交

 

  切换到master分支

 

 Git此时会自动提示我们当前的master分支比远程的master分支要超前一个提交。

     在master分支上编辑a.txt文件的最后一行

 

进行了与test1分支不一样的修改

再次提交:

 

    此时,master与test1分支合并时可能会产生冲突:

 

果不其然,产生了冲突。我们可以通过git status查看冲突的文件

 

查看a.txt文件中的内容:

 

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们修改如下后保存,再提交。

 

  使用git log命令查看分支合并情况:git log --graph --pretty=oneline --abbrev-commit

 

七、标签管理

   7.1 创建标签

 在Git中打标签非常简单,首先,切换到需要打标签的分支上:

 

为test1分支打标签:

 

默认标签是打在最新提交的commit上的。有时候,如果忘了打标签,比如,现在已经是周五了,但应该在周一打的标签没有打,怎么办?

方法是找到历史提交的commit id,然后打上就可以了:

使用:git log --pretty=oneline --abbrev-commit查看commitid

 

可根据commitid创建标签:

 

再使用git tag命令查看标签:

 

注意,标签不是按时间顺序列出,而是按字母排序的。可以用git show查看标签信息:

 

还可以创建带说明的标签,使用-a指定标签名,-m指定说明文字。

   7.2 操作标签

如果标签打错了,也可以删除。

 

因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地       安全删除。

如果要推送某个标签到远程,使用命令git push origin 标签名:

 

或者一次性全部推送到远程仓库:

 

在远程仓库上查看:

 

如果标签已推送到远程,要远程删除的话,首先删除本地的标签:

 

努力到无能为力,拼搏到感动自己
原文地址:https://www.cnblogs.com/tkzm/p/11143996.html