git基本理解
1 常见版本管理工具介绍 及 版本工具作用
1. 为什么要使用版本控制
1、举例说明:
1)假设你在的公司要上线一个新功能,你们开发团队为实现这个新功能,写了大约5000行代码,上线没2
天,就发现这个功能用户并不喜欢,你老板让你去掉这个功能,你怎么办?
2)你说简单,直接把5000行代码去掉就行了,但是我的亲,说的简单,你的这个功能写了3周时间,但你
还能记得你是新增加了哪5000行代码么?
3)所以你急需要一个工具,能帮你记录每次对代码做了哪些修改,并且可以轻易的把代码回滚到历史上的
某个状态。 这个神奇的工具就叫做版本控制
2、版本控制工具主要实现2个功能
1)版本管理
在开发中,这是刚需,必须允许可以很容易对产品的版本进行任意回滚,版本控制工具实现这个功能的
原理简单来讲,就是你每修改一次代码,它就帮你做一次快照
2)协作开发
a. 一个复杂点的软件,往往不是一个开发人员可以搞定的,公司为加快产品开发速度,会招聘一堆跟
你一样的开发人员开发这个产品
b. 拿微信来举例,现在假设3个人一起开发微信,A开发联系人功能,B开发发文字、图片、语音通讯
功能,C开发视频通话功能, B和C的功能都是要基于通讯录的
c. 你说简单,直接把A开发的代码copy过来,在它的基础上开发就好了,可以,但是你在他的代码基
础上开发了2周后,这期间A没闲着,对通讯录代码作了更新,此时怎么办?你和他的代码不一致
d. 此时我们知道,你肯定要再把A的新代码拿过来替换掉你手上的旧通讯录功能代码, 现在人少,3
个人之间沟通很简单,但想想,如果团队变成30个人呢?
e. 来回这样copy代码,很快就乱了, 所以此时亟需一个工具,能确保一直存储最新的代码库,所有
人的代码应该和最新的代码库保持一致
2. 常见版本管理工具介绍
1、SVN –CollabNet Subversion
1. SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,
2. 所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。
3. 集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就纳闷了。
2、GIT
1. Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,
2. 这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。
3. 你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了,当然也可以推送到git的仓库中,比如GitHub
2 git、GitHub和SVN比较
1. Git
1、git是一个版本管理工具,是可以在你电脑不联网的情况下,只在本地使用的一个版本管理工具
2、其作用就是可以让你更好的管理你的程序,比如你原来提交过的内容,以后虽然修改了,但是通过git这个
工具,可以把你原来提交的内容重现出来
2. GitHub
1、github是一个网站,就是每个程序员自己写的程序,可以在github上建立一个网上的仓库,
2、你每次提交的时候可以把代码提交到网上,,这样你的每次提交,别人也都可以看到你的代码,同时别人也
可以帮你修改你的代码,这种开源的方式非常方便程序员之间的交流和学习
3、github是一个非常适合程序员交流的网站,很多国际上的技术大牛都在github上有自己的开源代码,其他
人只要申请个账号就可以随意的看到这些大牛写的程序
总结: git可以认为是一个软件,能够帮你更好的写程序,github则是一个网站,这个网站可以帮助程序员之间互相交流和学习。
3. SVN与git比较
1、Git是分布式的,SVN是集中式的,好处是跟其他同事不会有太多的冲突,自己写的代码放在自己电脑上,
一段时间后再提交、合并,也可以不用联网在本地提交
2、Git下载下来后,在本地不必联网就可以看到所有的log,很方便学习,SVN却需要联网;
3、Git鼓励分Branch,而SVN,说实话,我用Branch的次数还挺少的,SVN自带的Branch merge我还真没用过
4、SVN在Commit前,我们都建议是先Update一下,跟本地的代码编译没问题,并确保开发的功能正常后再
提交,这样其实挺麻烦的,有好几次同事没有先Updat,Commit了,发生了一些错误,Git可能这种情况
3 本地git基本使用命令
1. 创建git版本库
1、版本库又名仓库,英文名repository,你可以简单理解成一个目录,
2、这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都
可以追踪历史,或者在将来某个时刻可以“还原”。
3、所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目
4、瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository)
5、细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要
手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。
mkdir s15_gitpro #先创建一个项目 cd s15_gitpro/ #切换到这个项目目录 git init #初始化这个
2. 工作区、暂存区、代码仓库
1、工作区: 就是你在电脑上看到的目录,比如目录下testgit里的文件(.git隐藏目录版本库除外)。
2、暂存区 : 暂存区就是文件夹 .git中的一个小部分(.git文件夹就是版本库)
3、版本库:工作区有一个隐藏目录.git,这个不属于工作区,这是版本库, 版本库中还有Git为我们
自动创建了第一个分支master,以及指向master的一个指针HEAD
4、 把文件添加到版本库分为以下三步:
1)vim Readme #工作区(Working Zone) 比如在mkdir s15_gitpro下执行创建文件命令
2)git add #暂存区(Stage zone)
3)git commit #代码仓库(Repository master) 只有提交到代码库才能被git管理
3、本地git基本命令
1、将文件添加到仓库
git add Readme #指定将Readme文件添加到暂存区
git add . #将当前目录中的所有文件全部添加到暂存区
git status #查看更改了哪些,创建了哪些,哪些没有添加到仓库,哪些添加到了仓库
git status diff readme #查看readme文件具体修改了哪些
git commit -m “commit tag” # git commit告诉Git,把文件提交到仓库-m后面输入的是本次提交的说明(版本名字)
说明:
# 执行git commit 命令时必须配置用户信息
git config –global user.name “Tom Git”
git config –global user.email tom@example.com
2、回滚
git log #查看所有提交到仓库的版本记录: git log -2
git reflog #查看所有操作记录(状态的md5值和改变的值)
git reset –hard d9e0ed0 #回到指定版本(d9e0ed0是创建版本的MD5值得前6位或者7位)
git reset –hard HEAD^ #回到上一个版本
注:这样可以回到第一次提交到仓库的状态,但再使用git log看不到其他几次的md5值了
3、撤销修改
vim Readme #我们在Readme文件中写了一些错误的代码
git add . #然后又一不小心将文件从工作区提交到了 stage区
git reset HEAD Readme #将Readme中刚提交到 stage区 的代码撤回到工作区
git status #查看目前工作区状态
git checkout — Readme #将Readme在工作区错误的代码丢弃
4、删除操作(两种方法)
方法1:这种方法需要执行git add .
rm Readme
git add .
git commit -m “delete file by git rm”
git reset –hard HEAD^
方法2:这种方法可以省去执行git add .
git rm Readme
git commit -m “delete file by git rm”
git reset –hard HEAD^
注: 在没有git commit前,使用 git checkout — Readme 可以恢复删除的文件(Readme)
5、强制使用master覆盖本地代码
$ git fetch –all
$ git reset –hard origin/master
$ git pull
4 使用git操作GitHub
1、登录https://github.com 创建一个github项
2、选择创建一个新项目,还是将本地的项目推到github这个项目里
3、将本地已有的项目上传到GitHub中
1)这里我们选择使用HTTPS的方法,讲本地已有项目提交到GitHub中
2)在本地Git对应的项目下执行这条命令,配置,将以后的内容提交到这个路径下即:GitHub对应的项目中
git remote add origin https://github.com/Tom7481079/s15_proj.git #设置代码提交url路径
git remote rm origin # 删除设置的代码提交url路径
3)将本地的项目推到GitHub中(需要输入GitHub网站的用户名和密码)
git push -u origin master # 将本地代码push到GitHub中
4)然后刷新页面即可在网页中看到我们本地的项目上传成功了
4、GitHub中文件与本地项目不一致时上传到GitHub报错解决方法
方法一:使用强制push的方法,这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。
git push -u origin master -f
方法二:push前先将远程repository修改pull下来
git pull origin master # 先将GitHub中的文件下载到本地
git push -u origin master # 然后在push到GitHub中
注:执行git pull是如果只有GitHub中修改,会自动合并,如果本地也有修改必须手动合并才能正常git push
方法三:若不想merge远程和本地修改,可以先创建新的分支:
git branch [name] # 新建一个分支
git push -u origin [name] # 提交到分支中
5 配置win10当前用户对GitHub所有项目有权限(git push不必输入密码)
1、使用命令生成公钥和私钥(在git命令行中执行)
ssh-keygen.exe #生成一对公钥和私钥
C:\Users\tom\.ssh #这里是生成的秘钥地址
2、将公钥上传到GitHub中
1. 第一步
2. 第二步
3. 第三步
4. 第四步
3. 更改本地push方式为ssh
1. 配置完公钥后还需要将GitHub项目的push方式改成ssh
2. 更改本地push方式为ssh
1) vim .git/config
2) 将已有的https的路径替换成ssh模式,即上面复制的地址
#url = https://github.com/Tom7481079/s15_proj.git
url = git@github.com:Tom7481079/s15_proj.git
3、此时再执行品push命令时就不会再让输入用户名和密码了
git push origin master
6 配置Linux当前用户对GitHub指定项目有权限(git push不必输入密码)
1、在centos系统中创建密钥对
ssh-keygen #给当前用户创建公钥私钥
vim ~/.ssh/id_rsa.pub #将当前用户公钥放到GitHub对应项目中
2、将生成的公钥放到GitHub指定项目中
1、打开指定项目的settings配置
2、选中这个
3、点击: “Add deploy key” 并粘贴密钥
7 git分支管理(创建&合并分支)
1、分支管理的作用
1、假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码
还没写完,不完整的代码库会导致别人不能干活了
2、如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。
3、现在有了分支,你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作
4、而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,
又不影响别人工作
5、 其他版本控制系统如SVN等都有分支管理,但是用过之后你会发现,这些版本控制系统创建和切换分支比蜗
牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用
6、 但Git的分支是与众不同的,无论创建、切换和删除分支,Git在1秒钟之内就能完成!无论你的版本库是1
个文件还是1万个文件
2、分支管理—–创建分支
git branch #查看现有分支
git checkout -b dev #创建并切换到分支dev, -b参数指切换dev分支
git checkout master #从dev分支切换到master
git branch -D bug-101 #删除本地分支bug-101
此时对项目进行修改
git add . #提交到舞台区
git commit -m “update readme” #提交到仓库
git push origin dev #将跟新内容提交到分支dev中而不是master中
3、如何将分支dev中的代码合并到主分支master中
git checkout master #从dev分支切换到master
git pull #将master上的项目下载到本地
git merge dev #在master上执行这条命令,试图合并master和dev(报错,master更新了)
vim Readme #将不一致的地方手动合并
git add .
git push origin master #手动合并后就可以将dev分支上修改的东西上传到GitHub的master中了
git log –graph #查看从什么地方出现的分支
4、分支取名规范
1、方法1: 使用人名作为分支名(传统开发每个人负责一个功能模块)
2、方法2: 根据功能模块设置分支名(如: feature-100 hotfix-99)
5、全局dev分支(相当于上生产环境前的测试分支)
1、master是不能再上面开发的(master必须是一个稳定版本)
2、所以会有一个全局dev分支,这样就有三种,master,dev,和每个人自己的分支
3、只有在全局dev中没问题后才会真正pull到master中