首页 > 其他 > 详细

Git——有这一篇就够了

时间:2019-07-07 13:13:00      阅读:108      评论:0      收藏:0      [点我收藏+]

一、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 标签名:

 技术分享图片

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

 技术分享图片

在远程仓库上查看:

 技术分享图片

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

 技术分享图片

技术分享图片

 

Git——有这一篇就够了

原文:https://www.cnblogs.com/tkzm/p/11143996.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!