目录
- git介绍
- git和svn
- git安装
- git,github,gitlab,gitee介绍
- git工作流程
- git命令
- 基本命令
- commit逆运算命令
- 分支操作
- remote源操作
- 远程仓库
- 基于https链接远程仓库
- 基于ssh链接远程仓库
- 协同开发
- 协同开发
- 解决冲突
- 远程分支合并
- 远程仓库回滚
- 为开源项目贡献代码
- git工作流,git pull和git fetch,变基
- pycharm操作git
- 多设备开发
- git忽略文件
git介绍
Git是一个分布式版本控制系统,用于跟踪文件和目录的更改
完成协同开发(多人一起开发)项目,帮助程序员整合代码
1 帮助开发者合并开发的代码
2 如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突
3 回滚功能,做版本管理,可以把代码退回到某个版本
git和svn
版本仓库,管理我们的代码
-svn:cs架构 一个服务端,多个客户端,如果服务端挂掉,整个代码合并,提交代码就做不了了,只能本地开发代码
-git:分布式管理,装git的客户端,既可以当客户端,又可以当服务端,如果git远程仓库挂掉,本地可以继续做代码版本的管理
git安装
-官方下载https://git-scm.com/
-安装:一路下一步,都选默认
-验证安装:
1 在cmd中输入:git -v
2 在任意路径点右键:看到
git gui here:在此处打开一个git 图形化界面
git bash here:在此处打开一个命令窗口
git,github,gitlab,gitee介绍
git : 软件,做版本管理和代码合并,它有些命令
github:网站,远程代码仓库,全球最大的开源代码托管网站,使用git的命令来上传下载代码
gitee:网站,远程代码仓库,国内最大的开源代码托管网站,使用git的命令来上传下载代码
gitlab:公司内部搭建的代码托管平台,远程代码仓库,网站,使用git的命令来上传下载代码
git工作流程
git 分3个区
工作区:存放代码的文件夹,只要工作区文件发生变(修改,新增,删除)
暂存区:工作的变更,提交到暂存区 --->git add .
版本库:暂存区内容,放到版本库,被版本管理---> git commit -m '注释内容'
git命令
基本命令
在要执行文件任意空白位置右键> git bash here> 打开命令窗口(等同于cmd)> 在这个命令窗口里可以执行 linux命令,来操作win
1. 初始化仓库
git init #初始化当前文件夹作为仓库
git init lqz #初始化lqz文件夹作为仓库
2.查看当前仓库状态
git status
-如果是红色,表示仓库新增文件或修改文件内容,还没有提交到暂存区
-如果是绿色,表示在暂存区有变化还没有提交到版本库
-如果控制台没有任何提示则表示当前目录下所有文件都被git版本管理了
3.把工作区文件提交到暂存区
git add 文件名 #把该文件名提交到暂存区
git add . #把所有变更文件都提交到暂存区
-工作区提交到暂存区建议使用git add 文件名 这个指令,不建议使用git add .
4.设置用户 #在本机就设置一次全局即可后期使用远程仓库,可以区分是谁提交了代码
# 局部设置(只针对于当前仓库)
git config user.name '22@qq.com'
git config user.email 'lqz'
# 全局设置(所有仓库)
git config --global user.name '306334678@qq.com'
git config --global user.email 'liuqingzheng'
5.将暂存区内容提交到版本库
git commit -m '注释'
6.查看版本内容
git log #可以显示所有提交过的版本信息
git reflog #可以查看所有分支的所有操作记录
7.把工作区变更删除
git checkout .
8.把暂存区拉到工作区
git reset HEAD
9.参看暂存区的文件
git ls-files
10.把版本库内容拉到暂存区
git reset --soft 版本号
eg:git reset --soft 23e9e095
11.把版本库内容拉到工作区
git reset --mix 版本号
eg:git reset --mix b23875
12.切换版本
git reset --hard 版本号
eg:git reset --hard e5fff5fe48
13.将本地分支更新内容推送至远程仓库master分支
git push origin master
14.拉取远程仓库所有分支合并到本地
git pull
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
- 扩展
# git log 和git reflog的区别
git log 命令可以显示所有提交过的版本信息
如果感觉太繁琐,可以加上参数 --pretty=oneline,只会显示版本号和提交时的备注信息
git reflog 可以查看所有分支的所有操作记录(包括已经被删除的 commit 记录和 reset 的操作)
# git reset --hard,--mix,--soft的区别
hard (硬)-> 全部删除,会彻底返回到回退前的版本状态,了无痕迹
mixed (中)-> 保留工作目录,文件回退到未commit的状态
soft (软)-> 保留工作目录、暂存区 ,文件会回退到未 add(未到暂存)的状态
总结:
soft是撤销commit的提交,但工作区未提交的更改还是保留;
mixed是撤销暂存区的提交,工作区的更改同样也保留;
而hard是把工作区、暂存区、commit到仓库的三个版本都回滚了
分支操作
"""
1)多个开发者都是在一个分支上进行开发,不出意外,该分支一定叫dev(协同开发)
2)如果出现一个特殊任务(敏感任务),与正常业务关系不紧密,甚至可能大的影响正常的dev分支开发,可以依赖dev开一个子分支,进行开发,开发完毕后合并到dev分支,再删除该分支即可
3)所有的开发任务都可以在dev分支上进行(除非公司硬性要求不能直接在dev分支开发,只能在dev子分支开发,测试通过后才能合并给dev)
"""
1.创建分支
git branch 分支名
eg:git branch dev
2.查看分支
git branch
3.合并分支
git merge 分支名 #需要在master分支上操作合并dev
eg:git merge dev
4.删除分支
git branch -d 分支名
eg:git branch -d dev
5.切换分支
git checkout 分支名
eg:git checkout dev
ev分支合并到master分支
基于分支的线上bug修复(开发新功能,出现bug)
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 源名 源地址
eg:git remote add orgin git@gitee.com:doctor_owen/luffyapi.git
5.提交代码到远程源
git push 源名 分支名
eg:git push origin master
6.克隆远程源
git clone 远程源地址
"""
1)通过克隆方式连接远程源,默认远程源名就叫origin;所以主动添加远程源来连接远程仓库,源码也用origin
2)本地一个仓库只需要和远程一个源进行同步,所以只需要连接一个远程源,如果还想把本地代码同步给第三个平台,那么可以通过主动添加远程源来连接第三个平台的远程仓库,此时的源码就不能再叫origin了,比如online都可以
3)pull和push都可以提供选择不同的源码,和不同的远程仓库交互
"""
远程仓库
远程仓库: github gitlab gitee
远程仓库以:gitee 为例,目标:把luffy_api提交到远程仓库
"""
1)你作为项目仓库初始化人员:
线上要创建空仓库 => 本地初始化好仓库 => 建立remote链接(remote add) => 提交本地仓库到远程(push)
2)你作为项目后期开发人员:
远程项目仓库已经创建成功 => 复制远程仓库到本地(clone) => 进入仓库就可以进行接下来的开发
"""
基于https链接远程仓库
远程仓库是空的情况
以gitee为例
点击右上角 + 新建仓库,在创建仓库时没有选择初始化仓库、设置模板、选择分支模型任一情况下仓库就为空
1 本地:git init
2 本地:git add .
3 本地:git commit -m 提交版本
4 指定远程仓库地址
# 添加一个远程仓库,名字叫origin 地址是 后面地址
git remote add origin https://gitee.com/liuqingzheng/luffy_api.git
5 推送到远端
git push origin master
6 弹出:让你输入用户名和密码---》gitee的用户名密码
之后账户和密码被记录到电脑凭据管理不用在输入
远程仓库不为空的情况
以gitee为例
点击右上角 + 新建仓库,在创建仓库时选择了初始化仓库、设置模板、选择分支模型任一情况下仓库都不为空了
1 本地先不做仓库---》.git 删除
复制项目路径找到.git,把.git文件夹删除
2 找个位置,把远程仓库内容下载,之后会产生个以仓库名命名的文件夹
gitee>代码>克隆下载>HTTPS>
git clone https://gitee.com/liuqingzheng/luffy_api.git
3 复制项目路径找到项目文件,将项目文件夹下的文件全部复制到这个以仓库名命名的文件夹文件夹下
4 在以仓库名命名的文件夹下右击 Open git Bash here提交到本地仓库
git add .
$ git config --global user.name 'nfj'
$ git config --global user.email 'nfj'
git commit -m
5 推送到远程仓库
git push origin master
本地还没开始写代码,远端建仓库(有东西)
-把远端仓库下载下来,用pycharm打开,写代码--本地提交--提交到远程
现在公司里现有项目已经有代码了,也用版本管理了
-远程仓库一定是空
-本地的不要删---》直接提交到远程---》远程也有之前的版本管理
普通开发者,使用流程
1 领导会把你的账户添加为开发者
2 下载代码到本地--》在这个基础上开发
-方式一命令:git clone https://gitee.com/liuqingzheng/luffy_api.git
-方式二:使用pycharm下载
-先配置git
-方式三:下载zip,下载后使用pycharm打开
3 使用pycharm打开
-写代码,提交到本地仓库
-提交到远程仓库
基于ssh链接远程仓库
# 之前,提交,拉取代码 都是走的https协议,公司内部,一般会走 ssh协议,以后不需要用户名密码了,只需要ssh的公钥和私钥
# 加密方式
-对称:AES,DES
-非对称:
# 公司里,常用ssh协议方式推送代码
-git@gitee.com:liuqingzheng/lqz.git
-它不需要用户名密码,而需要:公钥私钥【非对称加密】
-在本地机器生成公钥[可以给任何人]和私钥[自己留着]
操作步骤
1 生成公钥私钥
cmd执行命令
ssh-keygen -t ed25519 -C "邮箱"
一路敲回车
2 用户家路径,生成.ss文件
-用户家路径C:\Users\Administrator\.ssh
- 私钥文件 id_ed25519
- 公钥文件 id_ed25519.pub
3 复制你的公钥,配置在gitee上
账户>设置>安全设置>ssh公钥,把公钥粘贴,确定
# 以后,再操作git,不需要用户名密码了(走的是公钥和私钥)---》只针对于你这台机器
## 把远程仓库的连接,修改成ssh协议
4. 删除本地跟远程仓库的链接关系,把原来的remote的对应关系删除
git remote remove origin
5. 新增一个对应关系,协议是ssh
gitte>代码>克隆下载>选择ssh>复制
git remote add origin git@gitee.com:liuqingzheng/luffy_api.git
6 以后本地改了代码,提交到本地版本库,想推送到远程仓库,直接 git push即可,不需要再输入用户名密了
总结
1 用gitlab,可能你自己注册账号,也可能别人直接给你注册号了,你直接登录,修改密码即可
2 登录gitlab能看到代码仓库,仓库的所有者[你们领导],领导会把你加成开发者
3 进入到你的家里,你就能看到这个项目了
4 项目clone到本地
-https方式:git clone https://gitee.com/liuqingzheng/luffy_api.git
-ssh方式:git clone git@gitee.com:liuqingzheng/luffy_api.git
5 在本地生成公钥私钥,把公钥配置在gitlab
6 以后,在pycharm中打开项目写功能,提交到本地,提交到远端即可
协同开发
协同开发
1.新建文件夹用来存储仓库项目,在该文件夹下内右击Open git Bash here
2.克隆文件
git clone 代码>克隆下载复制地址
3.pycharm 打开该项目
编写代码
4.pull代码
#必须切换到要交互的分支,在与远程同名的分支进行交互,如本地dev与远程dev交互
5.提交代码
pycharn终端cd到项目目录下
git checkout dev
git add .
git commit -m
git push origin master
有冲突情况
# 同学一:
git clone 项目
pycharm打开
写代码:__init__.py
git add . # 当前目录下有个venv文件夹--》删除这个文件夹
git commit -m 'ss' # 设置用户名和邮箱
git push origin master # 推不上去,与远程仓库不一致,重新拉取 git pull origin master
无冲突情况
# 同学二
在pycharm中改代码
改的不是同一个文件
git add .
git commit -m 'sasdfasd'
git pull origin master # 由于我们改了不是同一个文件,不会冲突
git push origin master # 把自己的推上去即可
解决冲突
1)在远程仓库和本地仓库版本不一致时,拉取远程仓库版本到本地时,两个版本进入融合,可能会出现版本冲突
2)定位冲突文件冲突代码,线下沟通冲突代码,整合代码解决冲突
3)将解决冲突后的代码重新提交到本地版本库
4)再拉去远程仓库,直到没有冲突,提交本地版本库到远程
"""
<<<<<<< HEAD # 冲突的开始
# 自己的代码
======= # 分割线
# 别人的代码
>>>>>>> b63c408abd05b87fc492d40523240561999dba50 # 冲突的结束(版本)
"""
"""
出现冲突的前提:
1)不同开发者同时操作了同一文件
2)并且在相同行写了代码
强调:有业务交际时,版本合并不一定会出现冲突相关的标识,但是可能会带着代码运行崩溃,所有理论上每一次版本合并,都要测试合并后的所有功能(及其之少的情况)
"""
多人在同一分支开发
# 同学一:
git clone 项目
pycharm打开
写代码:__init__.py ,第五行,改成 print('阿斯顿发送到发')
git add . # 当前目录下有个venv文件夹--》删除这个文件夹
git commit -m 'ss' # 设置用户名和邮箱
git push origin master # 推不上去 git pull origin master
# 同学二
在pycharm中改代码
改的是同一个文件,不同行 print('aaa')
git add .
git commit -m 'sasdfasd'
git pull origin master # 由于我们改了是同一个文件,会冲突
删除报错,看代码,如果改的一样,就留别人的,把自己的代码删除
git add .
git commit -m
git push origin master
合并分支
# 操作步骤
git pull origin master
git branch dev
# 在dev分支操作
git checkout dev
在settings.py最后写代码
git add.
git commit -m 'dev加代码'
# 在master分支操作
git checkout master
在settings.py最后写代码
git add.
git commit -m 'master加代码'
# 合并分支出冲突
git merge dev # 出冲突了,解决冲突,再提交
git add .
git commit -m
远程分支合并
线下分支合并
git merge dev
线上分支合并
-公司有个主分支---》只保留大版本信息,真正的开发在dev分支开发
-你开发的代码,提交到dev分支了,功能写完了,要给用户看了,把dev分支合并到主分支
-可以线下分支合并,合并完,推送上去--》没有权限,只能仓库管理员来做
-线上分支合并:
提交:pr:pull request mr:merge request
远端有分支,本地也有分支
-1 远程创建,本地拉取
本地执行:git pull origin dev ,git checkout dev
-2 本地创建,提交到远端
本地执行:git branch dev1,git checkout dev1,git push origin dev1
# 操作步骤:
- 1 远端创建dev分支
- 2 本地 git pull origin dev
- 3 git branch 查看看不到,直接checkout 到dev分支就可以了
- 4 dev分支写代码,本地提交,推送到远端dev
- 5 功能开发完了,普通开发者,提交pr
- 6 管理员点审查,测试通过--》同意合并---》dev就合并到master
远程仓库回滚
# 1 本地回到 初始化的状态(主分支)
git reset --hard 9cac70d
# 2 强制推送到远端
git push origin master # 失败
git push origin master -f
为开源项目贡献代码
# 1 fork 开源代码----》你仓库就有这个代码
# 2 clone你仓库的代码
# 3 写代码,提交到你仓库
# 4 你仓库,提交pr 你仓库的某个分支 合并到别人的某个分支
# 5 对方审核通过,同意,才ok
git工作流,git pull和git fetch,变基
1 git 工作流:git flow---》分支方案
-我们没有采用
-master dev bug
2 git pull 和 git fetch
-git pull 从远程仓库拉取代码:从远程获取最新版本并merge到本地
-git fetch 从远程仓库拉取代码:会将数据拉取到本地仓库 - 它并不会自动合并或修改当前的工作
-git pull =git fetch +merge
3 变基 rebase
-1 多个提交记录整合成一个
-2 解决多次合并分叉问题
pycharm操作git
# 之前用命令做的所有操作,使用pychrm点点就可以完成
# settings要配置git
克隆代码
提交到暂存区,提交到版本库,推送到远程
查看日志
分支操作
其他
多设备开发
# 公司电脑,有代码
git branch lqz
git checkout lqz # 创建一个自己的分支,写代码
vi new.txt
git add .
git commit -m '公司开发了'
git push origin lqz
# 家里电脑,没有代码,需要先克隆
cd Desktop/proj
git clone https://gitee.com/liuqingzheng/app01.git
cd app01
git pull origin lqz #拉取lqz分支内容
git checkout lqz # 切换到lqz分支
# 基于此继续开发,公司开发的代码也拉下来了,写完记得提交到远程
# 到了公司只需要再pull一下即可把家中开发的开发同步过来
git忽略文件
如果一个文件夹被git管理了,所有文件都会被管理,所有文件发生变化,都会变红,在一个文件夹中,可能有些文件不想被git管理,这时候需要设置忽略文件.gitignore文件
# 使用方式
1 在仓库目录下(其它目录下不要有),新建一个文件:.gitignore
2 在里面写忽略文件名或文件夹名
# 忽略文件,在一开始就要忽略,如果已经被版本管理了,再忽略就没用了,如果之前没管,已经提交了
删除---》提交到版本库---》再在忽略文件中加入
过滤文件内容
文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
/文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
eg:
a.txt:项目中所有a.txt文件和文件夹都会被过滤
/a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
*x*:名字中有一个x的都会被过滤(*代表0~n个任意字符)
空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
本文暂时没有评论,来添加一个吧(●'◡'●)