前言

视频1:快速学习

视频2:黑马程序员

命令练习

注:此笔记在黑马程序员共享的资料基础上,加上自己的一些理解所写,不存在侵权。

1.学习目标

  • 了解Git基本概念
  • 能够概述git工作流程
  • 能够使用Git常用命令
  • 熟悉Git代码托管服务
  • 能够使用idea操作git

学习Git,不依赖于任何的编程知识,且可以保存代码或者资料(相当于一个云盘,但比百度云盘这种更加的方便)

重点是要掌握使用idea操作Git,企业用的最多,一般不会去使用命令

2.概述

1. 开发中的实际场景

1
2
3
4
5
6
7
8
9
10
11
12
场景一:备份 
小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月 来的努力付之东流

场景二:代码还原
这个项目中需要一个很复杂的功能,老王摸索了一个星期终于有眉目了,可是这被改得面目全非的 代码已经回不到从前了。什么地方能买到哆啦A梦的时光机啊?

场景三:协同开发
小刚和小强先后从文件服务器上下载了同一个文件:Analysis.java。小刚在Analysis.java 文件中的第30行声明了一个方法,叫count(),先保存到了文件服务器上;小强在Analysis.java文件中的 第50行声明了一个方法,叫sum(),也随后保存到了文件服务器上,于是,count()方法就只存在于小刚的记 忆中了

场景四:
追溯问题代码的编写人和编写时间! 老王是另一位项目经理,每次因为项目进度挨骂之后,他都不知道该扣哪个程序员的工资!就拿这 次来说吧,有个Bug调试了30多个小时才知道是因为相关属性没有在应用初始化时赋值!可是二胖、王东、刘 流和正经牛都不承认是自己干的!

2. 版本控制器的方式

1
2
3
4
5
6
a、集中式版本控制工具 
集中式版本控制工具,版本库是集中存放在中央服务器的,team里每个人work时从中央服务器下载代码,是必须联网才能工作,局域网或互联网。个人修改后然后提交到中央版本库。 举例:SVN和CVS

b、分布式版本控制工具
分布式版本控制系统没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样工作的时候,无需联网了,因为版本库就在你自己的电脑上。多人协作只需要各自的修改推送给对方,就能互相看到对方的 修改了。举例:Git

集中式版本控制的缺点:

需要联网,中央服务器磁盘损坏,项目会彻底崩溃

3. Git

Git是一个分布式版本管理系统,他通过共享版本库来共享版本信息,所以相当于每个开发人员的本地都有一个共享版本库的拷贝,所有人员的本地版本库和共享版本库都是同步的,所以不用担心共享版本库宕机的问题,只要拿一个开发人员的本地版本库传到共享版本库就好了,开发人员之间可以直接交换版本信息,但是这种方式不常用,我们一般还是通过共享版本库实现共享,这样所有的人员都可以共享到版本信息,无需联网了,因为版本库就在你自己的电脑上,但是要实现版本共享的时候还是需要联网的,自己开发的时候不需要联网。

4. Git工作流程

1.png

命令如下:

  1. clone(克隆): 从远程仓库中克隆代码到本地仓库
  2. checkout (检出):从本地仓库中检出一个仓库分支然后进行修订
  3. add(添加): 在提交前先将代码提交到暂存区
  4. commit(提交): 提交到本地仓库。本地仓库中保存修改的各个历史版本
  5. fetch (抓取) : 从远程库,抓取到本地仓库,不进行任何的合并动作,一般操作比较少。
  6. pull (拉取) : 从远程库拉到本地库,自动进行合并(merge),然后放到到工作区,相当于fetch+merge
  7. push(推送) : 修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库

3.Git安装与配置

本教程里的git命令例子都是在Git Bash中演示的,会用到一些基本的linux命令,在此为大家提前列举:

  • ls/ll 查看当前目录 ll是查看当前文件夹下的所有文件,包括隐藏文件
  • cat 查看文件内容
  • touch 创建文件
  • vi vi编辑器(使用vi编辑器是为了方便展示效果,可以记事本、editPlus、notPad++等其它编辑器)

1. 下载与安装

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

备注:

Git GUI:Git提供的图形界面工具

Git Bash:Git提供的命令行工具

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

Git版本控制要记录哪个人什么时候做了什么事情,Git就是通过邮箱去辨识是哪个人的

2. 基本配置

  1. 打开Git Bash

  2. 设置用户信息

    git config –global user.name “hbk”

    git config –global user.email “hello@itcast.cn

    注:邮箱可以是假邮箱

  3. 查看配置信息

    git config –global user.name

    git config –global user.email

1. 为常用指令配置别名(可选)

有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。

  1. 打开用户目录,创建 .bashrc 文件

    打开Git Bash,执行 touch ~/.bashrc

  2. 在 .bashrc 文件中输入如下内容:

1
2
3
4
5
#用于输出git提交日志 
alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
#用于输出当前目录所有文件及基本信息
alias ll='ls -al'

  1. 打开Git Bash,执行 source ~/.bashrc

2. 解决GitBash乱码问题(可选)

  1. 打开GitBash执行下面命令
1
git config --global core.quotepath false
  1. ${git_home}/etc/bash.bashrc 文件最后加入下面两行
1
2
export LANG="zh_CN.UTF-8" 
export LC_ALL="zh_CN.UTF-8"

4.Git本地仓库

要使用Git对我们的代码进行版本控制,首先需要获得本地仓库

1
2
3
4
5
6
7
8
1)在电脑的任意位置创建一个空目录,作为我们的本地Git仓库

2)进入这个目录中,点击右键打开Git Bash窗口

3)执行命令
git init

4)如果创建成功后,可在文件夹下看到隐藏的.git目录。

1. 基础操作命令(重要)

Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行Git的命令而发生变化。

2.png

工作区,就是平时存放项目代码的地方。

  1. git add (工作区 –> 暂存区)
  2. git commit (暂存区 –> 本地仓库)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
命令:

1.工作区 --> 暂存区(包括.gitignore和以点开头的任何其他内容)
git add .

2.暂存区 --> 本地仓库
git commit -m "注释内容"

3.查看修改的状态
git status

4.查看提交日志
git log [option]
options:
--all 显示所有分支
--pretty=oneline 将提交信息显示为一行
--abbrev-commit 使得输出的commitId更简短
--graph 以图的形式显示
注:配置别名为git-log,然后加上所有参数即可

5.版本回退
git reset --hard commitID
注:commitID 可以使用 git-log 或 git log 指令查看

6.查看已经删除的记录
git reflog

7.添加文件至忽略列表
工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件。
实例:
# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

练习:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#####################仓库初始化######################
# 创建目录(git_test01)并在目录下打开gitbash


# 初始化git仓库
git init

#####################创建文件并提交#####################
# 目录下创建文件 file01.txt
touch ~/file01.txt

# 将修改加入暂存区
git add .

# 将修改提交到本地仓库,提交记录内容为:commit 001
git commit -m 'commit 001'

# 查看日志
git log

####################修改文件并提交######################
# 修改file01的内容为:count=1
vim file01

# 将修改加入暂存区
git add .

# # 将修改提交到本地仓库,提交记录内容为:update file01
git commit -m 'update file01'

# 查看日志
git log

# 以精简的方式显示提交记录
git-log

####################将最后一次修改还原##################
# 查看提交记录
git-log

# 找到倒数第2次提交的commitID


# 版本回退
git reset commitID --hard

2. 分支

几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离 开来进行重大的Bug修改、开发新的功能,以免影响开发主线。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1.查看本地分支
git branch

2.创建本地分支
git branch 分支名
3.切换分支(checkout)
git checkout 分支名

4.创建并切换分支(相当于2,3)
git checkout -b 分支名

5.合并分支(merge):先到目标分支上
git merge 分支名称

6.删除分支:不能删除当前分支,只能删除其他分支
git branch -d b1 删除分支时,需要做各种检查
git branch -D b1 不做任何检查,强制删除

解决冲突

当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:

其实我们就是直接手动去删除文件中的一个分支,留下一个分支,这样就不会冲突了

  • 处理文件中冲突的地方
  • 将解决完冲突的文件加入暂存区(add)
  • 提交到仓库(commit)

开发中分支使用原则与流程

  • master (生产) 分支

    线上分支,主分支,中小规模项目作为线上运行的应用对应的分支;

  • develop(开发)分支

    是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线。要求,都可以在此版本进行开发,阶段开发完成后,需要是合并到master分支,准备上线。

    注:develop和master分支是不可删除的

  • feature/xxxx分支(用完可删)

    从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支,用完后可删除。

  • hotfifix/xxxx分支

    从master派生的分支,一般作为线上bug修复使用,修复测试完成后需要合并到master、test、develop分支。

  • 还有一些其他分支,在此不再详述,例如test分支(用于代码测试)、pre分支(预上线分支)等等。

3.png

3. 练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
##########################创建并切换到dev01分支,在dev01分支提交
# [master]创建分支dev01
git branch dev01

# [master]切换到dev01
git checkout dev01

# [dev01]创建文件file02.txt
touch ~/file02.txt

# [dev01]将修改加入暂存区并提交到仓库,提交记录内容为:add file02 on dev
git add .
git commit -m 'add file02 on dev'

# [dev01]以精简的方式显示提交记录
git-log

###########################切换到master分支,将dev01合并到master分支
# [dev01]切换到master分支
git checkout master

# [master]合并dev01到master分支
git merge dev01

# [master]以精简的方式显示提交记录
git-log

# [master]查看文件变化(目录下也出现了file02.txt)

##########################删除dev01分支
# [master]删除dev01分支
git branch -d dev01
# [master]以精简的方式显示提交记录
git-log

5.Git远程仓库(GitHub)

1. 连接远程仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
1.配置SSH密钥
ssh-keygen -t rsa
一直回车

2.cat ~/.ssh/id_tsa.pub
复制到GitHub的SSH公钥中

3.验证是否配置成功
ssh -T git@github.com

4.添加远程仓库
git remote add origin git@gitee.com:czbk_zhang_meng/git_test.git

5.查看远程仓库
git remote

6.推送到远程仓库
git push [-f] [--set-upstream] [远端名称 [本地分支名][:远端分支名] ]
如果远程分支名和本地分支名称相同,则可以只写本地分支
git push origin master
-f 表示强制覆盖
--set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。
git push --set-upstream origin master
如果当前分支已经和远端分支关联,则可以省略分支名和远端名。
git push 将master分支推送到已关联的远端分支。

7.本地分支与远程分支的关联关系
git branch -vv

8.从远程仓库克隆
git clone <仓库路径> [本地目录]
本地目录可以省略,会自动生成一个目录

9.从远程仓库中抓取和拉取

抓取:将仓库里的更新都抓取到本地,不会进行合并
git fetch [remote name] [branch name]
如果不指定远端名称和分支名,则抓取所有分支。

拉取:
git pull [remote name] [branch name]
拉取指令就是将远端仓库的修改拉到本地并自动进行合并,等同于fetch+merge
如果不指定远端名称和分支名,则抓取所有并更新当前分支。

2. 解决合并冲突

在一段时间,A、B用户修改了同一个文件,且修改了同一行位置的代码,此时会发生合并冲突。 A用户在本地修改代码后优先推送到远程仓库,此时B用户在本地修订代码,提交到本地仓库后,也需要 推送到远程仓库,此时B用户晚于A用户,故需要先拉取远程仓库的提交,经过合并后才能推送到远端分 支,如下图所示。

4.png

在B用户拉取代码时,因为A、B用户同一段时间修改了同一个文件的相同位置代码,故会发生合并冲突。

远程分支也是分支,所以合并时冲突的解决方式也和解决本地分支冲突相同相同,在此不再赘述,需要自己练习。

3. 练习

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#########################1-将本地仓库推送到远程仓库
# 完成4.1、4.2、4.3、4.4的操作

# [git_test01]添加远程仓库
git remote add origin git@gitee.com/**/**.git
# [git_test01]将master分支推送到远程仓库,并与远程仓库的master分支绑定关联关系
git push --set-upstream origin master
###########################2-将远程仓库克隆到本地
# 将远程仓库克隆到本地git_test02目录下
git clone git@gitee.com/**/**.git git_test02
# [git_test02]以精简的方式显示提交记录
git-log
###########################3-将本地修改推送到远程仓库
# [git_test01]创建文件file03.txt

# [git_test01]将修改加入暂存区并提交到仓库,提交记录内容为:add file03
git add .
git commit -m 'add file03'
# [git_test01]将master分支的修改推送到远程仓库
git push origin master
###########################4-将远程仓库的修改更新到本地
# [git_test02]将远程仓库修改再拉取到本地
git pull
# 以精简的方式显示提交记录
git-log
# 查看文件变化(目录下也出现了file03.txt)