git操作
git与svn比较
svn
一个服务端,修改的数据直接提交给服务端,一旦服务端损坏或被黑就会造成提交的台代码丢失造成开发进度停滞
git
客户端与服务器端整合,当服务器出现问题时,会直接将一个客户端作为备用服务器,不会影响开发进度
git的工作流程
git分支管理
git使用
流程
"""
1)有红色信息(工作区有内容),就执行 add
2)全绿信息(内容全部在暂存区),才执行 commit
3)只有被版本库控制的代码,才能被监听,所以可以回滚到任何一个版本
"""
基础命令
初始化git仓库
"""
>: cd 目标文件夹内部
>: git init
"""
# 指定目录下初始化仓库
"""
>: cd 目标目录
>: git init 仓库名
"""
设置用户
# 设置全局用户
"""
>: git config --global user.name '用户名'
>: git config --global user.email '用户邮箱'
注:在全局文件 C:\Users\用户文件夹\.gitconfig新建用户信息,在所有仓库下都可以使用
"""
# 设置局部用户
"""
>: git config user.name '用户名'
>: git config user.email '用户邮箱'
注:在当前仓库下的config新建用户信息,只能在当前仓库下使用
注:一个仓库有局部用户,优先使用局部用户,没有配置再找全局用户
"""
查看仓库状态
"""
# 当仓库中有文件增加、删除、修改,都可以在仓库状态中查看
>: git status
-- 查看仓库状态(红色和绿色), 必须全绿再提交到版本库
>: git status -s
-- 查看仓库状态的简约显示
"""
工作区操作
# 通过任何方式完成的文件删与改
# 空文件夹不会被git记录
- 撤销工作区操作:改、删(不常用)
"""
>: git checkout .
-- 撤销所有暂存区的提交
>: git checkout 文件名
-- 撤销某一文件的暂存区提交
"""
-
提交到缓存区
""" >: git add . -- 添加项目中所有文件 >: git add 文件名 -- 添加指定文件 """
-
撤销缓存区提交(不常用)
""" >: git reset HEAD . -- 撤销所有暂存区的提交 >: git reset 文件名 -- 撤销某一文件的暂存区提交 >: git reset . -- 撤销所有暂存区的提交 """
-
提交内容到版本库
>: git commit -m "版本描述信息"
-
回滚
回滚暂存区已经提交到版本库的操作: 查看历史版本: >: 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 文件
# 1)在仓库根目录下创建该文件
# 2)文件与文件夹均可以被过滤
# 3)文件过滤语法
""" 过滤文件内容
文件或文件夹名:代表所有目录下的同名文件或文件夹都被过滤
/文件或文件夹名:代表仓库根目录下的文件或文件夹被过滤
eg:
a.txt:项目中所有a.txt文件和文件夹都会被过滤
/a.txt:项目中只有根目录下a.txt文件和文件夹会被过滤
/b/a.txt:项目中只有根目录下的b文件夹下的a.txt文件和文件夹会被过滤
*x*:名字中x的都会被过滤(*代表0~n个任意字符)
*.log:后缀名是log的文件都会被过滤
*.log*:后缀名带有log的文件都会被过滤
空文件夹不会被提交,空包会被提交,包可以被提交(包中有一个init空文件)
"""
多分支开发
创建分支
git branch 分支名
查看分支
git branch
切换分支
git checkout 分支名
创建并切换分支
git checkout -b 分支名
删除分支
# 删除分支前需要先切换到被删除分支之外的其他分支才能进行删除分支操作
git branch -d 分支名
查看远程分支
git branch -a
合并分支
git merge 分支名
# 把dev分支合并到master分支:切换到master分支,执行合并dev分支的命令
远程git开发
两种本地与远程仓库同步
"""
1)你作为项目仓库初始化人员:
线上要创建空仓库 => 本地初始化好仓库 => 建立remote链接(remote add) => 提交本地仓库到远程(push)
2)你作为项目后期开发人员:
远程项目仓库已经创建成功 => 复制远程仓库到本地(clone) => 进入仓库就可以进行接下来的开发
"""
Git 全局设置:
git config --global user.name "Yumi"
git config --global user.email "guanxiying0405@163.com"
创建 git 仓库:
mkdir LuffyCityProject
cd LuffyCityProject
git init
touch README.md
git add README.md
git commit -m "first commit"
git remote add origin https://gitee.com/guanxiying45/LuffyCityProject.git
git push -u origin master
已有仓库?
cd existing_git_repo
git remote add origin https://gitee.com/guanxiying45/LuffyCityProject.git
git push -u origin master
git项目创始者和开发者
# 1 项目创始者,如上
# 2 项目开发者,参与者(换了一台电脑),把代码拉下来继续开发
-git clone https://gitee.com/liuqingzheng/lqz_test.git
-能看到完整的版本和日志控制
-可以回复到任意版本
-git rest --hard 版本号
-git checkout . # 表示回到指针指向的版本,因为已经用git rest --hard把指针移动了,所以checkout .就是当前再的版本上的东西
# 3 本地新增c.txt文件
-提交到暂存区
-提交到版本库(没有提交到远程,远程看不到)
-提交到远程:git push origin master
# 4 让a文件夹中的代码成为最新的
-git pull origin master
# 5 重点:每次再提交代码之前,一定要先更新代码(拉),如果不拉提不上去
ssh连接和https连接
- 对称加密:加密和解密用同一套密码
- 非对称加密:(公钥和私钥),公钥加密,私钥解密
# 命令生成公钥和私钥
-ssh-keygen -t rsa -C "lqz@qq.com" 生成到用户家目录的.ssh文件夹下(一个公钥,一个私钥)
-把公钥复制出来,再码云上配置
-
跟远程操作的三个命令
git pull git push git featch(跟pull是一个东西,一般不用)
pycharm操作git
# 1 安装git
# 2 再pycharm中配置,setting---》git--->git.exe的地址
# 3 git clone --->等同于下图
# 4 使用pycharm创建本地分支(见下图)
# 5 拉取代码,如下图
# 6 push代码,如下图
git add .
git commit -m '信息'
git clone 拉去的远程仓库地址(ssh/https)
git branch 分支名
git checkout -b 分支名
git checkout 分支名
git pull origin master # 拉取远程仓库最新的版本
git push origin master # 推送更新的代码,必须要先拉取最新代码,否则提交不了
git push origin master -f # 强行提交,之前别人写的全没了,别人可以通过版本回滚找回
git log # 只能拿到回滚之前的记录
git reflog # 能够查看所有的版本跟记录
git reset . # 将暂存区的内容拿回工作区
协同开发
# 1 协同开发出现冲突,如何解决
# 2 git pull origin master 拉下远程代码,同事和你修改了同一个位置,会冲突,如下
<<<<<<< HEAD
你的代码
=======
别人代码
>>>>>>> origin/master
# 3 处理方案
-删除你的代码
-删除同时代码
-合并你们的代码
出现下图错误,需要先git pull拉取最新仓库代码,再git push将自己的代码提交上去
出现下图信息,则表示产生了冲突,只需要按照上面的三种处理方案的一种解决冲突再add、commit、push即可
合并分支出现冲突
# 1 分支:本地分支,远程分支
# 2 创建本地分支
-git checkout -b dev
# 3 把本地分支提交到远程
-git push origin dev
线上合并分支
# 如果看到可自动合并,表示合并后不会有冲突,正常操作即可
# 测试人员点通过,直接合并即可
线上回滚
# 1 切换到master分支
# 2 回滚打某个版本 git reset --hard 版本号
# 3 强制提交代码 git push origin master -f
分支合并出现冲突解决
# 1 远端创建一个dev分支
-在远端直接创建
-本地创建,提交到远端
git checkout -b dev
git push origin dev
# 2 本地新建一个dev_bug分支
-dev_bug分支改了文件
-dev分支改了同样的文件
-合并就出冲突
-git merge dev_bug (在dev分支上操作)
-解决冲突(删你的,同事的,合并起来)
-git add . git commit
-正常了,冲突解决
# 3 手动线下合并代码并提交到远程
-git checkout master
-git merge dev
-如果出冲突,解决
-git add .
-git commit
-git push..
变基
git rebase 分支名
git merge 分支名
上述两个命令都是用于合并分支
rebase与merge的不同点
- merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容
- merge 的提交历史忠实地记录了实际发生过什么,按照时间先后顺序
- git rebase提取操作有点像git cherry-pick一样,执行rebase后依次将当前的提交cherry-pick到目标分支上,然后将在原始分支上的已提取的commit删除。
- git rebase历史提交记录,看起来会更清楚:仿佛所有修改都是在一根线上先后完成的,尽管实际上它们原来是同时并行发生的。
简言之:使用rebase之后log中的之前版本的记录全部都是一条直线的,而merge则是回有分支合并线
使用merge合并分支后的log记录图
使用rebase之后的log记录图