学习视频&资料来源
http://www.atguigu.com/
学习大纲
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vOmVXfWo-1590408187621)(git的学习.assets/image-20200524135421611.png)]
版本控制
版本控制工具应该具备的功能
-
协同修改
-
多人并行不悖的修改服务器端的同一个文件。
-
数据备份
-
不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
-
版本管理
-
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空
间,提高运行效率。这方面SVN 采用的是增量式管理的方式,而Git 采取了文
件系统快照的方式。
-
-
权限控制
-
对团队中参与开发的人员进行权限控制。
-
对团队外开发者贡献的代码进行审核——Git 独有。
-
-
历史记录
- 查看修改人、修改时间、修改内容、日志信息。
- 将本地文件恢复到某一个历史状态。
-
分支管理
- 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。
版本控制工具介绍
版本控制简介
- 工程设计领域中使用版本控制管理工程蓝图的设计过程。在IT 开发过程中也可以使用版本控制思想管理代码的版本迭代。
版本控制工具
思想:版本控制
实现:版本控制工具
-
集中式版本控制工具:CVS、SVN、VSS……
-
缺点:所有的文件数据都保存在服务器上,本地只保存一部分数据,一旦服务器损坏,所有数据都会丢失,本地仅存的数据也没有任何保存的意义了(单点故障)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kLvVsXo7-1590408187624)(git的学习.assets/image-20200524142649368.png)]
-
-
分布式版本控制工具:Git、Mercurial、Bazaar、Darcs……
-
优点:本地就是一个文件的所有历史版本,为了数据共享,可以将本地仓库上传到远程仓库中,实现数据的共享。这么上传的好处也是数据的多重备份。(解决单点故障问题)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41lKCXjU-1590408187626)(git的学习.assets/image-20200524143025518.png)]
-
Git 历史&架构&使用场景
Git 简介
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wpJRWGxR-1590408187628)(git的学习.assets/image-20200524143321530.png)]
Git官网
官网地址:https://git-scm.com/
Git优势
-
大部分操作在本地完成,不需要联网
-
完整性保证
- Git 会对每次提交的数据进行hash 的计算,不管数据多大,经过hash计算得出的结果都是固定位数的。相同的数据无论经过多少次hash,结果都是一样的。通过这一计算就能保证数据的完整性。
-
尽可能添加数据而不是删除或修改数据
-
分支操作非常快捷流畅
- 创建分支,切换分支其实是创建、切换指针。
-
与Linux 命令全面兼容
安装Git
一致下一步就行了,网上一大堆,这里就不说了。
Git 架构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ShcfYcs9-1590408187629)(git的学习.assets/image-20200524144655284.png)]
Git 和 代码托管中心(远程仓库)
代码托管中心的任务:维护远程库。简单来说就是数据的共享多重已经备份
本地库和远程库
我们安装了git,使用git init 就会创建出一个本地库,这个本地库包含当前目录下面的所有变化。远程库就是GitHub和码云,我们可以将本地库上传到远程库实现数据的多重备份。
团队内部协作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wuzlH8Et-1590408187630)(git的学习.assets/image-20200524145451859.png)]
- git init 生成本地库。
- git push 将本地库上传到远程库中。
- 假如本地库文件意外丢失,可以使用clone 将远程库的内容直接复制下来。
- 当前本地库和远程库有联系时,我们对系统增加了功能,我们可以使用push 上传本地库文件到远程库中。
- 当前本地库和远程库有联系时,远程库的代码被别人修改过,我们想获取最新的代码,我们可以使用pull 拉取代码。
跨团队协作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wABIYZCB-1590408187631)(git的学习.assets/image-20200524145948654.png)]
场景:1号需要添加业务功能,但是自己不会,需要请求别人帮忙开发。
- 3号人物可以帮助开发功能,通过fork 复制岳不群的远程仓库,变成自己的远程库。
- 3号人物clone 远程仓库到本地,对项目增加功能之后,使用push将本地仓库上传到自己的远程仓库。
- 3号人物再使用pull request ,就是把自己的远程仓库推送给别人的远程仓库中,对方可以检查代码的不同,检查无误后可以使用merge 合并分支(合并自己想添加的代码)。
- 1号人物经过merge 合并分支后,在使用pull 就能从远程仓库获取最新的代码到本地。或者直接clone 一份新的。
Git 命令行操作
本地库操作
本地库初始化
# 命令脚本
(base) MBP:GitStudy haitao$ mkdir ~/Desktop/GitStudy/demo1
(base) MBP:GitStudy haitao$ cd ~/Desktop/GitStudy/demo1/
(base) MBP:demo1 haitao$ pwd
/Users/haitao/Desktop/GitStudy/demo1
(base) MBP:demo1 haitao$ ls -la
(base) MBP:demo1 haitao$ git init
已初始化空的 Git 仓库于 /Users/haitao/Desktop/GitStudy/demo1/.git/
(base) MBP:demo1 haitao$ ls -al
(base) MBP:demo1 haitao$ cd .git/
(base) MBP:.git haitao$ ls -al
# 特别注意:.git 里面的文件,别瞎搞,什么都不动即可。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AG3WznKI-1590408187632)(git的学习.assets/image-20200524154334350.png)]
设置签名
-
格式
- 用户名: haitao
- Email 地址:xxx@atguigu.com
-
作用
- 区别不同开发人员的身份
-
注意:
- 这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系。
-
命令
-
通常情况下,都是安装了git之后设置一下全局的用户信息。这东西没人会一天改一次。
-
项目级别/仓库级别:仅在当前本地库范围内有效(就是git init 所在的目录访问内有效)。
git config user.name tom_pro git config user.email goodMorning_pro@atguigu.com
-
系统用户级别:登录当前操作系统的用户范围。
git config --global user.name tom_glb git config --global goodMorning_pro@atguigu.com
-
级别优先级:
- 项目级别优先于系统用户级别,二者都有时采用项目级别的签名
- 如果只有系统用户级别的签名,就以系统用户级别的签名为准
- 二者都没有不允许
-
实操
# 创建项目级别的签名 (base) MBP:demo1 haitao$ git config user.name test1 user.email (base) MBP:demo1 haitao$ git config user.email test1@qq.com (base) MBP:demo1 haitao$ cat .git/config # 可以看到 当前本地仓库里面的.git/config 里面能看到我们设置的签名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OtOjRpkE-1590408187632)(git的学习.assets/image-20200524155638102.png)]
# 创建系统用户界别的签名 (base) MBP:demo1 haitao$ git config --global user.name test2 (base) MBP:demo1 haitao$ git config --global user.email test2@qq.com (base) MBP:demo1 haitao$ cat .git/config # 查看当前本地仓库里面的.git/config 并没有发现我们设置的签名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u0ZP10qC-1590408187633)(git的学习.assets/image-20200524160007360.png)]
# 系统用户级别的签名信息保存位置 (base) MBP:demo1 haitao$ cat ~/.gitconfig # 可以看到系统用户界别的签名信息保存的位置是,当前用户家目录下的 .gitconfig 文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jLqXIgte-1590408187634)(git的学习.assets/image-20200524160317262.png)]
-
基本操作
命令详细
-
git status
查看工作区、暂存区状态
-
添加
git add [file name]
将工作区的“新建/修改”添加到暂存区
-
提交
git commit -m “commit message” [file name]
将暂存区的内容提交到本地库
-
查看历史记录操作
git reflog 最常用的
# 查看日志 # 多屏显示控制方式: # 空格向下翻页 # b 向上翻页 # q 退出 git log # 一条提交只显示一行 git log --pretty=oneline # 一条提交只显示一行,hash值简写 git log --oneline # 一条提交只显示一行,hash值简写,显示状态 git reflog
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XAmMB4Z3-1590408187635)(git的学习.assets/image-20200524173301512.png)]
git status
# 查看工作区,暂存区的状态
(base) MBP:demo1 haitao$ git status
# git add 大白话就是让git 管理这个文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gsAV3Fpv-1590408187636)(git的学习.assets/image-20200524160727400.png)]
创建一个文件,在执行git status 命令
(base) MBP:demo1 haitao$ cat>>good.txt<<EOF
> 1111
> 222
> 333
> EOF
(base) MBP:demo1 haitao$ git status
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VFz9yiv2-1590408187636)(git的学习.assets/image-20200524161616635.png)]
git add
将文件添加到暂存区, git add xx
(base) MBP:demo1 haitao$ git add good.txt
(base) MBP:demo1 haitao$ git status
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1D3uVxO3-1590408187637)(git的学习.assets/image-20200524161841865.png)]
git rm --cached
将文件从暂存区中移除, git rm --cached xx
(base) MBP:demo1 haitao$ git rm -caceh good.txt
(base) MBP:demo1 haitao$ git status
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x5swHKLB-1590408187638)(git的学习.assets/image-20200524162441251.png)]
git comit -m “” [file]
将文件添加到暂存处,然后提交暂存区的文件到本地库(只有暂存区有东西才能提交)
# git 支持正则表达式,实现对多个文件执行操作
(base) MBP:demo1 haitao$ git add *.txt
(base) MBP:demo1 haitao$ git commit
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TsV8nleA-1590408187638)(git的学习.assets/image-20200524162810107.png)]
# 第二种commit 的方式,这样子就不需要进入vim编辑器输入我们的备注信息
(base) MBP:demo1 haitao$ git commit -m "xxx"
# 如果你只想提交暂存区的一部分内容到本地库中
(base) MBP:demo1 haitao$ git commit good.txt # 只将暂存区里面的good.txt 提交到本地库中
(base) MBP:demo1 haitao$ git commit -m "xxx" good.txt
对我们的good.txt 进行修改(随便添加点东西),在查看当前工作区的状态
(base) MBP:demo1 haitao$ vim good.txt
(base) MBP:demo1 haitao$ git status
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w0DlMlQy-1590408187639)(git的学习.assets/image-20200524164448843.png)]
(base) MBP:demo1 haitao$ git add good.txt
(base) MBP:demo1 haitao$ git commit -m "second commit,modify good.txt"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9woq6an5-1590408187641)(git的学习.assets/image-20200524164540044.png)]
git reflog
我们先随便提交几次,在查看提交日志,使用 git reflog
(base) MBP:demo1 haitao$ git reflog
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iVES3XmD-1590408187642)(git的学习.assets/image-20200524173551996.png)]
版本前进后退
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q0X9ObdP-1590408187643)(git的学习.assets/image-20200524174258677.png)]
- 基于索引值操作[推荐]
- git reset --hard [局部索引值]
- git reset --hard a6ace91
- git reset --hard HEAD # 直接回到顶级节点
- 使用^符号:只能后退
- git reset --hard HEAD^
- 注:一个^表示后退一步,n 个表示后退n 步
- 使用~符号:只能后退
- git reset --hard HEAD~n
- 注:表示后退n 步
reset 命令的三个参数对比
–soft :仅仅在本地库移动HEAD 指针。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IdLJjq00-1590408187644)(git的学习.assets/image-20200524180819478.png)]
–mixed :在本地库移动HEAD 指针,重置暂存区。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a4wJDWK5-1590408187644)(git的学习.assets/image-20200524180854174.png)]
–hard:在本地库移动HEAD 指针,重置暂存区,重置工作区。(最常用的)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6ku5PM8c-1590408187645)(git的学习.assets/image-20200524180919089.png)]
其实git reset 还有很多参数,但是最常用的还是–hard
# 查看 git reset 的使用文档
(base) MBP:demo1 haitao$ git reset --help
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XxdxDbTp-1590408187646)(git的学习.assets/image-20200524174956564.png)]
# 可以看到除了--hard 之后,还有--soft,--mixed,--merge,--keep
-- soft
# 如果我们切换的两个版本里面的文件发生了变化,变化内容直接存入暂存区。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tIAKCct8-1590408187647)(git的学习.assets/image-20200524175432443.png)]
-- mixed
# 如果我们切换的两个版本里面的文件发生了变化,变化的内容存在工作区中,并未添加到暂存区。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hAun9dDc-1590408187647)(git的学习.assets/image-20200524175634634.png)]
删除文件并找回
- 前提:删除前,文件存在时的状态提交到了本地库。
- 操作:git reset --hard [指针位置]
- 删除操作已经提交到本地库:指针位置指向历史记录
- 删除操作尚未提交到本地库:指针位置使用HEAD
# 创建文件,然后提交
(base) MBP:demo1 haitao$ touch test.txt
(base) MBP:demo1 haitao$ git add test.txt
(base) MBP:demo1 haitao$ git commit -m "touch test.txt"
# 删除文件,然后提交
(base) MBP:demo1 haitao$ rm test.txt
(base) MBP:demo1 haitao$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add/rm <文件>..." 更新要提交的内容)
(使用 "git restore <文件>..." 丢弃工作区的改动)
删除: test.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
(base) MBP:demo1 haitao$ git commit -a -m "删除 test.txt"
# 查看当面目录,发现文件已经不存在了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KKetG9DK-1590408187648)(git的学习.assets/image-20200524181809468.png)]
# 回推到上一个版本(我们在上一个版本创建了刚才被删除的文件)
(base) MBP:demo1 haitao$ git reset --hard HEAD^
# 可以发现文件又回来了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0PRrx69-1590408187649)(git的学习.assets/image-20200524181909133.png)]
比较文件差异
- git diff [文件名]
- 将工作区中的文件和暂存区进行比较
- git diff [本地库中历史版本] [文件名]
- 将工作区中的文件和本地库历史记录比较
- 不带文件名比较多个文件
直接给文件添加内容
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yi5Qj38x-1590408187649)(git的学习.assets/image-20200524182404953.png)]
提交至暂存处再次比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bEadjo0X-1590408187650)(git的学习.assets/image-20200524182503245.png)]
修改本地文件,在diff 查看一下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FSlqHyHV-1590408187651)(git的学习.assets/image-20200524182645330.png)]
和历史版本进行比较
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6eHRiC4z-1590408187651)(git的学习.assets/image-20200524182724547.png)]
不指定文件名,就会比较全部文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NnkDz2NE-1590408187652)(git的学习.assets/image-20200524182843632.png)]
分支管理
什么是分支
在版本控制过程中,使用多条线同时推进多个任务。(开发的时候不想污染主分支)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYu4E8Rl-1590408187652)(git的学习.assets/image-20200524200622250.png)]
分支的好处
-
同时并行推进多个功能开发,提高开发效率。
-
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任
何影响。失败的分支删除重新开始即可。
分支操作
# 查看所有的分支
(base) MBP:demo1 haitao$ git branch -a
# 创建分支
(base) MBP:demo1 haitao$ git branch hot_fix
# 删除分支
(base) MBP:demo1 haitao$ git branch -D hot_fix2
# 切换分支
(base) MBP:demo1 haitao$ git checkout hot_fix
# 切换分支,如果没有创建并切换分支
(base) MBP:demo1 haitao$ git checkout -b hot_fix1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2op4hmpU-1590408187653)(git的学习.assets/image-20200524200851509.png)]
合并分支
-
第一步:切换到接受修改的分支(被合并,增加新内容)上
git checkout [被合并分支名]
-
第二步:执行merge 命令
git merge [有新内容分支名]
# 创建并切换分支,增加内容,然后提交
(base) MBP:demo1 haitao$ git checkout -b hot_fix
(base) MBP:demo1 haitao$ vim test.txt
(base) MBP:demo1 haitao$ git add .
(base) MBP:demo1 haitao$ git commit -m "修复bug"
# 切换到master分支(给master增加hot_fix 增加的内容)
(base) MBP:demo1 haitao$ git checkout master
(base) MBP:demo1 haitao$ git merge hot_fix
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9WbVKR4R-1590408187654)(git的学习.assets/image-20200524202233202.png)]
解决冲突
-
冲突的表现
- 两个分支都修改的是同一个文件的同一个位置,那么合并这两个分支,git应该使用哪个分支的为主,这就是分支的冲突。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZTcS3YXL-1590408187654)(git的学习.assets/image-20200524203627083.png)]
-
冲突的解决
-
第一步:编辑文件,删除特殊符号
-
第二步:把文件修改到满意的程度,保存退出
-
第三步:git add [文件名]
-
第四步:git commit -m “日志信息”
-
注意:此时commit 一定不能带具体文件名
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5uENLyIu-1590408187655)(git的学习.assets/image-20200524203109250.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RkqBjTMO-1590408187657)(git的学习.assets/image-20200524203225303.png)]
合并冲突
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-50bEz5tG-1590408187657)(git的学习.assets/image-20200524203612052.png)]
解决冲突
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g722aBed-1590408187658)(git的学习.assets/image-20200524204123233.png)]
-
Git 原理
哈希
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tiyD1nm-1590408187659)(git的学习.assets/image-20200524204536806.png)]
- 哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下
几个共同点:
①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。
②哈希算法确定,输入数据确定,输出数据能够保证不变
③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
④哈希算法不可逆
-
Git 底层采用的是SHA-1 算法。
-
哈希算法可以被用来验证文件。原理如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YVQ8WM1L-1590408187659)(git的学习.assets/image-20200524204911961.png)]
Git 就是靠这种机制来从根本上保证数据完整性的。
Git 保存版本的机制
-
集中式版本控制工具的文件管理机制
以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0sg6lu99-1590408187660)(git的学习.assets/image-20200524205204902.png)]
-
Git 的文件管理机制(其实就是链条)
Git 把数据看作是小型文件系统的一组快照。每次提交更新时Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以Git 的工作方式可以称之为快照流。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sqvn2h1O-1590408187661)(git的学习.assets/image-20200524205604337.png)]
-
Git 文件管理机制细节
Git 的 “提交对象”
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bvqIfA8o-1590408187661)(git的学习.assets/image-20200524205910858.png)]
提交对象及其父对象形成的链条
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AYlMkQkV-1590408187662)(git的学习.assets/image-20200524205950748.png)]
各个提交对象通过parent属性建立的紧密的连接。
Git 分支管理机制
分支的创建(创建指针)
只是新创建了一个指针指向同一个对象。不是拷贝一份文件,效率极高(SVN 是拷贝一份)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TLNFbxAZ-1590408187663)(git的学习.assets/image-20200524210437274.png)]
分支的切换(切换指针)
只是简单的移动HEAD 指针,效率极高。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pbbiOFd7-1590408187664)(git的学习.assets/image-20200524210512003.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sifacHmr-1590408187664)(git的学习.assets/image-20200524210647803.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-skt56TaY-1590408187665)(git的学习.assets/image-20200524210732268.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1P4G0y71-1590408187665)(git的学习.assets/image-20200524210828340.png)]
Git 远程操作(GitHub,码云)
访问github,创建一个账号,登录到github上。
为了方便演示最少需要创建两个github的账户。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Edt9H6QV-1590408187667)(git的学习.assets/image-20200524145451859.png)]
创建一个本地库
(base) MBP:GitStudy haitao$ mkdir demo2
(base) MBP:GitStudy haitao$ cd demo2
(base) MBP:demo2 haitao$ pwd
(base) MBP:demo2 haitao$ git init
(base) MBP:demo2 haitao$ vim a.txt
(base) MBP:demo2 haitao$ git add .
(base) MBP:demo2 haitao$ git commit -m "test github"
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YwKZ95yX-1590408187668)(git的学习.assets/image-20200524211652843.png)]
创建远程库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nqEEXFFT-1590408187668)(git的学习.assets/image-20200524212113342.png)]
推送本地库到远程
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vm7ptMsk-1590408187669)(git的学习.assets/image-20200524212349284.png)]
# 由于地址很长,我们每次输入都很费劲。git 也提供了记录地址的机制
# 注意 git remote 里面存储的数据是本地仓库的,不是全局的。
(base) MBP:demo2 haitao$ git remote -v # 查看本地记录了哪些地址
(base) MBP:demo2 haitao$ git remote add oringin https://github.com/haitaoss/demo2.git # 创建一个记录,oringin是key 后面的是value。以后使用oringin 就是地址
(base) MBP:demo2 haitao$ git remote -v
oringin https://github.com/haitaoss/demo2.git (fetch) # 从远程提取代码
oringin https://github.com/haitaoss/demo2.git (push) # 推送到远程仓库
# 推送代码都远程仓库
(base) MBP:demo2 haitao$ git push oringin master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VDRHA0E0-1590408187669)(git的学习.assets/image-20200524213047502.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSZtOnja-1590408187670)(git的学习.assets/image-20200524213208637.png)]
克隆远程仓库到本地
# 创建空目录,clone 远程仓库到本地
(base) MBP:demo2 haitao$ pwd
/Users/haitao/Desktop/GitStudy/demo2
(base) MBP:demo2 haitao$ mkdir ../demo03
(base) MBP:demo2 haitao$ cd ../demo03
(base) MBP:demo03 haitao$ git clone https://github.com/haitaoss/demo2.git
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g3HAzZwT-1590408187670)(git的学习.assets/image-20200524213410900.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wZxwAIJt-1590408187671)(git的学习.assets/image-20200524213458624.png)]
# git很智能,clone 下来会自动帮我们添加一个remote 的key
(base) MBP:demo03 haitao$ git remote -v
origin https://github.com/zsh-users/zsh-syntax-highlighting.git (fetch)
origin https://github.com/zsh-users/zsh-syntax-highlighting.git (push)
# 删除电脑保存的密码,就是你输入了一次github的账号密码之后,电脑就帮你记住了。为了测试重新登录一个账号,我们需要删除电脑上保存的密码信息。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2AZYBth4-1590408187672)(git的学习.assets/image-20200525114740922.png)]
# clone 仓库到本地,做一次提交,然后push 推送到远程仓库
(base) MBP:demo03 haitao$ git clone https://github.com/haitaoss/demo2.git
(base) MBP:demo2 haitao$ vim a.txt
(base) MBP:demo2 haitao$ git add *
(base) MBP:demo2 haitao$ git commit -m "测试邀请团队"
(base) MBP:demo2 haitao$ git remote -v
(base) MBP:demo2 haitao$ git push origin master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qpj7bomD-1590408187672)(git的学习.assets/image-20200525113826282.png)]
团队成员邀请
如果出现没有权限,我们应该邀请成员一起开发我们的项目。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-on0iP9fe-1590408187673)(git的学习.assets/image-20200524215007166.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GbQFSEyF-1590408187674)(git的学习.assets/image-20200525114133015.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10jgXsgn-1590408187674)(git的学习.assets/image-20200525114331022.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gt21xaHI-1590408187675)(git的学习.assets/image-20200525114548149.png)]
# 再次测试push 代码
(base) MBP:demo2 haitao$ git push origin master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ysT4BEhB-1590408187675)(git的学习.assets/image-20200525114700544.png)]
pull命令使用&说明
pull 拉取
- pull=fetch+merge
- 如果项目变更很大,我们可以先抓取远程仓库的某一分支下来,在手动merge
- git fetch [远程库地址别名] [远程分支名]
- git merge [远程库地址别名/远程分支名]
- 如果不存在版本冲突问题,直接pull 一步到位
- git pull [远程库地址别名] [远程分支名]
- 如果项目变更很大,我们可以先抓取远程仓库的某一分支下来,在手动merge
实操
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PkhaQOEo-1590408187676)(git的学习.assets/image-20200524215823290.png)]
# 查看本地库文件
# 使用fetch 抓取远程分支到本地
(base) MBP:demo2 haitao$ git remote -v
oringin https://github.com/haitaoss/demo2.git (fetch)
oringin https://github.com/haitaoss/demo2.git (push)
(base) MBP:demo2 haitao$ git fetch oringin master
(base) MBP:demo2 haitao$ git checkout oringin/master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IC86nwTi-1590408187676)(git的学习.assets/image-20200524220124751.png)]
# 切换回本地的master 分支,执行merge操作
(base) MBP:demo2 haitao$ git checkout master
已经位于 'master'
(base) MBP:demo2 haitao$ git branch -v
* master 9ac6153 test github
(base) MBP:demo2 haitao$ git merge oringin/master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nK64Rczd-1590408187677)(git的学习.assets/image-20200524220413942.png)]
# 直接使用pull
(base) MBP:demo2 haitao$ git pull oringin master
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uSkiMoea-1590408187678)(git的学习.assets/image-20200524220758925.png)]
测试远程查库的冲突
实际情况:A,B都从远程仓库,clone 代码到本地。A对文件进行了修改,并成功push到远程。然后B 添加完功能后也想push 到远程仓库,发现被拒绝。这是远程仓库的合并冲突问题。解决办法只能是B 现在远程代码 fetch 下来,然后在本地merge,在将merge的结果push 到远程仓库。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EGJtKNXN-1590408187678)(git的学习.assets/image-20200525115906369.png)]
解决冲突
# 我们先fetch,在merge,merge出现冲突就手动解决冲突在commit,最后push代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtnyuRQy-1590408187679)(git的学习.assets/image-20200525120520683.png)]
解决冲突
-
要点
- 如果不是基于GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
- 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
-
类比
-
债权人:老王
-
债务人:小刘
-
老王说:10 天后归还。小刘接受,双方达成一致。
-
老王媳妇说:5 天后归还。小刘不能接受。老王媳妇需要找老王确认后再执行。
-
跨团队协作操作演示
场景:岳不群(haitaoss)的公司想增加功能但是不会,另外一家公司的东方不败(haitaoss2)可以帮忙增加功能,但是不能跳槽到岳不群的公司。所以东方不败想帮忙开发功能,就得先fork 复制岳不群的远程仓库为自己的,这样子她就能随心所欲的操作了。她先把仓库clone到本地,修改代码码commit之后push到远程仓库。然后东方不败在执行pull request操作。东方不败成功执行pull request之后,岳不群就能在远程仓库看到一个pull request。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWZUHAu2-1590408187680)(git的学习.assets/image-20200525120836762.png)]
由于我们这里只有两个账户,所以只能先把之前的haitaoss2,移除团队,你在注册一个账号也是可以的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kg3nNygD-1590408187680)(git的学习.assets/image-20200525121406658.png)]
登录haitaoss2 的github,然后访问haitaoss的仓库,fork haitaoss 的仓库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d1wRONx8-1590408187681)(git的学习.assets/image-20200525124154129.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FtPisbNY-1590408187681)(git的学习.assets/image-20200525124319612.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JT3506Ic-1590408187682)(git的学习.assets/image-20200525124440988.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Shf55hYf-1590408187683)(git的学习.assets/image-20200525124553185.png)]
haitaoss2 clone项目到本地,添加功能,然后commit,然后push到远程仓库[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sCs709nP-1590408187683)(git的学习.assets/image-20200525125011706.png)]
来到haitaoss2 的远程仓库首页,点击 pull request 按钮。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xRqobVv0-1590408187684)(git的学习.assets/image-20200525125115085.png)]
校验我们的修改后,点击Create pull request
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CypCIqDC-1590408187685)(git的学习.assets/image-20200525125256950.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfJtFPS1-1590408187686)(git的学习.assets/image-20200525125434638.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xq3SOxJ3-1590408187686)(git的学习.assets/image-20200525125725856.png)]
haitaoss登录github查看haitaoss2给他创建的pull request
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kn3UwqvH-1590408187687)(git的学习.assets/image-20200525125835009.png)]
haitaoss 审核代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qO4YHhph-1590408187688)(git的学习.assets/image-20200525131010533.png)]
合并pull request
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dlG8Fcof-1590408187689)(git的学习.assets/image-20200525131000299.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0l7pXrIA-1590408187691)(git的学习.assets/image-20200525131137484.png)]
haitaoss 更新仓库代码,查看是否真的合并了haitaoss2 新加的功能
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hWLbPYYT-1590408187691)(git的学习.assets/image-20200525131513522.png)]
设置ssh 免密登录
生成ssh公钥第一种方式
(base) MBP:~ haitao$ ssh-keygen -t rsa -C xxx
(base) MBP:~ haitao$ cat ~/.ssh/id_rsa.pub
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bcTbN3YF-1590408187692)(git的学习.assets/image-20200525143655069.png)]
生成ssh公钥第二种方式
# 因为-C 参数只是设置备注,不想要备注就不加即可
(base) MBP:~ haitao$ ssh-keygen -t rsa
(base) MBP:~ haitao$ cat ~/.ssh/id_rsa.pub
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wJmKz6nX-1590408187693)(git的学习.assets/image-20200525144757215.png)]
在github上设置ssh公钥
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pedkplcq-1590408187693)(git的学习.assets/image-20200525143839846.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ccU8nVWL-1590408187694)(git的学习.assets/image-20200525143859109.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hnV6nti-1590408187694)(git的学习.assets/image-20200525143957459.png)]
在本地仓库添加一个ssh 连接的remote
复制仓库的ssh 地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-owBQsEM5-1590408187695)(git的学习.assets/image-20200525144213258.png)]
测试使用ssh 是否能免密push
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XqWye67n-1590408187695)(git的学习.assets/image-20200525144451168.png)]
当然如果你不想设置remote 也是可以的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sIGOnm6U-1590408187696)(git的学习.assets/image-20200525144623420.png)]
设置忽略文件
-
GitHub 官网样例文件
https://github.com/github/gitignore
https://github.com/github/gitignore/blob/master/Java.gitignore
-
编辑本地忽略配置文件,文件名任意
# 根据官网提供的配置,再添加一下自己的配置 (base) MBP:demo2 haitao$ vim /Users/haitao/.gitignore_global (base) MBP:demo2 haitao$ vim ~/.gitconfig
/Users/haitao/.gitignore_global 文件内容
# Compiled class file *.class # Log file *.log # BlueJ files *.ctxt # Mobile Tools for Java (J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.nar *.ear *.zip *.tar.gz *.rar # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* # idea 的编译文件 .idea target
.gitconfig 添加的内容
[core] excludesfile = /Users/haitao/.gitignore_global autocrlf = input
Git 工作流
概念
- 在项目开发过程中使用Git 的方式
分类
-
集中式工作流
像SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有修改都提交到Master 这个分支上。这种方式与SVN 的主要区别就是开发人员有本地库。Git 很多特性并没有用到。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZvMmseRC-1590408187697)(git的学习.assets/image-20200525151840393.png)]
-
GitFlow 工作流(用的最多)
Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8yeI5vrY-1590408187697)(git的学习.assets/image-20200525151828035.png)]
-
Forking 工作流
Forking 工作流是在GitFlow 基础上,充分利用了Git 的Fork 和pull request 的功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受不信任贡献者的提交。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qNzaRgLi-1590408187698)(git的学习.assets/image-20200525151815224.png)]
GitFlow 工作流详解
分支种类
-
主干分支master
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境完全一致。
-
开发分支develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
-
bug 修理分支hotfix
主要负责管理生产环境下出现的紧急修复的代码。从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
-
准生产分支(预发布分支) release
较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后可以视情况删除。
-
功能分支feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。开发完成后会合并到开发分支。
GitFlow 工作流举例
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-58N3IpHa-1590408187698)(git的学习.assets/image-20200525152118376.png)]
分支实战
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QiCdrZl8-1590408187699)(git的学习.assets/image-20200525152201071.png)]
Gitlab 服务器环境搭建(使用docker)
安装docker
怎么下载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XDqynoE1-1590408187699)(git的学习.assets/image-20200525161802047.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ldp3N13c-1590408187700)(git的学习.assets/image-20200525161944071.png)]
怎么用
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G2D5Iq80-1590408187700)(git的学习.assets/image-20200525191057306.png)]
# 拉取gitlab 镜像
(base) MBP:~ haitao$ docker pull gitlab/gitlab-ce
# 查看虚拟机的ip
(base) MBP:~ haitao$ ip addr
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:50:56:28:03:7e brd ff:ff:ff:ff:ff:ff
inet 192.168.4.100/24 brd 192.168.4.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::250:56ff:fe28:37e/64 scope link
valid_lft forever preferred_lft forever
# 运行容器
(base) MBP:~ haitao$ docker run --detach \
--hostname 192.169.4.100 \ # 这个是你的linux的ip,很重要,不设置到时候没办法定位到你的仓库
--publish 443:443 --publish 80:80 --publish 222:22 \
--name gitlab \
--restart always \
--volume /opt/docker/gitlab/config:/etc/gitlab \
--volume /opt/docker/gitlab/logs:/var/log/gitlab \
--volume /opt/docker/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
访问gitlab
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ACV4jX2t-1590408187701)(git的学习.assets/image-20200525185641066.png)]
设置了12345678
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnFUrJrJ-1590408187702)(git的学习.assets/image-20200525185746421.png)]
默认的登录账号是root
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zsxQLl4n-1590408187702)(git的学习.assets/image-20200525185842900.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wnmk0kYn-1590408187703)(git的学习.assets/image-20200525185903926.png)]