Git
这个年代,不会点Git真不行啦,少年别问问什么,在公司你就知道了~
Git是一个协同开发的工具,主要作用是进行版本控制,而且还能自动检测代码是否发生变化.
一. 安装
下载地址:https://www.git-scm.com
二 .进入 git bash
wins:
(1)进入要进行管理的文件夹,空白处右键,弹出框就会有
(2)安装后,电脑桌面也会有个的图标
三.开始使用-git常用命令
一.基本使用
记住:如果要管理哪里文件,就进入哪个文件夹
1. git init 初始化git仓库
git仓库存放文件夹是 .git文件夹里,如果你的电脑上没有,应该是文件夹隐藏了,勾选“隐藏的项目"就可以看见了
之后所有的版本都会放到 .git 文件夹里。
2.git status 查看当前的状态(红色,绿色, 白色)
下面红色的文件,表示还没有被管理起来的文件
3. 选个文件进行管理:git add flask_ctx/
4.然后在git status查看管理状态
5. git add ./ 把包括根目录在内的所有文件都管理起来
所有变绿的文件都表示已经准备好了,接受管理
6.克隆所有变绿的文件保存起来,这些文件就会变成白色的了
6-1 git config --global user.mail "victorm315@163.com"
6-2 git config --global user.mail "victorm315@163.com"
6-3 git commit -m ”第一次把所有的文件都保存起来“
备注:”引号里的内容一定是要详细写的,防止将来你看不懂,千万别乱写,给自己挖坑“
6-4 再git status,下面就没有需要提交的文件了
7.此时,你的文件已经被真正管理起来了,之后你的文件不管发生什么风吹草动,都会被git检测到
7-1 如果你再pycharm里add了文件,pycharm 就会自动提示你是否增加文件到git
7-2 也可以通过 git status 检测,发生变化的文件就会被标红,而且再pycharm的目录树里也是红色的
.idea 是pycharm自动生成的,不是我们的代码,可以忽略他
7-3 继续执行: git add . 和 git commit -m 提交
8. git log 查看提交日志,可以看到共提交了几次
9. git reset --hard 要回滚到的版本号 回滚到某一个版本
9-2 再 git log 可以查看提交日志,下图已经显示只有第一次提交的内容了
查看文件:不需要的代码已经没有了
10. git reflog 查看历史提交记录
11 git reset --hard 需要恢复的id 恢复刚才删掉的代码
已经被删掉的代码就又回来了
问题场景:
新功能A已经开发了一半,但是线上出现bug了,需要回到上被版本紧急修复,那这里存在一个问题,新功能A怎么能暂时存在某个地,等修复完线上bug后再接着开发新功能A呢?
二.Git之stash(方案一:一般是自己用的,公司不用)
stash用于将工作区发生变化的所有文件获取临时存储在“某个地方”,将工作区还原当前版本未操作前的状态;stash还可以将临时存储在“某个地方”的文件再次拿回到工作区。
看完之后,对应stash命令,要抓住关键词:临时 + 临时存储的“某个地方”
1. git stash :将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
2. bug修复后,git add . + git commit -m “bug修复” 提交
3. 拿回新功能A的代码,继续开发
git stash pop: 将第一个记录从“某个地方”重新拿到工作区(可能有冲突),如果出现冲突,需要手动自行解决
如果手动修改冲突代码:
1. Pycharm里会提示那部分代码冲突了,将你需要的代码保留,其他不需要的删除掉
2 .idea/workspace.xml 相应的冲突的地方也需要修改
冲突解决完成后,继续开发,再重复提交版本管理等。
git stash list :查看“某个地方”存储的所有记录
git stash clear:清空“某个地方”
git stash apply 编号:将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
git stash drop 编号:删除指定编号的记录
三. git 之 branch(公司项目中,一般都用branch)
branch:称为分支,默认仅有一个名为master的分支。一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支。
branch相关常用命令:
- git branch 分支名称 创建分支
- git checkout 分支名称 切换分支
- git branch -b 分支名称 是上面两条命令的合并,即创建又切换
- git branch -m 分支名称 创建并切换到指定分支
- git branch 查看所有分支
- git branch -d 分支名称 删除分支
- git merge 分支名称 将指定分支合并到当前分支
演示:
1. 先从master主干上拉一个branch分支出来进行新需求的开发:
git branch dev:从master主干上创建分支,分支名字是dev
git checkout dev:切换到到dev分支
ls: 查看当前目录下有哪些文件
touch 文件名: 在dev分支上创建文件
2. 记住:如果要切换其他分支或者主干,一定要先提交一下在分支上的代码
git add .
git commit -m "dev分支"
3. 切回master主干,看一下是否提交到了master上
git checkout master : 切换回master
4. 再拉一个bug分支,修复bug
5. bug分支与master合并
5-1. 合并前要先提交bug分支的代码
5-2. 再切回到master主干(合并到哪个分支,就要切换到哪个分支): git checkout master
5-3. 合并bug分支到master: git merge 被合并的分支名称 ---- 合并的时候可能会产生冲突,产生冲突就要手动去合并了
5-4. 根据规定,决定要不要删除分支:git branch -d 要删除的分支名称
所以线上出现bug了怎么办?(面)
创建一个bug分支,在bug分支上修复,修复完成后,再合并到master。
6.再切换到dev分支,继续开发
6-1 开发完成,提交
6-2 切换到master
6-3 合并到master,此时会出现一个vim界面,可以进行编辑,比如写一些注释行说明,
6-3-1 按 键盘 “i ” 键,进入vim编辑模式
6-3-2 编辑完成后,先按 esc, 再按 : , 然后按wq:报错并退出
6-4 然后可以看log : git log
其实按照这个图可以一直玩下去
四. git 之 rebase
rebase的作用(面):
1. 用于合并,同merge
2. 并且将提交记录合并到一条主线上,能让提交记录更加整洁
3. git rebase 也会产生冲突,同样需要手动合并解决冲突
4. 解决冲突后,需要执行 git rebase --skip
所以,那该用merge还是rebase进行合并呢?
视情况而定:如果要保留每次提交记录,就用merge,如果不需要刻意用rebase
四.git之远程仓库 github
github:国外的平台,目前开源的代码,或者优秀的程序都放在这个平台上。也是全球最大的程序员的交流平台
GitHub,一个基于Git实现的代码托管的平台,可以将内容以及版本记录在远程也保存一份,这样就不用U盘咯(类似于云盘)。
PS: 类似GitHub的产品还有许多,如:GitLab、Bitbucket、码云(码云可以给开几个私有账号,别人看见)等。
很多公司处于安全和保密考虑,也会搭建自己的代码管理仓库:gitlab
github的使用
以码云为例,其他如gitbug都是一样的,操作命令也相同;只是gitbug在国外,操作比较慢。
使用git仓库的前提条件是要先注册个账号哦。
A 客户端的操作
1. 在github里创建项目
新建项目,然后会获得一份简易的入门指导如下图:
2. 进行全部配置,就是说明谁来提交代码,下面的配置在最开始已经配置过了
git config --global user.name "马明辰" git config --global user.email "victorm315@163.com"
3. 在git bash 添加远程添加:意思是将代码推送到后面的地址:https://gitee.com/victorm315/StudyGitHub.git
origin 是 https://gitee.com/victorm315/StudyGitHub.git的别名,以后就可以用origin来代替 https地址了。
4. 把当前commit的所有代码push到上面的地址
解释:把master 分支push到origin代表的地址里去
push的时候会出现码云的用户名校验,正确输入即可
然后刷新,就可以看到提交的代码了。这是master分支的代码。
5.dev分支的也推送到远程仓库进行托管
记住:要push那个分支,就要先切换到该分支
2. B客户端获取代码
1 如果是第一次拉,你的文件夹是空的,可以通过克隆的方式获取代码
被克隆的代码准备放在那里,要先进入该目录
命令: git clone https://gitee.com/victorm315/StudyGitHub.git
2 进入目录,可以看到,克隆下来的代码是master的,是把所有代码完全copy下来了,而我们要开发是要在dev分支上操作的。
3 拉取dev,可以按照下面的方式拉取了
4 就可以开始在dev上继续开发代码了
比如修改了g.log文件
5 把刚才提交到本地.git文件夹的代码还需要push到远程仓库才能真正实现dev代码的托管
A 客户端:
至此,远程仓库已经是最新代码,但是A客户端本地还不是最新代码,那又如何在A客户端获取远程仓库最新的代码呢?
同B客户端一样,也要先进入需要操作的代码目录,然后拉取最新的代码,命令同B客户端一样的
然后就可以在A客户端 dev 分支接着开发项目了。
C 客户端
在C客户端还可以有另外一种方式获取源代码
1. 先创建个空目录,起个名字进行初始化 git init
2. 注册到远程仓库: git remote add origin 地址
3. 拉取master分支
(1~3 就跟克隆其实一样的)
4. 接着创建dev分支,继续写代码,add, commit, push
长此以往,将Git和GitHub结合使用做到避免电脑损坏造成数据丢失以及多地开发的问题,上文执行过程中执行
【git pull origin 分支】命令等同于【git fetch origin 分支】+ 【git merge origin/分支】or 【git rebase origin/分支】,
并且在执行过程中可能会出现冲突,原因是由于本地代码和获取的最新代码有重合部分,那么就需要自己手动解决冲突然后再继续开发。
五. git 之开发规范
在公司怎么进行协同开发的呢?(面)
一般是为每个人创建一个分支进行开发
公司是否做代码的review?谁来做?怎么做的?
代码review一定要做的;一遍是直接leader做的review,或者老大与相关成员一起做review的;review的时候会再创建一个review的分支
公司一般是怎么合并代码的?
一般是每个小功能完成后,当天就会合并一次,防止后期代码合并时出现大量的代码冲突。
在git上如何协同开发?
-- 通过合作者的方式
-- 通过创建组织,邀请成员的方式
-- fork方式
fork的主要流程:
用户A fork别人B的代码:
1. 对于你想fork的代码,点击 fork, 相当于是把别人的项目copy到了你的账户目录里。
2. 对于相关的代码进行修改,然后点击执行 New pull request
3. Create pull request,编辑相关信息,提交给源代码的owner了
B用户:
1. 收到消息,点击 Merge pull request ,就能看到A提交的信息
2. 点击Confirm Merge,在用户B的源代码里就能看到用户A提交的代码信息了
六. Git 之 .gitignore文件
项目中经常有一些文件如数据库文件、开发工具如pycharm生成的.idea文件等,都是不能上传到github或者想忽略.idea,怎么做呢?
可以通过 .gitignore 文件进行忽略
1. 首先创建 .gitignore文件
命令:touch .gitignore
2. 在.gitignore文件里写上需要忽略掉的文件名
3. git add . 和 git commit -m "提交日志"
4. .gitignore文件里能写什么内容?
1)以斜杠“/”开头表示目录; 如:.idea/ 2)以星号“*”通配多个字符; 3)以问号“?”通配单个字符 4)以方括号“[]”包含单个字符的匹配列表; 5)以叹号“!”表示不忽略(跟踪)匹配到的文件或目录;
A 具体怎么写,github里也给你想到了,可以参考哪些文件需要ignore,然后选择Python.gitignore,就有Python官方的gitignore文档。
https://github.com/github/gitignore/blob/master/Python.gitignore
B 在你创建项目的时候,也是可以选择配置.gitignore的
七. git 之 tag
git tag用于控制 v1, v2 的版本。
1. 创建本地Tag
-a:表示创建一个含附注类型的标签,含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;
还有一种标签类型是轻量级标签,轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。
-m:指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。
2. 查看本地tag
3. 查看本地tag,模糊匹配
4. 删除本地tag
5. 切换tag
6. 查看