git操作
linux基本命令
$ df -h 查看磁盘分区
$ pwd 返回当前位置所在的绝对路径
$ ~ 退回到家目录
$ ll .git/ 在当前文件夹查看下一层文件夹.git(隐藏文件夹)下的文件信息
$ ll 查看文件夹目录
$ ll |less 查看文件夹目录
$ ls -lA 查看隐藏文件
$ ls -lA|less 查看隐藏文件
$ cat .gitconfig 查看全局的隐藏文件
$ vim good.txt 创建一个文件,并可在该文件内编辑内容 i 进入编辑模式(可在文件内写内容)
esc 退出进入命令模式 :wq保存斌退出vim :set nu 给文件内容设置行号 :set nonu取消行号
$ touch 文件名 创建文件,同vim
$ cat good.txt 查看文件内容
Git的文件管理机制
'''
Git把数据看作是小型文件系统的一组快照,每次提交更新时Git都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git不再重新存储该文件,而是只保留一个连接指向之前存储的文件,所以Git的工作方式可以称之为快照流;
'''
版本控制器
"""
完成 协同开发 项目,帮助程序员整合代码
软件:SVN 、 GIT
git:集群化、多分支
"""
git
简介
"""
什么是git:版本控制器 - 控制的对象是开发的项目代码
代码开发时间轴:需求1 > 版本库1 > 需求2 > 版本库2 > 版本库1 > 版本库2
"""
git与svn比较
git的工作流程
git分支管理
git使用
安装
# 1.下载对应版本:https://git-scm.com/download
# 2.安装git:在选取安装路径的下一步选取 Use a TrueType font in all console windows 选项
基础命令
将已有的文件夹 - 初始化为git仓库
"""
>: cd 目标文件夹内部
>: git init
"""
在指定目录下 - 初始化git仓库
"""
>: cd 目标目录
>: git init 仓库名
"""
在仓库目录终端下 - 设置全局用户
>: git config --global user.name '用户名'
>: git config --global user.email '用户邮箱'
注:在全局文件 C:\Users\用户文件夹\.gitconfig新建用户信息,在所有仓库下都可以使用
查看全局用户签名:
cd ~ # 退到根目录
ls -lA|less 查看.gitconfig隐藏的文件
cat .gitconfig # 查看.gitconfig中的内容
在仓库目录终端下 - 设置局部用户
>: git config user.name '用户名'
-- 用户名
>: git config user.email '用户邮箱'
-- 用户邮箱
注:在当前仓库下的config新建用户信息,只能在当前仓库下使用
注:一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
查看用户名、邮箱保存位置,先进入仓库(文件夹):
$ cat .git/config
查看仓库状态
# 当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
>: git status
-- 查看仓库状态
>: git status -s
-- 查看仓库状态的简约显示
工作区操作
# 通过任何方式完成的文件删与改
# 空文件夹不会被git记录
撤销工作区操作:改、删
"""
>: git checkout .
-- 撤销所有暂存区的提交
>: git checkout 文件名
-- 撤销某一文件的暂存区提交
"""
工作区内容提交到暂存区
"""
>: git add .
-- 添加项目中所有文件
>: git add 文件名
-- 添加指定文件
"""
撤销暂存区提交:add的逆运算
"""
方式1:
$ git rm --cached good.txt
方式2:
>: git reset HEAD .
-- 撤销所有暂存区的提交
>: git reset 文件名
-- 撤销某一文件的暂存区提交
"""
提交暂存区内容到版本库
# git commit -m "版本描述信息" 文件名
eg:$ git commit -m 'my second commit -modify good.txt' good.txt
撤销版本库提交:commit的逆运算
"""
回滚暂存区已经提交到版本库的操作:
查看历史版本:
>: git log
>: git reflog 指针HEAD@{移动到当前版本的步数}
>:$ git log --pretty=oneline 将历史版本信息单行显示(简洁版),显示所有版本信息
>:$ git log --oneline 单行显示比当前版本更低的版本,commit对应的hash值只部分显示
查看时间点之前|之后的日志:
>: 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
# 强行将线上版本回滚到本地指定的版本
# 1.查看版本号:
>:eg: git reflog
# 2.本地仓库先回滚到指定版本
>:eg:git reset --hard da5d
# 3.线下版本同步到远程(线上)版本
>:eg: git push origin dev -force
恢复到指针当前指向的版本位置:
>:$ git reset --hard HEAD # 执行$ rm apple.txt 操作,文件此时在暂存区,执行前面的操作可以恢复当前文件
"""
log日志信息过多,需要多屏展示,展示方式如下:
空格向下翻页
b向上翻页
q退出
reset命令的三个参数对比:
--soft 参数
仅仅在本地库移动HEAD指针
eg:$ git reset --soft ec666cc 查看版本库状态为绿色
原因:会把暂存区凸显出来
--mixed参数
在本地库移动HEAD指针
重置暂存区
$ git reset --mixed 7c8d13a 查看版本库状态为红色
原因:本地库跟暂存区改变了位置,所以工作区被凸显,工作区还在原地,文件在工作区的状态还是红色,
--hard参数
在本地库移动HEAD指针
重置暂存区
重置工作区
比较文件差异
git diff[文件名]
将工作区中的文件和暂存区进行比较
eg:$ git diff apple.txt 会显示出两者内容的差异(git默认是以行内容区分两者差异的)
#=================================
提交到缓存区之后,再次比较就没差异了
$ git add apple.txt
$ git diff apple.txt
# ===============================
git diff [本地库中的历史版本] [文件名]
eg:$ git diff HEAD apple.txt # 也会显示差异
将工作区中的文件和本地库历史记录比较
不带文件名比较多个文件
eg:$ git diff HEAD
过滤文件
如何生成一个以.gitignore结尾的过滤文件呢?
1.在Git仓库的根目录下面创建一个任意名称的.txt文件
2.启动cmd窗口 cd到仓库的根目录 执行ren 原.txt文件名 .gitignore
注意:其实还有一种简单的创建方式,如下:
在创建以‘.’开头的隐藏文件时,需要在文件名末尾再加上一个‘.’就能创建成功。
# .gitignore 文件
# 1)在仓库根目录下创建该文件
# 2)文件与文件夹均可以被过滤
# 3)文件过滤语法
""" 过滤文件内容
文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
/文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
eg:
a.txt:项目中所有a.txt文件和文件夹都会被过滤
/a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
*x*:名字中有一个x的都会被过滤(*代表0~n个任意字符)
空文件夹不会被提交,空包会被提交 空包下有__init__.py文件,是导包的初始化文件
"""
注意:前台和后台的根目录下都会有一个.gitigenore过滤文件,把一些不需要上传到版本库中的文件及包过滤掉,过滤条件一定要在第一次提交版本库之前完成。后台要手动创建:
# .gitignore文件内应该过滤的文件,比如以下:
# 过滤条件一定要在第一次提交版本库之前完成
# 各类编辑器产生的配置文件
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
# 日志文件
.log
*.logger
# 本地测试文件
scripts
# 导包缓存文件
*.pyc
__pycache__
后台项目提交到版本库
后台项目提交到版本库两种方式:
1.直接在Git Bash Here 进入到后台项目文件夹
$ cd G:/Python代码日常/day1/day1_proj
2.在改文件夹下初始化仓库
$ git init # 初始化完毕之后pycharm里所有的后台文件都变成红色了,因为此时所有文件都在工作区
3.$ git add . 将所有文件提交到暂存区 # 此时pycharm所有文件变成绿色
4.1(使用git命令行提交):
git commit -m
4.2(直接在pycharm中提交):
此时pycharm已经有了git环境,在项目的根目录文件夹右键,选择“git”-->“Commit Directory-->添加comments-->点击下方commit按钮”
git 标签的命令使用
git add .
git commit -m "comment"
git push origin master
git tag -a "v1.1" -m "1.1"
git push origin v1.1
git tag # 在控制台打印出当前仓库的所有标签
git tag -a "v1.1" -m "add v1.1" # -m选项添加注释信息 添加一个tag
git tag -l 'v1.1' # 搜索符合模式的标签
git push origin [tagname]
git push [origin] --tags # push所有tag origin可省略
git tag -d tag-name # 删除本地tag
git push origin :refs/tags/tag-name # 删除远程tag
eg:git push origin :refs/tags/v1.1
创建远程gitee仓库
选择线上仓库
1.注册码云账号并登录:https://gitee.com/
2.创建仓库(课堂截图)
3.本地与服务器仓库建立连接
"""
"""
1)本地配置线上的账号与邮箱
>: git config --global user.name "zhangchao"
>: git config --global user.email "zhangchao@163.com"
2)在本地初始化仓库(git init),并完成项目的初步搭建(项目架构)(一般都是项目负责人完成项目启动)
# 这个过程就是git的基础部分的本地操作
3)采用 https协议 或 ssh协议 与远程git仓库通信提交代码(一般都是项目负责人完成)
i) https协议方式,无需配置,但是每次提交都要验证管理员账号密码
>: git remote add origin https://gitee.com/zhangchao/liren.git # 配置远程源
>: git push -u origin master # 提交本地仓库到远程源
ii) ssh协议,需要配置,配置完成之后就可以正常提交代码
>: git remote add origin git@gitee.com:zhangchao/liren.git # 配置远程源
>: git push -u origin master # 提交本地仓库到远程源
iii)查看源及源链接信息
>: git remote
>: git remote -v
iv)删除源链接
>: git remote remove 源名字
注:origin远程源的源名,可以自定义;master是分支名,是默认的主分支
克隆
git clone [远程地址]
'''
执行以上命令的三个效果:
完整的把远程库下载到本地
创建origin远程地址别名
初始化本地库(所以我们不需要再手动去初始化)
'''
用本地仓库首次初始化远程仓库并提交代码
本地仓库与远程仓库建立源连接
前提:本地仓库已经创建且初始化完毕(代码已经提交到本地版本库)
本机命令,添加远程源:git remote add origin ssh@*.git
采用ssh协议的remote源
创建电脑的公钥私钥
官网:https://gitee.com/help/articles/4181#article-header0
本机命令,生成公钥:ssh-keygen -t rsa -C "*@*.com"
邮箱可以任意填写
将本地rsa_id.pub 发送到指定机器的authorized_key文件,使用秘钥登陆机器。
ssh-copy-id -i ~/.ssh/id_rsa.pub 用户名@机器名
本机命令,查看公钥:cat ~/.ssh/id_rsa.pub
码云线上添加公钥:项目仓库 => 管理 => 部署公钥管理 => 添加公钥 => 添加个人公钥
在Git命令行中生成公匙:
在GitHub上添加公匙:(记得将下图Allow write access
勾选,不然对在创建的远程库只有读的权限,无法写入,就导致本地的代码无法添加到远程库中)
提交本地代码到远程仓库
命令:git push origin master
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 源名 源地址
>: git remote add orgin git@*.git
"""
多分支开发
分支操作
"""
1.创建分支
>: git branch 分支名
2.查看分支
>: git branch -v
3.切换分支
>: git checkout 分支名
4.合并分支
第一步:切换到接受修改的分支(被合并,增加新内容)上
eg:$ git checkout master
第二步:执行merge命令
>: git merge 分支名(修改文件的分支名)
执行完这两部操作,在一个分支上修改文件,在另外一个分支上也能同步修改的内容
5.创建并切换到分支
>: git checkout -b 分支名
6.删除分支
>: git branch -d 分支名
7.查看远程分支
>: git branch -a
"""
解决合并分支后产生的冲突
2、冲突解决
1)当不同开发者协同开发,导致远程仓库与本地仓库的版本不一致,在pull远程仓库到本地仓库时,会出现版本冲突
2)两个仓库不同版本中,出现了相同文件的修改情况,会出现文件的冲突
3)同一文件的修改,代码有重叠,一定会产生代码冲突,打开冲突的文件,文件中会表示冲突的开始与结束,分割线上下分别是冲突的代码
>>>>>>>>>>header
===========
<<<<<<<<<<1321adsa21
第一步:编辑文件,删除特殊符号
第二步:把文件修改到满意程度
第三步:git add [文件名]
第四步:git commit-m "注意信息"
注意:此时,commit一定不能带具体的文件名
4)冲突的解决没有固定的结果,但是要将冲突的标识删除,根据代码实际情况,线下沟通,整合代码即可
线上分支合并
Git global setup
git config --global user.name "Administrator"
git config --global user.email "1101172195@qq.com"
Create a new repository
git clone http://re_gitlab.clobotics.com/wind/wind_app.git
cd wind_app
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
Push an existing folder
cd existing_folder
git init
git remote add origin http://re_gitlab.clobotics.com/wind/wind_app.git
git add .
git commit -m "Initial commit"
git push -u origin master
# 做此设置,push/pull代码就可以省略origin master
git push --set-upstream origin master
# 直接 git push/pull
git push 推送代码到远程
git pull # 拉取代码到本地
Push an existing Git repository
cd existing_repo
git remote rename origin old-origin
git remote add origin http://re_gitlab.clobotics.com/wind/wind_app.git
git push -u origin --all
git push -u origin --tags