10、 git

1、git介绍

git功能

git:代码版本管理工具,是一款软件,同类型的还有svn,但是用得人较少

  -版本管理
  -合并代码
  -冲突解决

git与svn比较

git:分布式管理---》每个客户端都能完成版本管理的功能
svn:集中式管理---》所有代码都放在服务端,版本管理由服务端完成(过时了)

git,github,gitee,gitlab分别是什么

# Git:是一种版本控制系统,是一个命令,是一种工具。

# GitHub:是一个基于Git实现的在线代码托管仓库,包含一个网站界面,向互联网开放,公有仓库免费,部分私有仓库收费,全球最大的开源代码托管平台,git的远程仓库

# GitLab:是一个基于Git实现的在线代码仓库托管软件,可以通过GitLab自己搭建一个类似于GitHub一样的系统,用在企业内部网络搭建Git私服,用于企业团队内部协作开发,公司内部的github

# Gitee:(码云) 是 OSCHINA 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管,面向互联网开发,分免费和付费,中国最大的开源代码托管平台,中国版的github,为中国的开源软件事业,贡献自己的一份力量

2、git安装

傻瓜式安装一路下一步,其他都不用选

# win:下载
https://git-scm.com/download
  
# mac下载:
https://github.com/timcharper/git_osx_installer/releases/download/2.2.1/git-2.2.1-intel-universal-mavericks.dmg

桌面点击右键出现此图标即为安装成功

 

3、git工作流程

复制代码
# 本地分三个区:工作区,暂存区,版本库---->工作流程指的就是三个区的来回操作
# 工作区文件变化         操作问题
# 工作区提交到暂存区     git add .
# 暂存区提交到版本库     git commit -m '注释'
# 版本库退回工作区没有更改的时候  git reset --hard 版本号

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

4、git常用命令

配置用户信息

复制代码
配置全局用户信息
# 以后所有文件夹再提交到版本库显示的就是这个名字,所有的都显示这个名字
# 配置的信息写到了用户家路径的 .gitconfig中
git config --global user.name 'long'
git config --global user.email '3@qq.com'

配置局部用户信息
# 当前文件夹以后再提交到版本库显示的就是这个名字、
# 配置的信息写在了仓库(gittest文件夹)路径下的 .git文件夹下的config文件
git config user.name 'liuqingzheng'
git config user.email '306334678@qq.com'
复制代码

命令

复制代码
# 1  初始化仓库,会在当前文件夹下创建出一个.git的隐藏文件夹,git配置,版本信息在里面
git init  

# 2 查看状态--》红色,绿色,没有---》新增,修改,删除--》变红
git status

# 3 把工作区变化提交到暂存区---》变绿色
git add .   # . 表示当前路径下所有变更

# 4 把暂存区提交到版本库 ---》从绿变无色
git commit -m '注释'

# 5 查看版本库的版本信息
git log  # 查看版本信息,显示详细信息,变化记录的少
git reflog  # 查看版本信息,显示简略信息,变化都会记录

# 6 工作区回退到某个版本
# 7c419c9934c60841cfcada07a7a9111081b58617  # 版本号
git reset --hard 7c419c9934  
git reset --hard 0a5dbb0

# 7 其他,不需要太了解,基本不用
git checkout .  # 把工作区变化撤销
git reset HEAD  # 把暂存区拉回到工作区(绿变红)

# 注意 :
.git文件夹做了记录,不能删除,如果删除,版本的记录也就没了
空文件夹不会被版本管理
复制代码

5、过滤文件

在咱们的项目中,有一些文件/文件夹不希望被git版本管理,对此我们可以写一个过滤文件

# 1 在仓库路径下(被git管理的文件夹),创建一个 .gitignore 的文件,在文件中写入忽略
# 2 文件与文件夹均可以被过滤
# 3 文件过滤语法

过滤文件内容/语法

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

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

项目前台过滤文件

前台项目自带过滤文件
#项目前台使用vue脚手架搭建
# vue create 创建过程中很慢,原因就是从github上拉了一个空项目,改了一下名字,所以,它里面有git的版本管理(.git隐藏文件夹)

后端项目过滤文件

# 后端项目的.gitignore
.idea  # 使用pycharm作为IDE时,自动生成的文件夹,用于存放项目的控制信息
__pycache__  # 忽略所有__pycache__ 文件夹,它是.pyc文件的文件夹
*.pyc  # 为提高响应速度,cpython会在执行一次文件后,创建.pyc结尾的相同文件,如果项目无变化,下次直接以此文件运行项目
logs/*.log  # 忽略日志文件夹下的日志文件
scripts  # 忽略脚本文件

 6、分支操作

git 可以创建多条分支,创建完以后,在不通分支上提交版本,不通分支的版本相互不影响

master 主分支

dev 开发分支

注意:分支合并可能会出冲突,原因是master改了东西提交了,dev改了东西提交了,他们改的是同一个代码,合并就会出冲突

复制代码
# 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分支的命令
复制代码

7、git远程仓库

1 创建远程空仓库

复制代码
# 远程仓库
第三方:gitee,github,bitbucket
自己搭建:gitlab  具体操作:https://zhuanlan.zhihu.com/p/413217715

我们把本地版本库中的代码提交到远程仓库,多人合作都可以提交,最后完成代码合并,协同开发

如果公司中用gitee,都是用私有仓库,不要把公司代码做成公有仓库

我的课程案例是传到gitee远程仓库(需注册‘’):https://gitee.com/
如果到了公司里使用的是gitlab,所有操作完全一致,只是远程地址不一样
复制代码

image-20220421153802585

2 本地代码提交到远程仓库

复制代码
# 第一步:在远程创建一个空仓库

# 第二步:操作步骤

# 1 全局设置(已设置可以忽略)
git config --global user.name "liuqingzheng"
git config --global user.email "306334678@qq.com"

# 2.1 情况一:原来连本地仓库都没有
mkdir luffy_api  # 创建luffy_api文件夹
cd luffy_api‘  # 切换到luffy_api文件夹
git init  # 初始化本地仓库,可以被git管理
touch README.md  # 本地仓库创建readme文件
git add README.md  # 从工作区提交readme文件到暂存区
git commit -m "first commit"  # 从暂存区提交readme文件到版本库

(但是这些操作在之前已经做过,所以可以直接从下面开始,这也是情况二的步骤)

git remote add origin https://gitee.com/liuqingzheng/luffy_api.git # 添加一个远程仓库(利用http连接)
git push origin master # 把本地仓库推到远程

# 2.2 情况二:原来本地有仓库
cd 目录
git remote add origin https://gitee.com/liuqingzheng/luffy_api.git
git push origin master
复制代码

3 remote源操作

复制代码
# 1 查看远程仓库
git remote 

#2  添加远程仓库(利用http方式)
# git remote add 起一个名字 远程仓库地址
git remote add origin https://gitee.com/liuqingzheng/luffy_api.git

# 3 删除远程仓库
git remote remove origin

#4  把本地仓库提交到远程仓库
# git push 远程仓库名字 分支名
# 第一次:要输入用户名密码,只要输入一次,以后就记录到操作系统上了
# win:控制面板-用户账户-凭证管理器--》用户密码可以在这里更新或删除(详细见下图)
# mac:钥匙串---》搜
git push origin master  

#5  从远端仓库更新代码
# git pull 远程仓库名字 分支名
git pull origin master  # 协同开发---》张三提交了代码到远端---》你要拉下来,把张三代码合并到你的本地

### 注意点:
在公司里,没事就git pull 一下,拉取代码的频率高,出现冲突的概率就小

写了一个星期代码,从来没有拉过,你也改了s1.py   s5.py
这一个星期张三,李四王五,分别改了s1.py  s2.py  s3.py
你一提交---》多人在同一条分支上开发代码出现的冲突,出冲突了,需要解决冲突



##### 这几个会经常敲
git add .
git status
git commit -m
git pull origin master
git push origin master
复制代码

 

4 ssh连接

复制代码
# 刚刚咱们用的是https的连接方式,需要输入用户名密码
# 想使用ssh的连接方式,采用非对称加密的方式实现(不聊),需要公钥和私钥--》把公钥配置到远程机器,私钥自己留着---》我和远程机器就可以安全通信

# 本地生成一对秘钥:公钥和私钥
# ssh-keygen -t ed25519 -C "邮箱/电话号码" 
ssh-keygen -t ed25519 -C "306334678@qq.com" 
一路回车,就会在用户家路径的.ssh文件夹下生成一对公钥和私钥
把公钥配置到gitee上(gitlab,github) (看下面两张图)


# 以后不需要输用户名密码,可以安全通信,pull,push代码没有任何阻碍


######### 远程仓库地址要变 ,原来是https的,现在变成ssh的连接
git remote remove origin  # 先删除原来的远程仓库连接
git remote add origin git@gitee.com:liuqingzheng/luffy_api.git  # 再利用ssh连接远程仓库(ssh链接地址见下图)
  
git push oringin master  # 再提交到分支

### 注意:
你的一个gitee账号,可以配置多个ssh公钥,如果你配置了多个ssh公钥,意味着有多台机器可以免密操作仓库
公司里ssh用的多
你到了公司,公司会给你gitlab账号和密码,地址,你要在本地生成ssh公钥和私钥,配置到你的gitee,gitlab上
复制代码

公钥私钥保存位置:

gitee配入公钥:

ssh连接地址:

5 协同开发

# 多人操作同一个仓库,多人写同一个项目
# 刚到公司,一般情况下,你会被添加为该仓库的观察者,你目前只能看,不能改,删
# 但是也有的公司直接给你开发者权限---》直接修改提交代码就行了

# 你们是开发者,第一次要clone代码
git clone https://gitee.com/liuqingzheng/luffy_api.git
  
# 开发者可以修改并提交代码,没有人审核---》这个过程中可能会出冲突

pycharm图形化界面操作

image-20220421162919747

 

6 git冲突解决

情况一:多人在同一分支开发,出现冲突

复制代码
多人在同一分支开发,出现冲突的实例:
# 张三改了567.txt的第二行加了lqz is nb----》提交到远端
# 我本地也改了567.txt的第二行加了lqz is nb----》准备提,提不上去
原因是我本地的代码不是最新的,若想提交,必须更新到最新
但是,此时我想从远程仓库pull下来更新到最新,却发现,pull下来的代码有冲突
它把远端和本地冲突的代码合并了起来

# 冲突代码演示:
<<<<<<< HEAD  # 冲突开始
lqz is big    # 这里是我的代码
=======
lqz is nb     # 这里是远端代码
>>>>>>> e2d67d7517d66d244f824a32e20d4dd43f4ffc4d # 冲突结束

解决方式:本地更新到最新,此时本地会把远端冲突的代码合并进来,我们手动修改,解决冲突
# 如果是同样的功能,建议选择保留同事的;
# 如果是不同功能,两个代码都保留;
# 如果真的要删同事的代码,建议一定跟他说一声,最终结局冲突

# 会用到的命令
git add .
git commit -m ''
git pull origin master
git push origin master
复制代码

情况二:分支合并出冲突

复制代码
分支合并出现的冲突实例:
# master在某一行增加了一串代码
# dev在这相同位置也增加了这行代码
当两个分支合并的时候就会出现冲突

代码演示:
git branch dev  # 创建dev分支
加入会冲突的代码  
git add .  # 主分支提交到暂存区
git commit -m '主分支加入了一行'  # 主分支提交到本地仓库
git checkout dev  # 切换到dev分支
git status  # 查询状态
加入会冲突的代码
git add .  # dev分支提交到暂存区
git commit -m 'dev分支加入了一行'  # dev分支提交到本地仓库
git checkout master  # 切换到master分支
git merge dev  # 合并分支到master
出现下面冲突

<<<<<<< HEAD
lqz is big
=======
lqz is very big
>>>>>>> dev

#手动解决冲突,再提交
git add .
git commit -m '分支合并冲突解决'

# 正常情况,合并完分支,就把dev删除,继续开发,再重新创建dev分支
复制代码

7 线上分支合并

dev合并到master
# 提交pull request---》提交pr---》提个合并分支请求
# 提交pr---》领导审核---》审核通过同意---》代码合并完成

一个分支提交到上一级分支
# 本地某个分支加入了代码,提交到远端
# 在远端新建一个pull Request,选择要合并的两条分支---》提交了领导收到请求
# 看你的代码---》没有问题---》同意---》合并到分支中去,完成线上分支合并

新建合并请求

 

合并内容

 

 

 

 

 审核/测试

 

 

合并

 

8、 git扩展

复制代码
# 1 线上分支合并----》线下分支合并后提交到线上
    -本地dev ,master,本地把dev合到master中后,push到master(有的公司不给你master的写权限)
  
# 2 git flow,git变基,git fetch和git pull的区别
    -git flow 大神提出的一种git分支方案
    -git 变基:1 多个记录整合成一个记录  2 解决分支合并分叉问题
    -相同点首先在作用上他们的功能是大致相同的,都是起到了更新代码的作用。2. 不同点git pull 类似于 git fetch+git merge
  
# 3 pycharm操作git
  -右下角可以操作分支
  -原来用命令操作的,用图形化点点点都能完成,并且更直观且强大

# 4 为开源项目贡献代码
  -fork开源代码---》你自己仓库有一份
  -改你自己仓库的代码,提交到自己仓库
  -你的仓库,跟它就不一样了
  -提交pr,等作者审核,他是不是给你合进去,如果合进去了
  
# 5 代码回退
    # 本地回退到某个版本
    git reset --hard 40c543510675bc132174adbb3fa834dca91dd3e9
    # 基于上个命令,远端还是最新的版本,此时把本地提交到远端,不会成功,但是下面的命令可以强制提交
    git push origin master -f  # 强制提交,不想出事别用
复制代码

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


 

posted @   三三得九86  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
点击右上角即可分享
微信分享提示