版本管理——git
Posted wyy1234
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了版本管理——git相关的知识,希望对你有一定的参考价值。
一、git简介
git是一个 分布式版本控制系统 ,学习git之前首先要了解什么是分布式版本控制系统。
集中式版本控制:版本库集中存放在中央服务器,我们工作的时候先从中央服务器获取最新版本,干完活后把自己的活推送给中央服务器。缺点是必须联网。
分布式版本控制:不需要中央服务器,每个人的电脑都有一个完整的版本库。虽然不需要中央服务器,但分布式版本控制通常也会有一个(如github),这个服务器的作用仅仅是方便“交换大家的修改”,没有它也无所谓。
二、windows下安装git
在Git官网下载windows版本下的git,按照默认选项按照即可,因为git是分布式版本控制系统,所以每台机器都要自报家门,安装完成进行如下配置:
git config --global user.name "YourName" git config --global user.email "YourEmail"
三、创建版本库
版本库又叫仓库(repository),可以简单理解成一个目录,这个目录的所有文件都可以被Git管理起来,每个文件的修改、删除,git都能追踪,以便以后可以追踪历史或者在将来的某个时刻可以还原。
进入创建仓库的目录执行 git init 就可以创建一个版本库,在这个目录下生成一个.git文件夹,用于追踪版本库。
git init
四、时空穿梭机
把文件放到版本库只需要两步 add 告诉git把readme.txt添加版本库, commit 把readme.txt提交到仓库:
git diff "readme.txt" //查看工作区和版本库中文件的不同 git add "readme.txt" //把文件修改添加到暂存区 git commit -m "write a readme.txt" //把暂存区的所有内容提交到当前分支 git status //查看文件状态
4.1 版本穿梭
如果我们想回退到历史版本可以使用 git reset 命令,head指针指向当前的版本,
git reset --hard head //回到版本初始状态,清除暂存区
git reset --hard head^ //上一版本 git reset --hard head^^ //上上个版本 git reset --hard commit_id //回到指定版本 通过git reset --hard commit_id 回到指定版本后:
使用git log不能查到未来的版本
可以通过git reflog查看未来的版本
4.2 管理修改
在 git中跟踪并管理的是修改 ,添加/删除一行,新建一个文件都属于修改。git add将修改保存到暂存区,git commit则将暂存区的修改一次性提交到仓库中去
4.2.1 撤销修改
有时候我们改乱了工作区的某个文件,还没有添加到暂存区时,撤销修改(丢弃工作区的修改)使用命令(checkout本质是用版本库中的文件替换当前工作目录中的文件)
git checkout -- filename
//把工作区的修改丢弃掉,返回的上一次的add/commit的状态
有时候我们把错误的修改添加到了暂存区,想要清除暂存区的内容,使用reset命令
git reset --hard head //清除暂存区和工作区的修改,恢复到commit版本的初始状态
4.2.2 删除文件
git rm filename //删除文件 git commit -m "the file has deleted" //提交文件,新版本中文件被删除了
五、远程仓库
5.1 远程库
git是一个分布式的版本控制系统,最早只有一台电脑有一个原始版本库,其他电脑可以克隆这个原始版本库, 每台电脑的版本库都是一样的,并没有主次之分 。
5.2 使用github提供的仓库托管服务
第一步:创建SSH KEY。查看用户文件夹下有没有.ssh目录,有的话就跳过这一步,没有新建秘钥:
git-keygen -t rsa -C "youemail"
不添加密码时一路回车即可,在用户目录下有两个文件:id_rsa(私钥),id_rsa.pub(公钥)
第二步:登陆gitHub,Setting-->SSH and GPG keys-->添加SSH,Title自定义,Key为id_rsa.pub。如果有多台电脑可以设置多个key,这样就可以在不同的电脑上工作了。
第三步:gitHub上新建一个远程仓库,并关联
//[email protected]为远程仓库的地址 //origin为远程仓库的名字,可以自定义 git remote add origin [email protected] //把本地仓库的当前分支内容推送到远程仓库的master //-u把本地master分支和远程master分支关联 git push -u origin master
前边使用的是先建本地仓库,后与远程仓库关联。我们当然也可以先在github上建一个仓库,通过git clone yourrespPath生成本地仓库。
六、分支管理
分支:如果我们要开发一个新功能,需要两周完成,第一周完成了50%,如果提交的话,由于代码没完成导致别人不能工作,但是不提交又担心丢失。怎么办呢?创建一个自己的分支,在自己的分支上干活不影响别人,等活干完了在提交。(自己的分支和别人的分支,主分支相当于处于平行宇宙,互不干扰)
6.1 分支使用方式:
//-----------no.1 创建和切换分支 git branch bname //创建分支 git branch //查看分支 git checkout bname //切换分支 //-----------no.2 在分支上工作 //在当前分支上,git add ,git commit..... //任务完成了.......... //-----------no.3 工作完成后合并分支,并删除 git checkout master //回到主分支 ① git merge bname//fast forward形式合并分支,直接把master指向最新的分支,删除分支后丢失分支的信息 //******出现冲突时,手动修改冲突的文件后重新add,commit ② git merge --no-ff "merge with no-ff" bname //no-ff形式合并分支,这种形式会创建一个新的commit git branch -d bname //删除分支 //-----------no.4 本地仓库同步到远程仓库 git push origin //同步到远程仓库
6.2 Bug分支
在开发中Bug如家常便饭,当我们在dev分支上工作时,master(或者其他分支)出现了bug需要马上解决,但是dev分支的工作没有完成不能提交怎么办呢?
//no.1 在dev分支保存工作现场 git stash//这是git status 查看工作区是干净的 //no.2 通过一个临时分支解决bug git checkout master //假如bug要在master分支上解决 git branch issuse-001 git checkout issuse-001 // add commit..... // bug is fixed git checkout master git merge --no-ff -m "merge to fix bug" issuse-001//合并分支,解决bug git branch -d issuse-001
//no.3 回到工作分支继续干活 git checkout dev //回到工作分支 git status pop //恢复工作现场 //add commit....
6.3 Feature分支
添加一个新功能是,不希望一些实验性的代码把主分支搞乱了,所以每添加一个新功能都在新的feature分支上开发,完成后合并删除feature分支。
//我们在dev分支上开发,接到通知要求加一个新功能 //no 1 新建一个feature-newFunc分支 git check -b feature-newFunc //add commit... //newFunc has done //no 2.1 情况1:通知不要新功能了 git checkout dev git branch -D feature-newFunc//-d不能删除,提示没有合并,会丢失数据 //no 2.2 情况2:新功能并入dev git checkout dev git merge --no-ff -m "add a newfunc" feature//添加新功能 git branch -d feature //删除新功能分支
6.4 多人协作
当从远程仓库克隆时,实际是Git自动把本地的master分支和远程的master分支对应起来。远程仓库的名字默认是origin,克隆的仓库默认只有master分支
git remote //查看远程仓库 git remote -v //查看远程仓库的详细信息,可显示地址
4.1 推送分支(push)
//把该分支上的所有提交推送到远程的对应分支 git push origin branch-name //-----不是所有的分支都要推送的 //1.master分支是主分支,必须时刻与远程同步 //2、dev分支是开发分支,所有成员都在上边工作,所以也要同步 //3、bug分支只用于本地修复bug,没必要推送到远程 //4、feature分支是否推送,取决于这个功能是否是合作完成的
4.2 抓取分支(pull 解决协作冲突)
多人合作时,大家都会往master和dev分支推送自己的修改。当你clone完仓库,建立一个dev分支,对一个文件进行了修改,你想把一个修改同步到远程的dev分支上去,但是有一个小伙伴修改了同一个文件并且已经提交到了远程仓库。这时就会出现冲突,不能完成推送了,怎么解决呢?
git clone [email protected] //克隆一个仓库,默认只有master分支 git checkout -b dev //新建一个dev分支 git branch --set-upstream-to=origin/dev dev//本地的dev和远程的dev关联 git pull dev//获取远程仓库dev分支 //add commit... 我修改了一个文件 //有一个小伙伴也修改了这个文件并同步到远程仓库了 git push origin dev //推动到远程dev分支,报错,因为有冲突 git pull dev//获取最新的远程分支dev,这时修改的文件会出现冲突 //手动修改冲突 (不能把别人的改错了!!!)修改完成 git push origin dev//推送成功,现在远程分支的dev和我的dev分支同步了
七、标签管理
发布一个版本时通常在版本库中打一个标签(tag),这样就确定了打标签时刻的版本,将来无论什么时候,都能很方便地取出打便签的版本。 tag的本质是一个commit的指针 。
git tag v1.0 //建一个v1.0的标签指向当前commit git tag -a v1.0 -m "测试版本" 1094adb //-a指定标签名,-m指定描述 git tag //查看所有的标签 git show v1.0 //查看标签v1.0的信息
八、忽略特殊文件
忽略特殊文件的原则:
1、忽略操作系统自动生成的文件,如缩略图
2、忽略编译生成的中间文件、可执行文件
3、忽略带有敏感信息的文件
如下是一个.gitignore文件示例,忽略了缩略图、css文件和dist文件夹中的文件,注意:.gitignore文件本身要放在版本库中。
Thumbs.db *.css dist //文件夹
如果我们忽略了*.css文件,但是想让一个特殊的a.css被追踪,则可以强制添加到Git
git add -f a.css //-f强制添加
参考文章:
[2] http://my.oschina.net/gal/blog/141442
以上是关于版本管理——git的主要内容,如果未能解决你的问题,请参考以下文章
GitGit 分支管理 ( 克隆远程分支 | 克隆 master 分支 git clone | 查看远程分支 git branch -a | 克隆远程分支 git checkout -b )(代码片段