git的介绍与使用

一、git(版本控制器)介绍

1、git介绍

  • 什么是git

    Git是一个开源的分布式版本控制系统,它的用途与SVN, CVS等版本控制系统一样,可以对文件进行版本管理(控制的对象是开发的项目代码)。Git是目前主流的版本控制系统,很多软件项目都会用它作为源代码管理工具。

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

    让我们可以通过git回到某个版本

  • git的作用
    • 帮助开发者合并开发的代码,协同开发(代码管理,类似文件管理)
    • 如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突
    • 代码版本管理

2、集中式版本管理和分布式版本管理

目前的版本管理工具,主流分为集中式版本管理和分布式版本管理,其中分布式版本管理使用的范围更大

git:分布式版本管理

svn:集中式版本管理

git与svn比较

img

svn:集成式管理,所有的信息都存在服务端,服务端挂掉就做不了版本管理,代码合并(无网络不可以提交)

img

git:分布式管理,信息存储在两个位置,本地版本库可以存储版本信息,服务端也可以存储版本信息,服务端挂掉,本地还可以继续做版本管理,代码合并

git的工作流程

img

3、git,gitee,github,gitlab介绍

# git:版本管理软件,装在操作系统上,有很多命令
# gitee:远程仓库:开源代码,私有代码,有个网站,可以看到有哪些开源代码,通过网站做一些配置
	-国内最大的开源远程仓库
    -小公司---》使用gitee的私有仓库
    
# github:远程仓库:开源代码,私有代码,有个网站,可以看到有哪些开源代码,通过网站做一些配置
	-国际上最大的开源远程仓库
    
# bitbucket:只有私有仓库
	-远程代码仓库

# gitlab:公司内部的远程仓库

二、git安装与使用流程

1、git 软件安装

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

# 下载后,双击安装包 安装软件, 一路下一步安装完成
	-任意路径下点右键,多出两个东西GIT BASH 和GIT GUI
    -cmd窗口中输入git命令,会给出帮助信息

img

ps:下面的操作都在git bash中完成,bash中可以使用linux命令操作

2、git工作流程

# git分成三个区
	-工作区    存放文件的地方
    -暂存区    工作区的变更,提交到暂存区
    -版本库    暂存区的内容,提交到版本库

# 三个区相互操作
	-下面学的命令,就是在操作这三个区

img

三、git常用命令

参考自【高级架构师刘sir】:https://www.cnblogs.com/liuqingzheng/articles/17146214.html

  • 将已有的文件夹 - 初始化为git仓库

    先进入需要被管理的文件夹内部

    输入命令

    git init   # 初始化该文件夹为git仓库,文件夹内的所有文件都会被git管理
    
  • 在指定目录下 - 初始化git仓库

    git init xxx # 初始化xxx文件夹为git仓库,如果当前路径下没有该文件夹,会自动创建该文件夹并管理
    

    ps:执行初始化仓库的命令后,当前文件夹会多出 .git 文件夹,这个文件夹不要删,如果删除,这就不是git仓库了,之前的版本再也找不回来了,也不能被git管理

  • 查看文件变化

    执行命令之前,需要进入 .git 所在文件夹下

    但是只能看到暂存区和工作区的文件变化

    git status
    

    查看仓库状态的简约显示(用的不多,正常来说都是觉得他的提示太少了

    git status -s
    

    这时候我们会看到两种颜色的文件名称,作用如下:

    -红色:工作区变化了,但是没有提交到暂存区
    -绿色:已经提交到暂存区,没有提交到版本库
    -没有文件名称显示:所有东西都在版本库中了[所有文件都被git管理起来了]
    

    ps:通过任何方式完成的文件删与改都会被git记录,但是空文件夹不会被git记录

  • 在仓库目录终端下 - 设置全局用户

    当我们提交了代码到暂存区,想要把代码提交到版本库的时候,需要先设置用户,因为没有配置用户,他会禁止你提交代码(类似禁止没有身份证的人做一些事情)

    git config --global user.name '用户名'
    git config --global user.email '用户邮箱'
    
    注:在全局文件 C:\Users\用户文件夹\.gitconfig新建用户信息,在所有仓库下都可以使用
    

    ps1:在当前仓库下的config新建用户信息,只能在当前仓库下使用
    ps2:一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户

  • 工作区内容提交到暂存区

    git add .  
    	-- 添加项目中所有文件
    git add 文件名  
    	-- 添加指定文件
    
  • 撤销暂存区提交:add的逆运算(很少使用,了解即可)

    简单来说就是把绿色的文件变成红色

    git reset HEAD .
    	-- 撤销所有暂存区的提交
    git reset 文件名
    	-- 撤销某一文件的暂存区提交
    git reset .
    	-- 撤销所有暂存区的提交
    
  • 提交暂存区内容到版本库作为一个版本

    git commit -m '版本描述信息'
    
  • 查看版本库版本信息

    查看历史版本:
        >: 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
    
  • 撤销版本库提交:commit的逆运算(了解)

    回滚到指定版本:
        回滚到上一个版本:
            >: 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
    
  • 总结

    需要记住的:
        	git add  
            git commit -m
            git reset --hard 版本号
    需要会用:
    		git init
        	git status
            git log
            git reflog
            
    只需要了解:
    		git checkout .
        	git reset HEAD
        	git config user.name '用户名'
    		git config user.email '用户邮箱'
            
            
            
    """
    1)有红色信息(工作区有内容),就执行 add 
    2)全绿信息(内容全部在暂存区),才执行 commit
    3)只有被版本库控制的代码,才能被监听,所以可以回滚到任何一个版本
    空文件夹不会被git记录
    """
    

四、git忽略文件

在项目中,有些文件,或文件夹不想被git管理,比如:

-node_models
-.idea
-xx.pyc  # python 的编译文件

我们使用过滤文件实现忽略文件的功能

  • 过滤文件

    • 步骤一

      在想要使用过滤文件功能的仓库目录下创建 .gitignore 文件,可以先创建一个txt文件,然后删除后缀名得到

    • 步骤二

      在这个文件中写上需要被忽略管理的文件名称

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

ps:已经被git管理的文件并不会被忽略

五、git多分支开发

1、git分支管理

img

为什么要有分支?

  • 可以保证,主分支的版本都是可以查看的版本
  • 我们都在开发分支开发,开发完成,合并到主分支
  • 如果出现一个特殊任务(敏感任务),与正常业务关系不紧密,甚至可能大的影响正常的dev分支开发,可以依赖dev开一个子分支,进行开发,开发完毕后合并到dev分支,再删除该分支即可
  • 所有的开发任务都可以在dev分支上进行(除非公司硬性要求不能直接在dev分支开发,只能在dev子分支开发,测试通过后才能合并给dev)

2、分支操作

  • 1、查看分支
git branch
  • 2、创建分支
git branch 分支名
git branch dev
  • 3、切换分支
git checkout dev  # 切换到dev分支

git checkout -b 分支名 # 创建并切换到分支
git branch checkout 分支名称 # 跟上面的命令一个作用
  • 4、删除分支
git branch -d dev

ps:删除分支的时候需要处于master分支下才能删除别的分支

  • 5、合并分支(重要)
git merge 分支名

把dev分支合并到master分支:切换到master分支,执行合并dev分支的命令
	先来到master分支:
    	-git checkout master
        如果合并内容进来的对象还没创建可以使用下方命令
        -git branch checkout 分支名称
    执行合并命令:
    	-git merge dev   
        把dev合并到我(master,处在哪个分支就会合并到哪个分支)身上

ps:分支合并可能会出冲突(后面会讲)

3、公司里使用的分支方案

  • 小公司

    master分支,dev分支,bug分支 ,所有人在dev分支开发,开发完成合并到主分支
    
  • 中小公司

    master分支,dev分支,bug分支 ,个人分支,个人在个人分支上开发,开发完成合并到dev分支
    

六、git远程仓库

我们在使用远程git开发的时候,需要把本地版本库的数据提交到服务器版本库,而这个服务器版本库通常有以下三种:

  • gitee
  • github
  • gitlab

gitlab是公司自行搭建的,gitee和github(网站访问困难,服务器在国外)是第三方的网站

gitlab的搭建教程https://zhuanlan.zhihu.com/p/413217715

我们后续的操作以gitee作为远程仓库

1、把我们写了一部分的luffy项目上传到gitee

  • 上传项目到本地版本库

    步骤一

    打开git bash,进入到路飞项目的文件夹内,这里我先进入了后端项目的文件夹中

    img

    步骤二

    执行命令,把当前文件夹初始化为git仓库

    img

    img

    步骤三

    去项目文件夹中,配置.gitignore忽略文件

    当前状态下我们去pycharm中会看到文件的颜色发生了变化,被管理的文件都会变成红色,忽略管理的文件会变成黄色,已经提交到暂存区的文件会变成绿色

    步骤四

    把需要git管理的文件添加到暂存区

    ps:这里我们务必要先配置好忽略文件,否则修改起来比较麻烦(不想要被管理的文件删了,上传,然后再给他弄回来)

    git add .
    

    img

    步骤五

    提交代码到本地版本库中

    git commit -m '第一次提交'
    

    这个时候代码提交到了本地版本库中,已经被版本管理了

    img

  • 上传项目到远程仓库

    步骤一

    登陆gitee创建自己的仓库,点击右上角的+号,然后点进新建仓库

    pp8kLcj.png

    步骤二

    配置一下仓库信息,后面三样不要勾选,保证仓库是空的(勾选了之后就不是空仓库了,相当于有了别的版本信息)

    pp8AEuR.png

    pp8Au4O.png

    步骤三

    根据gitee的提示进行配置,这里的git用户设置我们已经在之前配置过了

    pp8Asrn.png

    步骤四

    进入被git管理的项目路径内,执行命令,把本地的版本库推送到远程仓库(这里的origin只是一个名称,可以换)

    git remote add origin https://gitee.com/用户名/luffy_api.git
    

    pp8ENLR.png

    步骤五

    把本地当前所在分支,推送到 origin对应的远程的master上(这里我们就是把本地的master分支推送到远程仓库的master分支)

    git push origin master
    

    执行命令后会出现一个窗口需要我们输入用户名和密码,因为gitee是第三方远程仓库,为了安全考虑他不能让人随便上传代码进行修改

    这里的用户名和密码只需要输入一次,就可以永久使用,这是因为他在电脑的凭据管理器中保存了(windows系统),如果在这里删除了凭据,就需要重新登陆了

    img

    img

2、需要被忽略管理的文件如果已经提交了如何修改

# 如果提交了,再写忽略文件的步骤
    luffy.log--->暂存区---》版本库
    
    .gitignore---》写上忽略,但是不好被忽略,只要luffy.log有变化还是会被监控到
    
    删除luffy.log---》会被监控到---》add,commit---》版本库中已经没有luffy.log
    再出的luffy.log,就不会被管理了

七、ssh方式连接远程仓库

在上面,我们提交代码到远程仓库使用的是https协议的链接

我们还可以使用ssh链接提交代码,同时ssh链接的安全性更高,使用更广泛

pp8VBBn.png

使用ssh需要用到公钥和私钥

操作流程

步骤一

点击右上角的头像,点击设置

步骤二

在设置界面点击左侧的ssh公钥,这时候我们可以点击右侧界面的怎样生成公匙了解怎么获取公钥

公钥教程:https://gitee.com/help/articles/4181

pp8ZGr9.png

步骤三

执行命令生成公钥私钥

ssh-keygen -t ed25519 -C "976863429@qq.com" 

注意:这里的 xxxxx@xxxxx.com 只是生成的 sshkey 的名称,并不约束或要求具体命名为某个邮箱。
现网的大部分教程均讲解的使用邮箱生成,其一开始的初衷仅仅是为了便于辨识所以使用了邮箱。

执行命令后什么都不需要输入,按三次回车即可

img

img

根据创建时的提示,我们可以得知生成的公私钥保存在:C:\Users\asus.ssh

img

步骤四

接着我们使用记事本打开后缀名为.pub的公钥文件,复制公钥到gitee网站上进行添加

img

步骤五

在本地版本库推送的时候,可以删除之前的origin库连接,创建新的连接提交代码到远程仓库

git remote remove origin
git remote add origin git@gitee.com:用户名/luffy_api.git

git push origin master

也可以直接创建一个新的库连接,提交代码到远程仓库,我用的就这种方式

git remote add xxx git@gitee.com:用户名/luffy_api.git

git push xxx master

img
img

remote源操作

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

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

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

4)添加远程源
>: 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都可以提供选择不同的源码,和不同的远程仓库交互

八、协同开发

协同开发介绍

  • 我[仓库管理员]创建了仓库,我对仓库有各种权限
  • 我们要多人开发(张三,李四),张三李四在自己的仓库中,能看到我的项目吗?看不到
  • 我[仓库管理员],把张三李四设置为该仓库的开发者,设置完成后,在张三李四的仓库中就能看到这个项目了

ps:当我们邀请的别的开发者,这些开发者就对这个仓库就有读写权限,他们就可以开发代码,提交代码

当我们作为开发者被邀请的时候,我们本地是没有代码的,因此我们需要从远程仓库拿代码

从远程仓库获取代码

步骤一

使用git clone命令把代码从远程仓库克隆下来

ps:执行命令之前需要进入想要保存该项目的路径中

git clone git@gitee.com:用户名/luffy_api.git

步骤二

使用pycharm打开,并配置解释器及依赖

步骤三

开发代码并保存

步骤四

开发结束后跟之前一样,提交到远程仓库即可

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

必须切换到要交互的分支,在与远程同名的分支进行交互,如本地dev与远程dev交互
>: git checkout dev
>: git add .
>: git commit -m '本次提交的信息提示'
>: git pull origin dev
>: git push origin dev

ps:在提交的时候如果需要更改身份信息,可以使用局部身份信息

# 设置用户名和邮箱
git config user.name xxx
git config user.email 123@qq.com

局部用户的信息存储在.git文件夹中的config文件中

img

pp8eO0A.png

全局用户的信息存储在C:\Users\用户名.gitconfig文件中

img

img

公司中的git操作流程介绍

# 你刚去公司,你的步骤
	1 自己注册,hr给你 gitlab 账号和密码
    	-自己去你的账号里,配置ssh
    2 老大会把一个仓库地址给你 【它已经把你加成开发者了】  https  ssh
    3 clone下来代码
    4 使用pycharnm打开,配置环境===》代码运行起来
    5 开发代码,本地提交---》push到远端
    	add
        commit
        push

九、冲突解决

出现冲突的原因

  • 1、多人在同一分支开发,提交的代码相似
  • 2、远程仓库分支合并的时候出现冲突

多人在同一分支开发出现冲突

同一分支的冲突是因为不同的人在提交代码的时候,有一部分代码出现了相似的情况,git检测到之后会出现报错提示让我们修改

这里我们假设张三对项目进行了一些修改:

	-张三:
    	git pull origin master
        '把远程仓库的代码拉下来'
        在test.py,最后一行加入 print('刘亦菲')
        '对test.py文件进行修改'
        git add .
        git commit -m 
        git push origin master
        '把修改后的代码推送到远程仓库的master分支上'

接着李四也做了相似的操作

    -我:
    	git pull origin master
        '把远程仓库的代码拉下来'
    	在test.py,最后一行加入 print('彭于晏')
        '对test.py文件进行修改'
        git add .
        git commit -m 
        git pull origin master
        '把修改后的代码推送到远程仓库的master分支上'

这时候李四的pycharm中就会出现报错信息,内容就是产生冲突了

冲突出现的样子

    <<<<<<< HEAD   我的代码
    print('刘亦菲')
    =======   它的代码
    print('彭于晏')
    >>>>>>> 6f720edbd84c8744b1c7c10767fb89a5d0fa98f5

强调:有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)

解决冲突

基本流程

  • 1)在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突
  • 2)定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突
  • 3)将解决冲突后的代码重新提交到本地版本库
  • 4)再拉去远程仓库,直到没有冲突,提交本地版本库到远程

当我们出现冲突的时候,需要手动修改代码,比如两块代码类似的时候,我们需要删除多余的代码

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

修改完代码后把代码推送到远程仓库即可

ps:如果删除的是别人的代码,需要提前跟人家沟通,否则容易出事

如何避免出现冲突

如果我们想要减少冲突,就需要勤拉代码,保证本地的项目跟远程仓库的版本接近

分支合并出现冲突

原理跟第一种冲突的情况相似,解决方法也类似,只是是在分支合并的时候出现冲突

-你:
		1 创建dev分支 
			git branch dev
        2 在dev分支的views.py 中第2行加入代码
        
        3 提交到本地仓库
        
        
-我:
	  1 在主分支的views.py 中第2行加入代码
      2 提交到版本库
        
      3 在主分支合并代码  git merge dev
      4 冲突了,解决冲突
      5 再提交代码,到此结束

十、线上分支合并

版本库间的通信

img

线上分支合并

步骤一

创建线上分支

我们在网站中创建一个新的分支

pp8m1B9.png

步骤二

然后用pull命令把这个分支拉下来

img

img

ps:这里我们会发现,把dev分支拉下来之后,查看不到,但是当我们进入dev分支后就可以查看到他了

步骤三

对项目的代码做出修改,然后提交到远程仓库

接着提交代码到远程仓库

git add .
git commit -m '修改了README.txt'
git push zzh dev

步骤四

在远程仓库中把dev分支的内容合并到master的分支中去

在公司中我们把先上分支合并成为pr或rr(gitlab上叫rr)

点击上方的Pull Requests,然后点击右上方的新建按钮

pp8nNan.png

步骤五

填写合并的配置信息后点击创建Pull Request

pp8nwGV.png

步骤六

接着会进入审查和测试界面,只有通过了审查和测试才能成功合并分支

pp8nsr4.png

步骤七

点击合并按钮后会要求我们添加介绍,接着点击接受即可

ps:上述情况是在合并分支的时候没有出现冲突的情况

先上合并出现冲突的解决方案

把两个分支的代码拉到本地,然后分别进行修改,解决冲突后提交到远程仓库,再次合并分支即可

如果只需要修改一个项目,拉一个项目即可

十一、远程仓库回滚

这个功能,一般用不到,用了容易出事情

基本情况就是,我们这个版本的代码除了问题,所以需要回滚代码

回滚的时候是把代码拉到本地后,回退版本

查看分支
git checkout dev 
根据版本号回退
git reset --hard 版本号

接着我们使用强推,把代码发到远端

git push origin master -f

ps:这个-f很危险,出了问题就是执行-f的人担责

posted @ 2023-03-16 16:27  dear丹  阅读(180)  评论(0编辑  收藏  举报