一、版本控制器
完成协同开发项目,帮助程序员整合代码
- 帮助开发者合并开发的代码,使用git实现版本的控制
- 如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突
版本管理工具
- SVN 、 GIT(都是同一个人的个人项目)
- github、gitee(两个采用git版本控制器管理代码的公共平台)
- gitee:中国的版github(很多公司在用)
- github:远程仓库,全球最大的开源代码库
- gitlab:公司自己搭建的远程仓库,公司的代码放在上面
二、git基本介绍
1.简介
什么是git?
- Git 是一个开源的分布式版本控制器
- 控制的对象是开发的项目代码
git的特点:
- 集群化、多分支
2.git与SVN的区别
Git 与 SVN 区别点:
- 1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
- **2、Git 把内容按元数据方式存储,而 SVN 是按文件:**所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
- **3、Git 分支和 SVN 的分支不同:**分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
- **4、Git 没有一个全局的版本号,而 SVN 有:**目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
- **5、Git 的内容完整性要优于 SVN:**Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
3.git 的工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
4.版本库间的通信
5.git分支管理
三、git基本使用
1.工作流程(核心)
-
工作区:就是你在电脑里能看到的目录。
如果工作区有内容一般显示为红色,就执行add
-
暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
若内容全部在暂存区(显示绿色)才会执行commit
-
版本库:工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。
只有被版本库控制的代码,才能被监听,所以可以回滚到任何一个版本
2.安装
打开 git官网,下载git对应操作系统的版本。
选择版本:
这里我选择下载**64-bit Git for Windows Setup**
双击运行安装
选择安装配置信息,然后一直Next默认就好了,如果需要设置就要仔细读一下安装界面上的选项。
3.启动git
在任意路径下点右键,有两个程序:
- Git GUI Here
- Git Bash Here
**Git Bash:**Unix与Linux风格的命令行,使用最多,推荐最多
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
四、基础命令
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull,下面我们会详细介绍。
说明:
- workspace:工作区
- staging area:暂存区/缓存区
- local repository:版本库或本地仓库
- remote repository:远程仓库
初始化仓库
mkdir 文件夹 # 创建文件夹
cd 文件夹
git init #初始化仓库,在当前路径下创建一个.git隐藏文件夹
查看版本状态
- 当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
git status
--- 查看仓库状态
-红色:新建,修改,删除,在工作区没有放到暂存区
-绿色:放到暂存区,没有提交到版本库
-没有东西:说明所有变更都被版本管理起来了
git status -s
--- 查看仓库状态的简约显示
工作区内容提交到暂存区
git add .
-- 添加项目中所有文件
git add 文件名
-- 添加指定文件
提交暂存区内容到版本库
git commit -m "版本描述信息"
设置用户
设置全局
- 在家路径新建一个
.gitconfig
文件,把用户名邮箱写进去
git config --global user.name '用户名'
git config --global user.email '用户邮箱'
注:在全局文件
C:\Users\用户文件夹\.gitconfig
新建用户信息,在所有仓库下都可以使用
设置局部
- 在项目路径的
.git
文件夹下的config
文件中加入了用户名和邮箱
git config user.name '用户名'
git config user.email '用户邮箱'
注意:
在当前仓库下的config新建用户信息,只能在当前仓库下使用
一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
工作区操作
# 通过任何方式完成的文件删与改
# 空文件夹不会被git记录
撤销工作区操作:改、删(了解)
git checkout .
-- 撤销所有暂存区的提交
git checkout 文件名
-- 撤销某一文件的暂存区提交
撤销暂存区提交:add的逆运算(很少使用)
git reset HEAD .
-- 撤销所有暂存区的提交
git reset 文件名
-- 撤销某一文件的暂存区提交
git reset .
-- 撤销所有暂存区的提交
撤销版本库提交: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
五、过滤文件
- 我们项目中有一些文件,文件夹,不要提交到版本库
在项目根路径新建:.gitignore (win平台)
在文件中写忽略的文件/文件夹
-直接写文件夹名字或者/文件夹名字,表示忽略这个文件夹
-# 表示注释
-直接写文件名,表示忽略该文件
-* 表示通配符,表示任意数量任意字符 案例:*.log 以.log结尾的都忽略
-?表示单个字符 ?.log
六、多分支开发
分支基本操作
# 1.创建分支
git branch 分支名 # 绿色的意思是当前所在分支
# 2.查看分支
git branch
# 3.切换分支
git checkout 分支名
# 4.创建并切换到分支
git checkout -b 分支名
# 5.删除分支
git branch -d 分支名 # 应该切换到其他分支,再删除
# 6.查看远程分支
git branch -a
# 7.合并分支
git merge 分支名
git checkout master # 切换到主分支
git merge dev #把dev分支合并到主分支
把dev分支合并到master分支:切换到master分支,执行合并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 [email protected]:doctor_owen/luffyapi.git
5)提交代码到远程源
>: git push 源码 分支名
6)克隆远程源
>: git clone 远程源地址
"""
"""
1)通过克隆方式连接远程源,默认远程源名就叫origin;所以主动添加远程源来连接远程仓库,源码也用origin
2)本地一个仓库只需要和远程一个源进行同步,所以只需要连接一个远程源,如果还想把本地代码同步给第三个平台,那么可以通过主动添加远程源来连接第三个平台的远程仓库,此时的源码就不能再叫origin了,比如online都可以
3)pull和push都可以提供选择不同的源码,和不同的远程仓库交互
"""
3.Git远程连接仓库
远程创建仓库(建一个空仓库)
4.git项目创始者和开发者
储备知识
# 拉
git pull 源名 分支
git feacth 源名 分支 # 和 pull 类似. 用的少
# 推
git push 源名 分支
项目创始者
1 没有项目纯空的
mkdir test
cd test
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/liuqingzheng/test.git
git push -u origin master
2 项目已经存在,在本地以及操作了(git_test)
cd git_test
git remote add origin https://gitee.com/liuqingzheng/test.git
git push origin master # 本地代码推送到远程
# 推送 远程仓库名 主分支
3 提交的时候需要输入gitee的用户名和密码
4 提交成功以后,在远程仓库能看到版本变更记录
项目开发者
# 因为是开源的所有人都可以克隆
git clone https://gitee.com/liuqingzheng/test.git
# 修改改代码
git add .
git commit -m
git remote 配置远程仓库(我现在不用配,同一台机器已经配置过了)
git push origin master
# 在提交代码之前,要先更新
git pull origin master
八、采用ssh协议连接远程源(公司一般用这种)
采用ssh协议连接
1 使用https操作的,第一次提交的时候,输入用户名密码
2 企业里通常使用ssh
-公钥:配置在gitee
-私钥:留在你本地
3 生成公钥私钥
-在命令窗口下,位置无所谓执行
ssh-keygen -t rsa -C "[email protected]"
-会在/c/Users/计算机用户名/.ssh/id_rsa生成公钥私钥
-公钥给别人,私钥不能泄露(非对称加密:对称加密)
4 在gitee中配置,以后本机操作我这个账号,就不用密码验证了
5 远程仓库改成ssh方法
6 git push origin master
操作步骤
配置公匙到码云
复制copy配置的私钥链接
实现ssh建立链接提交
# 提交本地代码到远程仓库
git push origin master
九、pycharm操作git
1.pycharm添加git
2.创建文件将文件自动配置将工作区的内容add到暂存区
3.提交内容到版本库
4. 提交时如果没有指定commit+push组合键的情况
5. 导航栏上面展示的提交图标是提交到本地的版本库
6. git克隆操作
git查看版本库信息
7.添加修改远程仓库
8.前版本和主版本做比较
9.新建本地分支
提示: 勾选Checkout branch默认切到当前创建的分支
10.切换分支
11.删除分支
12.查看历史版本记录
十、git的变基
git rebase
更多参考 | 链接
十一、协同开发
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. 合并你们的代码:你俩虽然改了一行,但是功能不一样
3.冲突解决
"""
1)在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突
2)定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突
3)将解决冲突后的代码重新提交到本地版本库
4)再拉去远程仓库,直到没有冲突,提交本地版本库到远程
"""
"""
<<<<<<< HEAD # 冲突的开始
# 自己的代码
======= # 分割线
# 别人的代码
>>>>>>> b63c408abd05b87fc492d40523240561999dba50 # 冲突的结束(版本)
"""
"""
1)删除冲突相关标识:冲突的开始、分割线、冲突的结束(版本)
2)线下沟通,根据实际需求完成代码整合
3)测试整合后的代码
"""
出现冲突的前提:
1)不同开发者同时操作了同一文件
2)并且在相同行写了代码
强调:有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)
"""
4.分支合并
4.1 线上分支合并
1 在线上新建一个dev1分支
2 拉去到本地
3 在本地dev1分支增加一行代码,提交到版本库
4 在本地dev1分支又增加一行代码,提交到版本库
5 远程分支合并
-pull request,指定从哪个分支合并到哪个分支
-绿色表示没有冲突,可以正常合并
-普通和扁平化(变基)
6 本地、远程的dev1和master就完全一样了
4.2 线下分支合并提交
1 本地dev1分支新增代码,提交到版本库
2 本地dev1分支合并到master
-切到master
-git merge dev1 (没有冲突直接合并)
-git push origin master (本地master提交到远端master)
3 切到dev1分支,再提交到远端
4 到此,本地分支合并完成,远端的dev1跟master完全一样,本地的dev1跟master也完全一样
5.远端如何创建一个分支
5.1 直接在远端仓库创建
5.2 本地创建,提交到远端
git checkout -b dev
git push origin dev
6.分支合并出现冲突解决
6.1 本地分支合并出现冲突
1. dev_bug分支改了文件
2. dev分支改了同样的文件
3. 合并就出冲突
4. git merge dev_bug (在dev分支上操作)
5. 解决冲突(删你的,同事的,合并起来)
6. git add . git commit 提交到远端
7. 正常了,冲突解决
dev分支新增了内容.
dev_bug分支新增的内容和dev分支的部分内容是同一行
在dev分支上, 当想将dev_bug合并过来, 冲突出现
解决冲突: 对应冲突部分删除, 没有用的也删除
冲突解决
6.2 线上分支合并出现冲突
提示: 对于简单的行冲突会帮我们自动处理, 后来的即将冲突的代码会将之前的代码往下顶
注意1: 分支之间的切换, 最好要在当前分支没有被修改的情况下执行.
注意2: 千万不要把, 本地的dev分支合到master上!!!
1. git checkout master
2. git merge dev
3. 如果出冲突,解决
4. git add .
5. git commit
6. git push..
master分支新增并提交到远程
dev分支新增内容并提交到远程(新增的内容都在同一行
远程将dev分支合并到master分支: 无法自动合并
解决冲突: 线下合并, 解决冲突, 再提交到远程
当前因为修改了内容, 因该add + commit, 再push到远程
十二、远程仓库回滚
'''用dev分支举例'''
# 1)本地切换到远程要回滚的分支对应的本地分支
git checkout dev
# # 2)回滚本地分支
git reset --hard 版本号
# 3)本地版本强行提交给服务器 (谨慎使用)
git push origin dev -f
十三、其他了解
git flow
-是一种建分支的方案
-预览分支,开发分支,bug分支,主分支,测试分支...
pull和fetch区别
git pull:拉代码+合并
git fetch:拉代码,需要手动合进去
变基rebase
-合并分支的时候,是否保留之前分支的日志
git客户端:
-官方下载的一个(命令行下)
-pycharm编辑器
-sourcetree:美观,分支通过不同颜色线上,看着好看
标签:基本,git,提交,仓库,介绍,版本,远程,分支
From: https://www.cnblogs.com/chen-ao666/p/17169060.html