1.概念
git是分布式版本控制工具,不需要有中央服务器去存储所有的代码,但是git有一个中心服务器,但他不像集中式版本控制一样将所有的代码都存储到服务器中,git的中心服务器可以被看作为一个普通的pc用户端,它不工作了照样可以进行版本控制和代码交换,只是会变得不方便
2.集中式版本控制和分布式版本控制
集中式版本控制是通过一个中央服务器去存储所有的版本(版本库)
所有开发者想要开发时,必须先从这个中央服务器拉取代码才能够工作,而且中央服务器和开发者之间是通过互联网进行连接的,每一个开发者修改完毕后再将修改后的代码提交到中央服务器中
分布式版本控制中没有中央服务器,每一个人的电脑都是一个完整的版本库,这样在工作的时候就无需联网了,因为版本库就在自己的电脑上,多人协作只需要将自己的修改发送给对方,就可以互相看到对方的修改了
3.git工作流程
命令如下:
1.clone(克隆):从远程仓库克隆代码到本地仓库
2.checkout(检出):从本地仓库检出一个分支进行修订
3.add(添加):在提交前将代码放入暂存区
4.commit(提交):提交到本地仓库,本地仓库中保存修改的各个历史版本
5.fetch(抓取):从远程仓库,抓取到本地仓库,不进行任何的合并操作,一般操作比较少
6.pull(拉取):从远程仓库,拉取到本地仓库,自动进行分支合并(merge)然后放到工作区,相当于fetch+merge
7.push(推送):修改完成后,需要和团队成员共享代码时,将代码推送到远程仓库
4.安装git
1)安装
下载网址 Git - Downloads (git-scm.com)
安装成功,右键能看到两个选项
Git GUI:Git提供的图形界面工具
Git Bash:Git提供的命令行工具
安装完git之后,首先要配置自己的用户名和邮箱,因为每一次git提交都会使用该用户的信息
2)基本配置
1.打开Git Bash
2.设置用户信息
git config --global user.name "zzzxxxxxlll"
git config --global user.email "1650030420@qq.com" //邮箱不要求是必须存在的
查看用户信息
git config --global user.name
git config --global user.email
3)为常用指令配置别名
有些常用指令参数非常多,每次都要输入好多参数,为此可以使用别名
1.打开用户目录,创建.bashrc文件
部分window系统中不允许创建以.开头的文件,可以打开gitBash,执行touch ~/.bashrc
注:这里说的用户目录一般指C盘下的'用户'文件夹
2.在文件中输入内容
#用于输出git提交日志 alias git-log='git log ==pretty=oneline --all --graph --abbrev-commit' #用于输出当前目录下所有文件及其基本信息 alias ll='ls -al'
5.获取本地仓库
1)在电脑上创建一个文件夹,作为本地仓库
2)进入到这个文件夹中打开gitbash
3)输入git init 将这个文件夹变为本地仓库
4)如果创建成功了该文件夹下会出现.git文件夹
6.基础操作指令
Git工作目录下对于文件的修改(增加、删除、更新)会存在几个状态,这些修改的状态会随着我们执行git的命令而发生变化
只要是工作区的文件变化了,就需要将其提交到暂存区使其可以被追踪
1.git add (工作区 -> 缓存区)
2.git commit (暂存区 -> 本地仓库)
查看修改的状态(暂存区对比工作区)
git status
从工作区添加任务到暂存区
git add [filename] 提交某一个文件
git add . 提交所有未被跟踪的文件
将内容从暂存区提交到本地仓库当前分支
git commit -m '注释内容'
查看提交日志
git log 查看本地仓库中的提交日志
其中可以有很多参数
形式:git log [option]
options:
-
--all 显示所有分支
-
--pretty=oneline 将提交信息显示为一行
-
--abbrev-commit 使输出的commitId更加简短
-
--graph 以图的形式显示
版本回退
作用:版本切换
形式:git reset --hard commitID
commitID可以使用git log形式查看
如何查看已删除的版本记录
形式:git reflog
不需要进行管理的文件
创建.gitignore文件 告诉git哪些文件不需要管理
可以在其中使用通配符的形式 来告诉git哪些文件不需要管理
7.分支
什么是分支
几乎所有的版本控制都以某种形式支持分支,使用分支意味着可以把自己的工作从开发主线分离下来进行bug修改或者新功能开发,防止影响开发主线
查看本地分支
git branch
创建本地分支
git branch 分支名
切换分支
git checkout 分支名
创建并切换分支
git checkout -b 分支名
合并分支
git merge 分支名
一般是在要合并分支上执行,加入要把dev分支合并到master分支,那么就要先checkout到master分支,然后使用命令git merge dev
删除分支
不支持删除当前分分支,只能删除其他分支
git branch -d [分支名] 需要进行文件的检查
git branch -D [分支名] 不需要做任何检查 直接删除
解决冲突
当两个分支同时修改一个文件并提交到同一分支时可能会出现冲突,例如修改了同一文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下
1.处理文件中冲突的地方
2.将解决完的冲突加入暂存区 add
3.提交到本地仓库 commit
冲突如下:
在dev01分支下修改了123.txt并提交
在master分支下也修改了123.txt并提交
然后再master分支merge合并dev01分支,就会出现冲突:
如上图:git不知道改使用哪个修改作为最终的版本,所以将控制权交给了开发者,这时解决冲突的方式就是直接修改123.txt文件,留下来我们需要的东西,我们将dev01分支提交的版本直接删除即可
因为修改了文件,那么git默认就会追踪到这样的状态,使用git status可以看到修改状态并没有被放进暂存区,所以需要git add加入暂存区后,git commit提交到本地仓库,即可解决冲突
以上是简单的冲突解决流程
开发中分支使用原则与流程
-
master (生产)分支
线上分支,主分支,中小规模项目作为线上运行应用对应的分支
-
develop (开发)分支
是从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要合并到master分支,准备上线
-
feature/xxx分支
从develop创建的分支,一般进行同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支
-
hotfix/xxx分支
从master派生的分支,一般作为线上bug修复,修复完成后需要合并到master、test、develop分支
-
还有一些其他的分支比如test分支(用于代码测试)、pre分支(预上线分支)等等
8.git远程仓库
常用托管服务[远程仓库]
git中存在两种类型的仓库,远程仓库和本地仓库,如何搭建远程仓库捏?最常使用的是互联网上提供的一些代码托管服务,例如Github,Gitee等
码云
注册码云,直接浏览器里面搜就ok
建立仓库
跟着指示走
创建ssh公钥
1.生成ssh公钥
ssh-keygen -t rsa
一直回车
如果公钥存在了,那么这次新产生的公钥就会将之前的公钥覆盖
2.Gitee账户设置公钥
获取公钥
cat ~/.ssh/id_rsa.pub
3.验证配置是否成功
ssh -T git@gitee.com
操作远程仓库
添加远程仓库
命令:git remote add [远程仓库名] [仓库路径]
远程仓库名默认是origin,取决于远程服务端的设置
仓库路径,从远程服务器获取URL
仓库URL可以点击进gitee的仓库中
在克隆/下载中找到远程仓库的URL
如果指令没报错,一般就成功了^_^
查看远程仓库
git remote
推送远程仓库
命令:git push [-f] [--set-upstream] [远端名称 [本地分支名] [:远端分支名]]
如果本地分支和远端分支名相同可以只写本地分支
git push origin master
-f 强制覆盖,如果提交内容有冲突,以本次提交为准
--set-upstream推送到远端的同时并建立起和远端分支之间的关联联系
git push --set-upstream origin master
如果当前分支已经和远端分支相关联,就可以省略分支名和远端名
git push
将master分支推送到已关联的远端分支
如果没有关联本地分支和远程分支 直接使用git push不起作用,因为git不知道将这次提交push到哪一个分支,需要我们指定,在第一次指定过后,就可以直接git push了
本地分支和远程分支的关联关系
查看关联关系可以使用
git branch -vv
从远程仓库克隆
如果已经有一个远程仓库了,那么我们可以将它clone到本地
命令:git clone <仓库路径> [本地目录]
本地目录可以省略,会自动生成一个目录,目录名一般就是远程仓库的名字
从远程仓库拉取和抓取
远程分支和本地分支一样,都可以进行merge操作,只是需要把远程仓库里的更新都下载到本地,再进行操作
抓取:git fetch [remote name] [branch name]
抓取指令就是将仓库中的更新都抓取到本地,不会进行合并
如果不指定远程名称和仓库名,则抓取所有分支
拉取:git pull [remote name] [branch name]
拉取指令就是将远程仓库的修改拉取到本地自动进行合并,等同于fetch+merge
如果不指定远程名称和仓库名,则拉取并更新当前所有分支
解决合并冲突
在一段时间内,A、B同时修改了同一个文件,并修改了同一行位置的代码,此时会发生合并冲突
A用户在本地修改代码后优先推送到本地仓库,此时B用户在本地修改代码,提交到本地仓库后,需要推送到远程仓库,此时B用户晚于A用户,所以需要先拉取远程仓库的提交,经过合并后才能推送到远端分支
在B用户拉取代码时,因为A、B用户同一时间段修改了同一个文件的同一行代码,所以会发生合并冲突,因为pull包含了merge操作
远程分支也是分支,所以解决冲突的方式和解决本地冲突的方式相同,就是直接修改文件,再进行push即可
简单来说,就是我们提交修改push之前,需要先将远程仓库最新的状态拉取下来进行合并,查看有没有冲突,如果有冲突,在本地解决之后,在进行推送到远程仓库