Git使用
Git使用
一、git简介
git是目前最先进的分布式版本控制系统系统,主要功能是版本管理和协同开发。
1、svn与git的区别
实际上有两种管理方式,一种是svn(集中式管理),另一种是git(分布式管理)。
- svn(集中式管理)
-
git分布式管理
git安装完毕,既有客户端,又有服务端。
2、git的工作流程
git本地有三个区:工作区、暂存区、版本库。
远程仓库:github,码云,gitlab(公司内部一般使用)
3、git分支管理
创建子分支进行开发的目的:分支开发是独立的,互不影响其它分支,当子分支开发的内容要同步给主分支时,才进行分支合并。
二、git安装
下载官网下载安装包,一路下一步即可安装成功,安装成功之后,我们点击鼠标右键,便可以看见多了两个选项。
我们使用Git Bash Here
进行git操作,一般不使用Git GUI Here
(图形化界面)操作。
三、git基本操作
我们在桌面上,建立一个文件夹,文件夹进行管理
mkdir test # 建立文件夹test
1、初始化仓库: git init 文件夹名
-初始化:git init 文件夹名
-初始化:git init #当前路径全被管理
我们发现,文件夹test
中,多了一个.git
的隐藏文件。
2、查看状态: git status
我们在cd到test文件夹下,输入git status
,即可查看到文件状态。
3、提交文件到暂存区: git add a.txt
-git add a.txt # 把a.txt提交到暂存区
-git add . # 将当前路径下没有提交到暂存区的全部提交到暂存区
提交之后,我们再敲git status
,我们发现a.txt
变绿了【哈哈】。
红色表示未被管理,绿色表示提交到暂存区了
4、将暂存区中的所有文件提交到版本库: git commit -m '注释'
-git commit -m '注释,我新增了a.txt' # 把暂存区的所有都提交到版本库
# -m 为 message 同时, 必须加入注释才行,不然报错
但是,我们发现,提交到版本库时,提示如下。
我们发现需要设置邮箱和名字,根据提示,我们如此书写。
# commit时,需要增加作者信息 --global全局配置【使用git config可以查看git可以进行的配置】
git config --global user.email "yangyi@163.com"
git config --global user.name "yangyi"
"""
全局: 我们可以在C:\Users\YangYi下的.gitconfig中查看到配置的信息
[user]
email = yangyi@163.com
name = yangyi
"""
# 局部配置【优先于全局】
git config user.email "yangyi@163.com"
git config user.name "yangyi"
"""
局部: 我们可以在项目C:\Users\YangYi\Desktop\test\.git下的config查看局部配置信息
"""
5、回滚操作: git checkout .
git checkout . # 将工作区中的文件,回滚到版本区中最新的状态【当前指针所指的位置】。
举例:【此时版本库中a.txt中文件内容为空】我们在a.txt
中书写内容,然后执行git checkout .
,我们会发现a.txt
内容被置为空。
6、查看日志: git log
git log # 可以显示所有提交过的版本信息,但不包括已经被删除的 commit 记录和 reset 的操作
git reflog # 显示所有的操作记录,包括提交,回退的操作。一般用来找出操作记录中的版本号,进行回退。
git reflog # 常用于恢复本地的错误操作。
7、到达某个版本: git reset --hard 版本号
"""移动指针,可以到达被版本管理的任何一个状态,可以替代掉git checkout ."""
-git reset --hard 版本号 # 根据版本号(commit),达到某个状态
8、从暂存区恢复到工作区: git reset .
-git reset . # 从提交到暂存区的数据恢复到工作区【使用很少】
9、过滤文件
项目中有些文件是没有必要进行管理的,所以我们需要选择性的对某些文件进行过滤,过滤方式如下。
"""
我们如何过滤文件呢?忽略语法如下
注意:默认情况下,空文件夹不被管理,我们在其中书写__init__.py即可显示
"""
在项目根路径,跟.git文件夹在一个路径,新建.gitignore.文件,在里面进行配置
1、#号是注释
2、文件夹名称 表示文件夹不被管理
3、文件名 表示文件不被管理
4、c/*.py 表示将c文件夹下的所有py文件全部忽略
5、/dist 表示根路径下的dist文件夹不被管理
6、*.py 表示后缀名为py的文件都被忽略
7、*.log* 表示所有的日志文件不被管理
10、分支操作
- 查看分支
git branch # 查看分支【绿色表示在当前分支上】
- 创建分支
git branch dev # 创建dev分支
"""
如果在dev这条分支上创建了文件,然后提交到版本库中,在dev分支上是可以显示的。
而在master分支上,是没有的。
"""
- 删除分支
git branch -d dev # 删除dev分支
- 切换分支
git checkout dev # 切换到dev分支
- 创建并切换
git checkout -b dev # 创建dev分支并切换到dev分支
- 合并分支
# 把dev分支合并到master分支:先切换到master分支,然后执行合并dev分支的命令
git merge 分支名
11、总结
"""工作区,暂存区,版本库"""
-git init # 生成一个.git 的文件夹
-git stauts # 查看状态(红色和绿色),必须全绿再提交到版本库
-git add . # 提交到暂存区
-git commit -m '文字' # 从暂存区提交到版本库
-git checkout . # 把工作区的代码恢复到版本库中最先的代码
-git reset . # 把暂存区的东西拉回到工作区(原来是绿的变红了)
-git reset --hard 版本号 # 回退到某个版本
"""git"""
-git branch # 查看所有分支,如果分支是绿色,是再当前分支是
-git branch 分支名 # 创建分支
-git chekout dev # 切换到dev分支
-git chekout -b dev2 # 创建并切换到dev2分支
-git branch -d dev2 # 删除dev2分支,不能再这个分支上
-git merge dev # 你必须再其他分支(master),合并dev
"""git操作出现冲突的两种方式"""
-分支合并
-你和别人在同一条分支上改了相同的代码
四、git远程连接
1、基本操作
我们使用码云进行代码托管。先新建一个仓库。
创建完仓库之后,仓库中只有一个.gitignore
文件。我们接下来在本地执行如下操作。
"""什么都没有的情况下,新建仓库"""
mkdir test # 创建test文件夹
cd test # 切换到test文件夹下
git init # 初始化git仓库
touch a.txt # 在test文件夹下创建a.txt
git add a.txt # 将a.txt放到暂存区
git commit -m "first commit" # 将暂存区中的文件提交到版本库
git remote add origin https://gitee.com/yangyi215/git_test.git # 连接到远程git仓库
git push origin master # 将本地的master分支提交到远程的origin中
"""本地已经有了仓库"""
cd test # 切换到test路径下
git remote add origin https://gitee.com/yangyi215/git_test.git # 连接到远程git仓库
git push origin master # 将本地的master分支提交到远程的origin中【需要输入用户名和密码--->之后会被保存在windows的凭证管理器中】
"""其它操作"""
git remote # 查看远程连接仓库(没有就看不到)
提交之后,效果显示如下。
2、相关问题解决
我们在git push origin master
的时候,可能会碰见如下情况。
解决方式如下:
git pull origin master
git push origin master
3、git项目的创始者和开发者
"""项目创始者: 代码如上"""
"""项目开发者: 参与者,把代码拉下来,继续做开发"""
git clone https://gitee.com/yangyi215/git_test.git # 将远程代码克隆到本地【可以看到完整的版本和日志控制,可以回复到任意版本】
# 注意:表示回到指针指向的版本,因为已经用git rest --hard把指针移动了,所以checkout .就是当前指针在的版本上的内容
-git checkout .
"""简述"""
1、本地新增c.txt文件
2、提交到暂存区
3、提交到版本库(没有提交到远程,远程看不到)
4、提交到远程:git push origin master
git pull origin master # 让文件夹中的代码成为最新的
git feacth # 一般不用,他跟pull是一个东西,当作不知道
"""重点"""
每次再提交代码之前,一定要先更新代码(拉),如果不拉提不上去。
"""
简单来说,pull也就是根据远程库将自己的代码更新到最新【修改新内容,但不影响自己写的文件】,
之后使用push提交,会保持代码处于最新状态。
"""
4、ssh连接和https连接
"""大部分使用ssh连接"""
1、给你一个git地址(项目地址)
2、可以使用 git clone+地址 克隆到本地
3、自己便可以修改代码,代码修改完毕,进行提交,需要用户名和密码
4、我们进行ssh配置,便不用输入密码
"""加密方式"""
对称加密: 加密和解密共用同一套秘密
非对称加密: 生成一对公钥和私钥,公钥用于加密,私钥用于解密
"""如何生成一对公钥和私钥?"""
我们可以参考-https://gitee.com/help/articles/4181
# 1 使用命令进行操作,会将生成的一对公钥和私钥放在家目录下的.ssh文件夹中
ssh-keygen -t rsa -C "yang215@163.com"
# 2 把公钥复制出来,在码云上配置即可【只有配置了公钥的用户才能进行提交代码】
# 可以如此进行理解:开设一个git账户,可以给账户配备各个开发者的公钥,然后账户使用ssh进行链接仓库【每个仓库的ssh地址不同】
生成的公钥和私钥便会放在家目录下。
之后我们直接使用ssh克隆远程库。家目录下也会多出来一个文件known_hosts
。
5、pycharm操作git
-
安装git
-
在pycharm中配置,setting ---> git ---> git.exe的地址
-
git clone
-
使用pycharm创建本地分支
-
pull代码
-
push代码
6、协同开发解决冲突
"""
协同开发如果出现冲突,该如何解决?
两个同时修改了文件的同一位置【可以理解为文件有行锁】
"""
当远端代码与你本地同一文件中的同一位置起冲突时,你执行git pull origin master,会起冲突。
【也就是其他人和你同时修改了文件中的同一位置(前提是最少两个人)】
"""冲突效果如下:pull的时候会自动提示冲突的代码"""
<<<<<<< HEAD
你的代码
=======
别人代码
>>>>>>> origin/master
"""处理方案"""
-删除你的代码
-删除别人的代码【你无权删除别人的代码,需要联系别人删除】
-合并你们的代码
7、分支合并
"""分支分为两种:本地分支、远程分支"""
"""如何创建远程dev分支?"""
1、创建本地分支
-git checkout -b dev
2、在本地的dev分支上,提交到远程dev分支上
-git push origin dev
-
线上分支合并
# 如果看到可自动合并,表示合并后不会有冲突,正常操作即可 # 测试人员点通过,直接合并即可
-
分支合并冲突解决
# 1 远端创建一个dev分支 1) 在远端直接创建 2) 本地创建,提交到远端 git checkout -b dev git push origin dev # 2 本地新建一个dev_bug分支【在dev分支上创建分支,就是基于dev分支的】 # 此时,远端(master,dev) 本地(master,dev,dev_bug) 如果你在dev_bug分支改了文件,dev分支改了同样的文件,合并就出冲突, git merge dev_bug (在dev分支上合并),解决冲突:(删你的,同事的,合并起来), 然后正常进行操作 git add . git commit,...就可以了 # 3 手动线下合并代码并提交到远程 git checkout master # 切换到本地的master分支 git merge dev # 在master中合并dev分支 如果出冲突,解决冲突,之后 -git add . -git commit -git push..即可
8、线上回滚
# 1 切换到master分支
# 2 回滚打某个版本 git reset --hard 版本号
# 3 强制提交代码 git push origin master -f