13-Git

Git

一、版本控制器

完成 协同开发 项目,帮助程序员整合代码
	i)帮助开发者合并开发的代码
	ii)如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突

软件:SVN 、 GIT(都是同一个人的个人项目)
	github、gitee(两个采用git版本控制器管理代码的公共平台)

git:集群化、多分支

二、git的介绍

1. 简介

什么是git:版本控制器 - 控制的对象是开发的项目代码

代码开发时间轴:需求1 => 版本库1 ==> 需求2 => 版本库2 => 版本库3(版本库1) => 版本库4(版本库2) 

2. git与svn的比较

image-20210210160015374

image-20210210160035267

3. git的工作流程

image-20210210160049799

4. 版本库建的通信

image-20210210160115042

5. git分支

image-20210210160125866

三、git的使用

1. 流程(核心总结)

1)有红色信息(工作区有内容),就执行 add 
2)全绿信息(内容全部在暂存区),才执行 commit
3)只有被版本库控制的代码,才能被监听,所以可以回滚到任何一个版本

2. 安装

1.下载对应版本:https://git-scm.com/download
2.安装git:在选取安装路径的下一步选取 Use a TrueType font in all console windows 选项

3. 基础命令

<1>. 将已有的文件夹 --- 初始化为git仓库
cd 目标文件夹内部
git init     # 注意: 执行这条命令会将当然路径全部管理
<2>. 在指定目录下 - 初始化git仓库
cd 目标目录
git init 仓库名
<3>. 在仓库目录终端下 - 设置全局用户
git config --global user.name '用户名'
git config --global user.email '用户邮箱'

# 注:在全局文件 C:Users用户文件夹.gitconfig新建用户信息,在所有仓库下都可以使用

提示:该文件一般都是隐藏的,需要关闭隐藏

image-20210210160805830

<4>. 在仓库目录终端下 - 设置局部用户
git config user.name '用户名'
git config user.email '用户邮箱'

# 注:在当前仓库下的config新建用户信息,只能在当前仓库下使用
# 注:一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
<5>. 查看仓库状态
# 当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
git status  
	-- 查看仓库状态
git status -s  
	-- 查看仓库状态的简约显示
<6>. 工作区操作
# 通过任何方式完成的文件删与改
# 空文件夹不会被git记录
<7>. 撤销工作区操作:改、删(了解)
git checkout .
	-- 撤销所有暂存区的提交
git checkout 文件名
	-- 撤销某一文件的暂存区提交
<8>. 工作区内容提交到暂存区
git add .  
	-- 添加项目中所有文件
git add 文件名  
	-- 添加指定文件
<9>. 撤销暂存区提交:add的逆运算(很少使用)
git reset HEAD .
	-- 撤销所有暂存区的提交
git reset 文件名
	-- 撤销某一文件的暂存区提交
git reset .
	-- 撤销所有暂存区的提交
<10>. 提交暂存区内容到版本库
git commit -m "版本描述信息"
<11>. 撤销版本库提交:commit的逆运算
"""回滚暂存区已经提交到版本库的操作"""
# 查看版本管理的日志
git log
git reflog

# 查看时间点之前|之后的日志:
git log --after 2018-6-1
git log --before 2018-6-1
git reflog --after 2018-6-1
git reflog --before 2018-6-1

# 查看指定开发者日志
git log --author author_name
git reflog --author author_name

# 回滚到指定版本:
# 回滚到上一个版本:
git reset --hard HEAD^
git reset --hard HEAD~

# 回滚到上三个版本:
git reset --hard HEAD^^^
git reset --hard HEAD~3

# 回滚到指定版本号的版本:
git reset --hard 版本号 (重点)
eg: git reset --hard 35cb292

4. 过滤文件

# .gitignore 文件
# 1)在仓库根目录下创建该文件
# 2)文件与文件夹均可以被过滤
# 3)文件过滤语法

过滤文件内容
文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
/文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤

举例:
a.txt:项目中所有a.txt文件和文件夹都会被过滤
/a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
*x*:名字中有一个x的都会被过滤(*代表0~n个任意字符)
空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)

5. 多分支开发

<1>. 分支操作
# 1.创建分支
git branch 分支名

# 2.查看分支
git branch

# 3.切换分支
git checkout 分支名

# 4.创建并切换到分支
git checkout -b 分支名

# 5.删除分支
git branch -d 分支名

# 6.查看远程分支
git branch -a

# 7.合并分支
git merge 分支名
把dev分支合并到master分支:切换到master分支,执行合并dev分支的命令
1)多个开发者都是在一个分支上进行开发,不出意外,该分支一定叫dev(协同开发)
2)如果出现一个特殊任务(敏感任务),与正常业务关系不紧密,甚至可能大的影响正常的dev分支开发,可以依赖dev开一个子分支,进行开发,开发完毕后合并到dev分支,再删除该分支即可
3)所有的开发任务都可以在dev分支上进行(除非公司硬性要求不能直接在dev分支开发,只能在dev子分支开发,测试通过后才能合并给dev)

四、远程git开发

远程仓库:github,码云,公司内部(gitlab)

1. 两种本地与远程仓库同步

1)你作为项目仓库初始化人员:
	线上要创建空仓库 => 本地初始化好仓库 => 建立remote链接(remote add) => 提交本地仓库到远程(push)
	
2)你作为项目后期开发人员:
	远程项目仓库已经创建成功 => 复制远程仓库到本地(clone) => 进入仓库就可以进行接下来的开发

2. remote源操作

"""
1)查看仓库已配置的远程源
>: git remote
>: git remote -v

2)查看remote命令帮助文档
>: git remote -h

3)删除远程源
>: git remote remove 源名
eg: git remote remove origin

4)添加远程源: 这种操作等同于你给你的远程源地址取了一个别名, 在push 或者 pull 时就可以使用指定的源名表示你的源地址了.
>: git remote add 源名 源地址
>: git remote add orgin git@gitee.com:doctor_owen/luffyapi.git

5)提交代码到远程源
>: git push 源码 分支名

6)克隆远程源
>: git clone 远程源地址
"""

"""
1)通过克隆方式连接远程源,默认远程源名就叫origin;所以主动添加远程源来连接远程仓库,源码也用origin
2)本地一个仓库只需要和远程一个源进行同步,所以只需要连接一个远程源,如果还想把本地代码同步给第三个平台,那么可以通过主动添加远程源来连接第三个平台的远程仓库,此时的源码就不能再叫origin了,比如online都可以
3)pull和push都可以提供选择不同的源码,和不同的远程仓库交互
"""

3. git远程连接

知识储备: 远程操作有三个命令

# 拉
git pull 源名 分支
git feacth 源名 分支  # 和 pull 类似. 用的少

# 推
git push 源名 分支

007S8ZIlgy1ggqvvjqhlmj30lq0fu764

# 1. 码云
# 2. 新建仓库的时候,不要勾选Readme初始化这个而仓库
# 3. 现在什么都没有,新建仓库
    mkdir lqz_test
    cd lqz_test
    git init
    touch a.txt
    git add a.txt
    git commit -m "first commit"
    git remote add origin https://gitee.com/liuqingzheng/lqz_test.git  # 连接远程
    git push  origin master
    
# 4. 已经有了仓库
    cd b
    git remote add origin https://gitee.com/liuqingzheng/lqz_test.git
    git push origin master    
    
# 5. git 远程操作命令
    git remote # 查看远程仓库(没有就看不到)
    git remote add origin https://gitee.com/liuqingzheng/lqz_test.git # 跟远程仓库建立连接
    git push origin master  # 把本地的master分支提交到远程的origin,需要输入用户名和密码(之前存的需要删掉)

4. git仓库创始者和开发者

<1>. 项目创始者
上面第2小结就是 --> git远程连接
<2>. 项目开发者(参与者)
# 思路: 把代码拉下来继续开发
git clone https://gitee.com/liuqingzheng/lqz_test.git

# 作为开发者: 能看到完整的版本和日志控制, 也可以回复到任意版本
git rest --hard 版本号     # 提示: 版本号的指定可以指定前面一部分即可
git checkout .            # 表示回到指针指向的版本,因为已经用git rest --hard把指针移动了,所以checkout .就是当前再的版本上的东西(如图)

# 本地新增c.txt文件操作
1. 提交到暂存区
2. 提交到版本库(没有提交到远程,远程看不到)
3. 提交到远程:git push origin master

20200721200118

5. 采用ssh和https连接协议

<1>. 采用ssh协议连接远程源

前言了解: 先明白什么是对称加密, 什么是非对称加密

官网文档参考:https://gitee.com/help/articles/4181#article-header023

第一步: 命令终端执行命令生成公私钥文件: ssh-keygen -t rsa -C "邮箱" # 邮箱随意

20200721202648

第二步: 找到公钥和私钥所在文件加的位置:

20200721202900

第三步:公钥配置到码云上:

20200721203307

第四步: 复制copy配置的私钥链接

20200721203748

第五步: 实现ssh建立链接提交

# 提交本地代码到远程仓库
git push origin master

20200722070850

<2>. 如何成为其他码云项目的开发者
1)生成自己电脑的公钥,配置到自己的码云个人公钥中
2)把自己的码云用户名提供给别人,别人添加你成为项目开发者
3)自己确认添加,成为开发者,克隆开发项目,进行开发
<3>. 如何成为公司自建的gitlab服务器的开发者
1)生成自己电脑的公钥(公钥生成一次就可以了),把它提交给项目管理者
2)项目管理者添加你公钥,加入开发者,提供给你项目克隆地址
3)克隆开发项目,进行开发

6. 协同开发

<1>. 协同开发流程

注意:最好一个功能作为一次本地的版本库提交

# 1)作为开发者,第一次同步项目(前台已经是项目开发者了)
git clone 项目地址

# 2)保证自己本地有dev分支,且与远程仓库版本同步(没有就自己新建)

# 3)本地开发的代码,必须add、commit到本地版本库后,才和远程仓库进行交互

# 4)交互顺序:必须 先拉(pull)后提(push)

# 5)必须切换到要交互的分支,在与远程同名的分支进行交互,如本地dev与远程dev交互
git checkout dev
git add .
git commit -m '本次提交的信息提示'
git pull origin dev
git push origin dev
<2>. 协同开发出现冲突,如何解决
git pull origin master  拉下远程代码,同事和你修改了同一个位置,会冲突,如下:
<<<<<<< HEAD
你的代码
=======
别人代码
>>>>>>> origin/master    


# 处理方案
1. 删除你的代码
2. 删除同事代码
3. 合并你们的代码

20200722003018

7. 冲突解决

"""
1)在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突

2)定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突

3)将解决冲突后的代码重新提交到本地版本库

4)再拉去远程仓库,直到没有冲突,提交本地版本库到远程
"""

"""
<<<<<<< HEAD  # 冲突的开始
# 自己的代码
=======  # 分割线
# 别人的代码
>>>>>>> b63c408abd05b87fc492d40523240561999dba50  # 冲突的结束(版本)
"""

"""
1)删除冲突相关标识:冲突的开始、分割线、冲突的结束(版本)
2)线下沟通,根据实际需求完成代码整合
3)测试整合后的代码

"""

出现冲突的前提:
1)不同开发者同时操作了同一文件
2)并且在相同行写了代码
强调:有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)
"""

8. 线上分支合并

20200722070842

# 如果看到可自动合并,表示合并后不会有冲突,正常操作即可
# 测试人员点通过,直接合并即可

9. 远端如何创建一个分支

<1>. 在远端直接创建

20200722070822

20200722070822

<2>. 在本地创建,提交到远端
git checkout -b dev
git push origin dev

10. 分支合并出现冲突解决

<1>. 本地分支合并出现冲突
1. dev_bug分支改了文件
2. dev分支改了同样的文件
3. 合并就出冲突
4. git merge dev_bug (在dev分支上操作)
5. 解决冲突(删你的,同事的,合并起来)
6. git add .  git commit 
7. 正常了,冲突解决

dev分支新增了内容.

20200722085417

dev_bug分支新增的内容和dev分支的部分内容是同一行

20200722085412

在dev分支上, 当想将dev_bug合并过来, 冲突出现

20200722085410

20200722085407

解决冲突: 对应冲突部分删除, 没有用的也删除

20200722085406

冲突解决

20200722085403

<2>. 线上分支合并出现冲突

提示: 对于简单的行冲突会帮我们自动处理, 后来的即将冲突的代码会将之前的代码往下顶

注意1: 分支之间的切换, 最好要在当前分支没有被修改的情况下执行.

注意2: 千万不要把, 本地的dev分支合到master上!!!!!!!!!!!!!!!!!!!

1. git checkout master
2. git merge dev 
3. 如果出冲突,解决
4. git add .
5. git commit 
6. git push..

20200722073734

20200722073737

dev分支新增内容并提交到远程(新增的内容都在同一行)

20200722073740

20200722073953

20200722073951

解决冲突: 线下合并, 解决冲突, 再提交到远程

20200722074143

20200722074144

20200722074214

当前因为修改了内容, 因该add + commit, 再push到远程

20200722074324

11. 远程仓库回滚

'''用dev分支举例'''
# 1)本地切换到远程要回滚的分支对应的本地分支
git checkout dev

# # 2)回滚本地分支
git reset --hard 版本号

# 3)本地版本强行提交给服务器  (谨慎使用)
git push origin dev -f

20200722002208

五、pycharm操作git

1. pycharm添加git

20200721222605

2. 创建文件将文件自动配置

20200721222336

20200721222334

20200721222333

3. 提交内容到版本库

20200722074424

20200721223241

20200721223249

20200721223250

4. 提交时如果没有指定

20200722085335

5. 导航栏上面展示的提交

20200722085332

6. git克隆

20200721224747

git查看版本库信息

20200721225918

20200721225915

7. 修改源

20200721225912

20200721225910

8. 前版本和主版本做比较

20200721230211

20200721230213

20200721230341

9. 新建本地分支

image-20200721230440734

提示: 勾选Checkout branch默认切到当前创建的分支

20200721230511

10. 切换分支

20200722085317

11. 删除分支

20200722085315

20200722085312

12. 查看历史版本记录

20200722085308

20200722085305

六、git的编辑

git rebase
原文地址:https://www.cnblogs.com/borntodie/p/14431004.html