什么是GIT?
Git是一个免费、开源的版本控制软件,目前世界上最先进的分布式版本控制系统(没有之一)
什么是版本控制系统?
版本控制是一种记录一个或若干个文件内容变化,以便将来查阅特定版本修订情况得系统。
- 系统具体功能
记录文件的所有历史变化
随时可恢复到任何一个历史状态
多人协作开发或修改
错误恢复
版本控制的工具:
- svn 集中式版本控制系统
- git 分布式版本控制系统
集中式vs分布式
CVS及SVN都是集中式的版本控制系统,而Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢:
集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。
中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作。
分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。
既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。
因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
Git的优势不单是不必联网这么简单,后面我们还会看到Git极其强大的分支管理,把SVN等远远抛在了后面。
什么是Github
Github是全球最大的社交编程及代码托管网站(https://github.com/)。
Github可以托管各种git库,并提供一个web界面(用户名.github.io/仓库名)
Github和Git是什么关系
Git是版本控制软件
Github是项目代码托管的平台,借助git来管理项目代码
使用Git
项目背景:这个创业者想开发选课系统
阶段一:顺利上线代码
首先在你创建的项目的文件夹里面右键--->点击Gir Bash Here---->吧git运行起来。
1、初始化:git init
git init,初始化,表示即将对当前文件夹进行版本控制
git init
2、如果你第一次使用git的时候,需要配置一下。如果你已经配置了,以后就不用配置了
3、使用git init之后工作区有一个隐藏目录.git,这个不是工作区,而是git的版本库。
Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
4、添加当前的目录以及所有的子文件到暂存区
- git add 文件名,将指定文件添加到版本库的暂存状态。
git add . #所有的文件 git add README.md #具体添加的文件
git status查看当前状态,红色代表未跟踪的文件,绿色代表跟踪的文件(可以被版本库管理)
查看Git当前状态,如:那些文件被修改过、那些文件还未提交到版本库等。
5. 数据提交上线:git commit -m "描述信息"
将暂存区的文件提交到版本库的分支。
6、查看状态,看那个是否被修改过:git status
一定记得先add,后commit,add之后是没有放到版本里的,只有commit的时候才有版本
7、查看有几个版本:查看版本提交记录 :git log
查看提交记录,即:历史版本记录
8.修改某一个文件后,提交
9.查看提交后log
10、回滚到上一个版本:git reset --hard 版本号
11、再跳回去(查看往后的版本号):git reflog
Git把管理的文件分为了两个区域四个状态。
add到暂存状态的时候成绿色了,在commit的时候就没有了
提供了这个回滚的功能。
12、撤销修改:git checkout -- <file>(在add之前撤销)
13、撤销修改:git reset head -- <file>(在add之后撤销)
14、总结:
-
HEAD
指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
。 -
用
git log
可以查看提交历史,以便确定要回退到哪个版本。 -
用
git reflog
查看命令历史,以便确定要回到未来的哪个版本。 git diff HEAD -- readme.txt
命令可以查看工作区和版本库里面最新版本的区别- 场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令
git checkout -- file
。 - 场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令
git reset HEAD <file>
,就回到了场景1,第二步按场景1操作。 - 场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,使用git reset --hard commit_id,不过前提是没有推送到远程库。
阶段二:当开发到一半的时候出现bug,修复bug
- 开发直播功能
当项目开发到一半的时候,就是在此时线上运行平台出现Bug需要紧急修复,之前的版本出现bug了怎么办?
解决思路:使用分支
默认会有一个master的分支。只做线上的版本,注意不要在master分支上修改,要修改的话就创建一个bug分支
1、创建一个修复bug的分支:git branch bug ,这个bug分支是在master分支上建的,相当于拷贝了一份
2、查看一共有几个分支 : git branch
3、跳转到bug分支:git checkout bug
4、跳转到master分支:git branch master
5、创建一个开发新功能的分支:git branch dev #只做开发的版本
现在就有三个分支了,每个分支都是不一样的,bug修复完了,现在就要合并在master上了。
6、master和bug分支合并:git merge bug
7、删除bug分支:git branch -d bug
8、继续开发,切到dev:git branch dev
9、开发完毕,master和dev合并:git merge dev
切换之前一定记得把你的代码提交一下
git add .
git commit -m '修改bug'
合并的时候可能出现冲突,可能不出现,出现冲突了就得手动解决
@-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git branch bugdev # 创建分支bugdev @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ ls __pycache__/ main.py* Manager.py* pickle_util.py* School.py* Student.py* Teacher.py* @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git checkout bugdev #切换分支bugdev Switched to branch 'bugdev' M core/main.py @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ touch b.log #增加文件 @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ git add . #提交到暂存区 @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ git commit -m 'bugdev' #提交到版本库,修复bug [bugdev 7fc00b8] bugdev 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 core/b.log @-PC MINGW64 ~/PycharmProjects/stucourse/core (bugdev) $ git checkout master #切换到master分支 Switched to branch 'master' @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ ls __pycache__/ main.py* Manager.py* pickle_util.py* School.py* Student.py* Teacher.py* @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git merge bugdev # 合并bugdev分支 Updating 8562916..7fc00b8 Fast-forward core/b.log | 0 core/main.py | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) create mode 100644 core/b.log @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ ls #查看文件内容,多了b.log文件 __pycache__/ b.log main.py* Manager.py* pickle_util.py* School.py* Student.py* Teacher.py* @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git branch -d bugdev #删除bugdev分支 Deleted branch bugdev (was 7fc00b8). @-PC MINGW64 ~/PycharmProjects/stucourse/core (master) $ git branch #查看所有分支 dev * master $ git checout dev 继续开发dev内容 开发完内容之后,在master上合并dev内容 $ git checkout master $ git merge dev
流程图
branch相关常用命令: git branch 分支名称 创建分支 git checkout 分支名称 切换分支 git branch -m 分支名称 创建并切换到指定分支 git branch 查看所有分支 git branch -d 分支名称 删除分支 git merge 分支名称 将指定分支合并到当前分支
面试题:当公司代码出现bug时候怎么办?
解答:创建一个bug分支,修复bug后,合并到主分支上,然后删除bug分支
扩展:git rebase
合并+将提交记录合并到一条主线上,提交记录整洁
阶段三: 两个地方办公
云端需要一个存放代码的地方用Github或码云等
公共的
- Github是用来做代码托管的
- 码云,做代码托管
- csdn code ,做代码托管
内部搭建:
- gitlab
1、登录Github
在家里:
就会有这样一个地址,我们就可以用这个地址来提交
git remote add origin https://github.com/XXX/study1.git #给远程项目起一个别名origin git push -u origin master #把本地项目分支提交到GitHub远程项目
在公司:
家里: git add . git commit -m 'xx' git remote add origin https://github.com/WuPeiqi/greenlu.git git push origin master 公司: # 新公司第一次获取代码 方式一 git clone https://github.com/WuPeiqi/greenlu.git 方式二 git init git remote add origin https://github.com/WuPeiqi/greenlu.git git pull origin master 直接拿回来 方式三 git init git remote add origin https://github.com/WuPeiqi/greenlu.git 这的两句相当于git pull origin master 这一句 git fetch origin master 拿到分支上了 git merge origin/master 合并在一起 # 日后 git pull origin master # 或者 git fetch origin master git merge origin/master # 如果你在本地修改问题,又add,又提交,在线上去拿的时候,或许会冲突
图示
特殊场景解决
当你在家的时候吧代码上线了。到了公司以后吧线上的代码拉回来。
git pull origin dev
开始写代码了。
写完之后add commit。。。这时候忘了往github上提交了
回到家的时候,那今天写的代码没提交,怎么办呢?回公司太晚了,在写一遍浪费时间
,或许你还记着今天写的代码,就在这基础上又开发了,
这下提高了警记了,就记得提交了 add 、commit 、git push origin dev
第二天又到公司了,那昨天的代码怎么办呢、、?是拉下来呢?还是推上去呢?
如果你推上去的话,没有冲突还好,如果有冲突的话,那你把你的冲突都上线了,不让你提交,所以我们要先拉下来
先去吧代码拉下来,git pull origin dev 可能会有冲突,解决冲突。