Git基础教程

学习目标:

Git主要掌握clone(克隆),pull(拉取),push(上传),branch <分支名>(创建分支),merge(合并),add(提交到暂存区),提交到本地库(commit),rollback,就够用了,然后Git配合idea使用

目录

1.版本管理工具概念

2. 版本管理工具介绍

2.1版本管理发展简史(维基百科)

2.1.1 SVN(SubVersion)

2.1.2 Git

3. Git 工作流程

3.1 Git 初始化

3.2  git 流程

3.2.1 git工作区、暂存区和本地库

3.2.2 流程图

3.2.3 概念即详解

3.3 文件状态讲解

4.Git 基础命令行操作

4.1 介绍

4.2 环境配置

4.3 初始化本地仓库 init

4.4 克隆 clone

4.5  查看本地库状态 status

4.5.1 首次查看(工作区没有任何文件)

4.5.2 新增文件(hello.txt)

4.5.3 再次查看(检测到未追踪的文件)

4.6 add

4.7 commit

4.8 删除 rm

4.9 历史版本

4.9.1 查看历史版本

4.9.2 版本穿梭

5. 分支

5.1 什么是分支

5.2 分支的好处

5.3 分支-命令行操作

5.3.1 合并分支

5.3.2 产生冲突

5.3.3 解决冲突

6.git 远程仓库

6.1 局域网仓库

6.1.1本地相对路径,多个文件夹之间共享代码

6.1.2开启局域网共享代码

6.2 常用远程仓库托管服务

6.3 搭建仓库

6.4 利用 gitee 搭建个人主页

6.5 远程仓库-命令行操作

6.5.1 查看远程

6.5.2 添加/移除远程仓库

6.5.3 从远程仓库获取代码

7. tag

7.1 标签的概念

7.2 标签-命令行操作

8. 案例


1.版本管理工具概念

很多人大学毕业写论文的时候的时候碰到过如下的现象

<<毕业论文第一版.doc>>
<<毕业论文第二版.doc>>
<<毕业论文第三版.doc>>
<<毕业论文最终版.doc>>
<<毕业论文最终版2.doc>>

实际上,代码开发中也需要这样的软件来管理我们的代码. 例如我们经常会碰到如下的现象:

改之前好好的,改完就报错了,也没怎么修改啊

在这种情况下如果不能查看修改之前的代码,查找问题是非常困难的.

如果有一个软件能记录我们对文档的所有修改,所有版本,那么上面的问题讲迎刃而解.而这类软件我们一般叫做版本控制工具

版本管理工具一般具有如下特性:

1) 能够记录历史版本,回退历史版本
2) 团队开发,方便代码合并

2. 版本管理工具介绍

现在比较流行的版本管理工具是git ,但是实际上git 是近几年才发展起来的,可能有一些老的项目,还在用一些老的软件,比如svn

2.1版本管理发展简史(维基百科)

2.1.1 SVN(SubVersion)

工作流程

SVN是集中式版本控制系统,版本库是集中放在中央服务器的.
工作流程如下:
	1.从中央服务器远程仓库下载代码
	2.修改后将代码提交到中央服务器远程仓库

优缺点:

 优点: 简单,易操作
 缺点:所有代码必须放在中央服务器  
  	   1.服务器一旦宕机无法提交代码,即容错性较差
       2.离线无法提交代码,无法及时记录我们的提交行为

svn流程图

2.1.2 Git

工作流程

Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS),分为两种类型的仓库:
本地仓库和远程仓库
工作流程如下
    1.从远程仓库中克隆或拉取代码到本地仓库(clone/pull)
    2.从本地进行代码修改
    3.在提交前先将代码提交到暂存区
    4.提交到本地仓库。本地仓库中保存修改的各个历史版本
    5.修改完成后,需要和团队成员共享代码时,将代码push到远程仓库

总结:git和svn的区别

1. svn 是集中式版本控制工具,git 是分布式版本控制工具
2. svn 不支持离线提交,git 支持离线提交代码

3. Git 工作流程

3.1 Git 初始化

我们先初始化一个本地仓

1) 新建测试文件夹
2) 进入文件夹,然后右键创建版本库

此时 我们看到

1) 文件夹上多了一个绿色图标(如果没有请看本章节 5.3小节说明)
2) 文件夹内部生成了一个.git 隐藏文件夹(需要设置隐藏文件夹可见)

3.2  git 流程

3.2.1 git工作区、暂存区和本地库

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

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

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

  • 图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage/index),标记为 "master" 的是 master 分支所代表的目录树。

3.2.2 流程图

3.2.3 概念即详解

本地仓库:是在开发人员自己电脑上的Git仓库,存放我们的代码(.git 隐藏文件夹就是我们的本地仓库)		
远程仓库:是在远程服务器上的Git仓库,存放代码(可以是github.com或者gitee.com 上的仓库,或者自己该公司的服务器)
工作区: 我们自己写代码(文档)的地方
暂存区: 在 本地仓库中的一个特殊的文件(index) 叫做暂存区,临时存储我们即将要提交的文件
------------
Clone:克隆,就是将远程仓库复制到本地仓库
Push:推送,就是将本地仓库代码上传到远程仓库
Pull:拉取,就是将远程仓库代码下载到本地仓库,并将代码 克隆到本地工作区

3.3 文件状态讲解

Git工作目录下的文件存在两种状态:
1 untracked 未跟踪(未被纳入版本控制) :  比如新建的文件(此时文件夹上没有图标或者有一个"问号")
2 tracked 已跟踪(被纳入版本控制)     
  2.1 Staged 已暂存状态            : 添加 但未提交状态(此时文件夹上有一个"加号")
	2.2 Unmodified 未修改状态        : 已提交(此时文件夹上有一个"对号")
	2.3 Modified 已修改状态          : 修改了,但是还没有提交 (此时文件夹上有一个"红色感叹号")

这些文件的状态会随着我们执行Git的命令发生变化

4.Git 基础命令行操作

Git 的工作就是创建和保存你项目的快照及与之后的快照进行对比。

本章将对有关创建与提交你的项目快照的命令作介绍。

Git 常用的是以下 6 个命令:git clonegit pushgit addgit commitgit checkoutgit pull,后面我们会详细介绍。

说明:

  • workspace:工作区
  • staging area:暂存区/缓存区
  • local repository:版本库或本地仓库
  • remote repository:远程仓库

一个简单的操作步骤:

$ git init

$ git add .

$ git commit

  • git init - 初始化仓库。
  • git add . - 添加文件到暂存区。
  • git commit - 将暂存区内容添加到仓库中。

4.1 介绍

上述我们的操作 使用的 是客户端TortoiseGit 操作的git ,实际上底层依旧是使用的命令行帮我们执行, 在早期 git 并没有窗口化工具,开发人员只能使用命令行模式

实际上,如果你掌握并熟练使用了命令行模式操作git 的话,你会发现某些操作命令行比窗口化操作要简单

所有你在工作中会发现高深的技术人员可能会喜欢命令行模式提交git

4.2 环境配置

当安装Git后首先要做的事情是设置用户名称和email地址。这是非常重要的,因为每次Git提交都会使用该用户信息

#设置用户信息 
   git config --global user.name “Achooyo”
   git config --global user.email “1534240512@qq.com”
#查看配置信息
   git config --list
   git config user.name
#通过上面的命令设置的信息会保存在~/.gitconfig文件中

4.3 初始化本地仓库 init

# 初始化仓库带工作区
git init
# 初始化仓库不带工作区
git init --bare

4.4 克隆 clone

# 从远程仓库克隆
git clone 远程Git仓库地址 
例如: git clone https://gitee.com/itcast/gittest.git

4.5  查看本地库状态 status

# 查看状态
git status 
#查看状态 使输出信息更加简洁
git status –s

4.5.1 首次查看(工作区没有任何文件)

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master) $ git status 
On branch master 
No commits yet 
nothing to commit (create/copy files and use "git add" to track) 

4.5.2 新增文件(hello.txt)

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master) 
$ vim hello.txt
hello git! 
hello git! 

4.5.3 再次查看(检测到未追踪的文件)

3.3.3 再次查看(检测到未追踪的文件) 
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master) $ git status 
On branch master 
No commits yet 
Untracked files: 
  (use "git add <file>..." to include in what will be committed) 
        hello.txt 
nothing added to commit but untracked files present (use "git add" to track) 

4.6 add

# 将未跟踪的文件加入暂存区
git add 文件名  
# 将暂存区的文件取消暂存 (取消 add )
git reset 文件名

4.7 commit

# git commit 将暂存区的文件修改提交到本地库
git commit -m "日志信息" 文件名

4.8 删除 rm

# 从本地工作区 删除文件
git rm <文件名>  
# 如果本工作区库误删, 想要回退
git checkout head <文件名>

4.9 历史版本

4.9.1 查看历史版本

1)基本语法
git reflog 查看版本信息 
git log  查看版本详细信息

4.9.2 版本穿梭

1)基本语法 
git reset --hard 版本号

5. 分支

5.1 什么是分支

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


几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,避免影响开发主线。多线程开发,可以同时开启多个任务的开发,多个任务之间互不影响.

5.2 分支的好处

先看单线程开发

思考如下现象
    10.1 日 业务部门提出需求 : 明年 元旦3天做2个促销活动
	1) 12.31 号上线活动1, 
	2) 1.4 号上线活动2 ,同时 要求撤销 活动1
    你所在 部门领导 为了保证能顺利完成,要求 11.15 号完成 上述连个功能的开发工作
此时作为开发人员:我要面临两个文件, 活动1 的代码,即要存在(12.31 要用)又要不存在(1.4 号要求删除) ,我们怎么做?
显然比较棘手,如果使用分支(可以理解为将代码复制一份)将很好解决

同时并行推进多个功能开发,提高开发效率。

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

5.3 分支-命令行操作

# 默认 分支名称为 master
# 创建分支
git branch <分支名>
# 查看分支
git branch -v
# 切换分支 
git checkout <分支名>
# 列出所有本地分支
git branch
# 列出所有远程分支
git branch -r
# 列出所有本地分支和远程分支
git branch -a
# 删除分支(如果分支已经修改过,则不允许删除)
git branch -d  <分支名>
# 强制删除分支
git branch -D  <分支名>

# 提交分支至远程仓库
git push <仓库简称> <分支名称>	
# 合并分支 将其他分支合并至当前工作区
git merge <分支名称>
# 删除远程仓库分支
git push origin –d branchName

这里详细说一下分支合并操作中可能遇到的一个问题--合并冲突

5.3.1 合并分支

1)基本语法

git merge 分支名

2)案例实操master分支上合并hot-fix分支

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)

$ git merge hot-fix

Auto-merging hello.txt

CONFLICT (content): Merge conflict in hello.txt

Automatic merge failed; fix conflicts and then commit the result.

5.3.2 产生冲突

冲突产生的表现:后面状态为MERGING

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master|MERGING)

$ cat hello.txt

hello git! hello atguigu! 2222222222222 hello git! hello atguigu! 3333333333333 hello git!

hello git!

<<<<<<< HEAD

hello git! master test

hello git!

=======

hello git!

hello git! hot-fix test

>>>>>>> hot-fix

冲突产生的原因:

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

查看状态(检测到有文件有两处修改)

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master|MERGING) $ git status

On branch master

You have unmerged paths.

(fix conflicts and run "git commit")

(use "git merge --abort" to abort the merge)

Unmerged paths:

(use "git add ..." to mark resolution)

both modified: hello.txt

no changes added to commit (use "git add" and/or "git commit -a")

5.3.3 解决冲突

1)编辑有冲突的文件,删除特殊符号,决定要使用的内容

特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix

hello git!

hello git!

hello git! hello atguigu! master test

hello git! hello atguigu! hot-fix test

2)添加到暂存区

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master|MERGING) $ git add hello.txt

3)执行提交(注意:此时使用git commit命令时不能带文件名

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master|MERGING) $ git commit -m "merge hot-fix"

[master 69ff88d] merge hot-fix

--发现后面MERGING消失,变为正常

Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)

6.git 远程仓库

我们的代码不能总是放在本地,因为总是放在本地,一旦电脑出现故障,数据将丢失,怎么共享呢,这里我们需要一个服务器, 我们可以把代码放到服务器上,然后让别人下载,这样我们既可以备份代码,也可以进行团队协作开发

6.1 局域网仓库

实际上我们可以搭建一个单间的局域网服务器共享我们的代码

6.1.1本地相对路径,多个文件夹之间共享代码

6.1.2开启局域网共享代码

局域网这种共享是没有安全控制的,都可以访问,如果想要搭建一个可以控制权限的服务器需要借助第三方软件

gitblit,可以自行搜索搭建

6.2 常用远程仓库托管服务

除了自己搭建服务器,其实我们可以使用一些免费的远程仓库,远程仓库有很多,常见的免费互联网远程仓库托管服务如下:

www.github.com
www.gitee.com
www.gitlab.com

github  是一个基于git实现在线代码托管的仓库,向互联网开放,企业版要收钱。
gitee    即码云,是 oschina 免费给企业用的,不用自己搭建环境。
gitlab   类似 github,一般用于在企业内搭建git私服,要自己搭环境。

GitHub(gitee)、GitLab 不同点:
1、GitHub如果使用私有仓库是需要付费的,(2019年开始私有仓库也是免费的但是只能3个人协同开发,想要更多需要收费),GitLab可以在上面搭建私人的免费仓库。
2、GitLab让开发团队对他们的代码仓库拥有更多的控制,相对于GitHub,它有不少的特色:
    (1)允许免费设置仓库权限
    (2)允许用户选择分享一个project的部分代码
    (3)允许用户设置project的获取权限,进一步提升安全性
    (4)可以设置获取到团队整体的改进进度
    (5)通过innersourcing让不在权限范围内的人访问不到该资源

6.3 搭建仓库

网上都有详细教学,篇幅有点长,这里不提供介绍了

6.4 利用 gitee 搭建个人主页

1)将静态资源上传至仓库
2) 选择服务 pages 即可部署
注意 1)必须有个index.html 文件
注意 2) 只能搭建静态网站,动态网站请租赁服务器搭建提供服务
注意 3) gitee 要求必须绑定手机号

点击开启后gitee 会自动生成一个域名

直接访问即可

此时我们已经在git 上部署了一个静态的网站

6.5 远程仓库-命令行操作

6.5.1 查看远程

# 查看远程  列出指定的每一个远程服务器的简写
git remote 
# 查看远程 , 列出 简称和地址
git remote  -v  
# 查看远程仓库详细地址
git remote show  <仓库简称>

6.5.2 添加/移除远程仓库

# 添加远程仓库
git remote add <shortname> <url>
# 移除远程仓库和本地仓库的关系(只是从本地移除远程仓库的关联关系,并不会真正影响到远程仓库)
git remote rm <shortname>

6.5.3 从远程仓库获取代码

# 从远程仓库克隆
git clone <url> 
# 从远程仓库拉取 (拉取到.git 目录,不会合并到工作区,工作区发生变化)
git fetch  <shortname>  <分支名称>
# 手动合并  把某个版本的某个分支合并到当前工作区
git merge <shortname>/<分支名称>
# 从远程仓库拉取 (拉取到.git 目录,合并到工作区,工作区不发生变化) = fetch+merge
git pull  <shortname>  <分支名称>
git pull  <shortname>  <分支名称>  --allow-unrelated-histories  #  强制拉取合并

注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories ),解决此问题可以在git pull命令后加入参数--allow-unrelated-histories (如上 命令)

# 将本地仓库推送至远程仓库的某个分支
git push [remote-name] [branch-name]

7. tag

7.1 标签的概念

如果你的项目达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以给它打上标签(tag)
比如说,我们想为我们的项目发布一个"1.0"版本。 我们给最新一次提交打上(HEAD)"v1.0"的标签。
标签可以理解为项目里程碑的一个标记,一旦打上了这个标记则,表示当前的代码将不允许提交

7.2 标签-命令行操作

# 列出所有tag
git tag
# 查看tag详细信息 
git show [tagName]
# 新建一个tag
git tag [tagName]
# 提交指定tag
$ git push [仓库简称] [tagName]
# 新建一个分支,指向某个tag
$ git checkout -b [branch] [tag]
# 删除本地tag
$ git tag -d [tag]
# 删除远程tag (注意 空格)
$ git push origin :refs/tags/[tag]

8. 案例

企业中我们是如何开发的
1) 入职第一天,管理人员分配/git账号密码 
2) 开发人员下载代码即文档/ 根据文档将环境搭建成功
3) 团队一般会给你讲讲项目相关的支持
----
4) 你接到第一个需求(或者某个功能,一般要经过沟通,分析,设计...等过程)
5) 创建feature分支(一般一个需求对应一个feature,命名格式上标注该需求的id)
6) 开发需求,本地测试,提交代码到当前需求对应的feature分支,
	一般来讲为了避免将测试代码提交,需要提交前,检查如下步骤
	6.1) 是否多提交了某个文件,比如测试文件
	6.2) 是否漏提交文件
	6.3) 打开每一个应该提交的文件,判断是否多提交了一行代码,是否少提交了一行代码,是否删除了本应该存在的代码 
	检查完毕提交代码
7) 合并分支至test分支-- 测试人员会在test分支中测试
8) 测试人员测试bug ,开发者在feature分支上继续修改,提交
9) 测试人员测试通过 ,test分支会被测试人员合并到develop开发分支,再次测试
10)develop分支最终会被合并到master主分支

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值