git开发流程

git开发流程,第1张

分支有两种:master分支和develop分支

master分支只负责管理发布的状态。在提交时使用标签记录发布版本号。

develop分支是针对发布的日常开发分支。有合并分支的功用。

这个分支是针对新功能的开发,在bug修正的时候从develop分支分叉出来的。基本上不需要共享特性分支的 *** 作,所以不需要远端控制。完成开发后,把分支合并回develop分支后发布。

通常会在分支名称的最前面加上release-。release前需要在这个分支上进行最后的调整,而且为了下一版release开发,用develop分支的上游分支。

一般的开发是在develop分支上进行的,到了可以发布的状态时再创建release分支,为release做最后的bug修正。

到了可以release的状态时,把release分支合并到master分支,并且在合并提交里添加release版本号的标签。

要导入在release分支所作的修改,也要合并回develop分支。

hotFix分支是在发布的产品需要紧急修正时,从master分支创建的分支。通常会在分支名称的最前面加上 hotfix-。

例如,在develop分支上的开发还不完整时,需要紧急修改。这个时候在develop分支创建可以发布的版本要花许多的时间,所以最好选择从master分支直接创建分支进行修改,然后合并分支。

修改时创建的hotFix分支要合并回develop分支。

https://backlog.com/git-tutorial/cn/stepup/stepup1_5.html

用 Visual Studio 可以配合 Git 工具做版本管理。也可以直接将工程同步到 GitHub 上。配置过程非常简单。

首先你要安装 GIt,安装和配置步骤见 安装 Git,Windows 上只要替换其中的安装步骤,其他类似。

在 Visual Studio 安装插件 Git Source Control Provider

然后在 tools->options->source control 中配置源代码管理,将默认的修改为 Git Source Control Provider

配置好后会d出选择 Git 的 bin 目录,将安装目录填上即可,以后也可以在选项中再次填上

因为用户名,还有 GItHub 的 ssh key 已经在 安装 Git 中完成了,这里不需要再做一边。

我们新建一个工程,然后可以在解决方案的右键菜单中看到多出来的一项。这里如果你选择 TortoiseGit 的话,d出的菜单是不一样的,会比较丰富。我安装的是最简单的。

选择 Pending Changes 就可以 commit changes 了,这里要勾选改变的源文件,相当于 git add ....

如果要 push 到 GitHub 的远程仓库 ,我还没找到选项,还是只能用 Git Bash 命令行。不过,push 不是经常做的,所以影响不大。如果嫌烦的话,可以装 TortoiseGit,在 Visual Studio 中就能有相应的选项,完全不要命令行啦。

1. VS2015在对Git的支持

VS2015是微软IDE集成开发环境的重量级升级,微软除了将触角延伸至iOS和Android平台以及Unity,Unreal和Cocos等游戏开发领域中。而且在进一步集成Git。

可以说在不需要第三方插件的前提下,就可以使用Git来进行团队开发。

2. 在VS2015中使用Git

下面介绍如何在VS2015中使用Git进行团队开发。

2.1 在Git服务器上新建版本库

在使用VS2015进行团队开发前,我们先在Git服务器上创建新的版本库。

打开我们已经安装好的GitStack(如查直接看本篇的同学,可以先看一下服务端环境搭建一文URL:使用GitStack+TortoiseGit 图形界面搭建Git环境)

在GitStack中创建新的版本库,名为“MyGitForVsObject”,并新建两个用户"yubinfeng"和“zhangsan”,再新建一个组"MyGitGroup",将这两个用户加入到该组,并给版本库授权该组。具体 *** 作这里不再赘述,不了解的朋友请看上面的URL.

完成后如下所示:

2.2 在VS2015中克隆远程版本库

我们先在VS2015中新建一个解决方案,在工具栏,点“团队”=》“管理连接”

按上图所示,右打开的 团队资源管理器中,输入远程Git URL,点击克隆按钮,即可完成在VS2015中克隆远程版本库了

克隆成功后,可以在 本地Git存储库 中看到 本地版本库已经 从服务器上克隆下来了。

2.3 Git全局设置

完成版本库克隆后,我们需要在Git中进行一次全局设置。

工具栏 - 团队 - 管理连接,打开团队资源管理器

点击主页按钮,如下图

点击设置,选择全局设置,完成如下三项更改,点更新

用户名:将作为你以后版本提交后日志显示的名称

电子邮件:团队联系使用

默认存储库位置:最好进行一下改动,默认在C盘,防止丢失

2.4 Git存储库设置

存储库设置和全局设置类同,如下

工具栏 - 团队 - 管理连接,打开团队资源管理器

点击主页按钮,选择 设置 - 存储库设置

如上图,其他内容不需要设置,主要 添加一下远程 。这将是以后获取新版本和推送到服务器的地址

此时,我们可以看到项目文件前面有一个小锁,并且代码中已经有了Git的信息,表示项目已经已经受到Git控制

2.5 第一次向Git服务器发布项目

我们上面看到的所有Git的受控信息,只是相对于克隆到本地的版本库,此时Git服务器并没有接收到这些工程文件,下面我们要做的将是第一次将本地版本库中的工程文件同步到Git服务器,即项目发布

工具栏 - 团队 - 管理连接,打开团队资源管理器

点击小房子,回到Git主页,点击同步

此时,出现如下界面

+

我们第一次将本地分支发布到远程服务器,点击发布

输入远程URL,发布,即可发布到远程库

我们可以打开GitStack查看日志,如下:

上面显示的时间,为你在本地 *** 作的时间。我们可以看到Git作为分布式版本控制系统,你在离线进行 *** 作,在推送时,显示的均为你 *** 作时间,而非推送时间。

2.6 拉取、获取、合并、提交、推送、同步

项目开发过程中,我们通常进行下面几种 *** 作,我一次性介绍,这个和上篇TortoiseGit类似,直接看本篇的同学,可以参考上篇,URL:图形化Git客户端工具TortoiseGit

拉取(Pull):将远程版本库合并到本地版本库相当于(Fetch+Meger)

获取(Fetch):从远程版本库获得最新版本

合并(Meger):将两个版本库进行合并 *** 作

提交(Commit):将所做的更改,存入本地暂存库

推送(Push):将所做的更改,存入远程版本库

同步(Pull+Push):先将远程库拉取,再将本地库推送到远程库 注意这个顺序相当于(Pull+Push)

我们对文件进行修改后,文件前有一个小对号,右击,点提交

我们在提交文件时,记得填写备注,在团队开发中,保持一个良好的习惯

提交在这里有三种:

提交:即将文件存入本地版本库

提交和推送:即将文件更改同时存入本地版本库和远程版本库

提交和同步:将文件更改提交到本地库的,再从远程版本库拉取新版本到本地,再推本地库到远程版本库

注意:

这里的 *** 作,不针对当前文件,而是对所有变更进行提交、推送或同步。

2.7 创建分支

对于创建分支在上篇(URL:图形化Git客户端工具TortoiseGit)中已经介绍过了,这里主要介绍一下如何基于Vs2015创建Git分支

工具栏 - 团队 - 管理连接,打开团队资源管理器

点击小房子,回到Git主页,点击分支

打开分支界面,在master分支上右击,选择 "从选定项创建本地分支"

在这里需要注意我们创建分支,有两种:

(1)创建本地分支

(2)创建远程会支

本地分支有创建前,一定要获取最新版本远程分支,则要求所有成员最好能推送更改。

至于分支的创建是基于远程还是本地,最好能在团队成员之间达成一致。

下面介绍两种分支的创建方法

先看创建本地分支

输入一个分支名称,创建即可。

远程分支,我们需要选择如下

在创建远程分支时,一定要把跟踪远程分支,这个取消选择,否则将创建了一个跟踪分支,我们就不能发布了。

创建完成后,如下:

分支创建成功,接下就是发布到服务器

右击,点发布分支,即可。

可以看到,分支已经发布到服务器上了。

在服务器上通过GitStack也可以看到,多了一个分支。

2.8 切换和合并分支

在VS2015中切换分支非常简单,只要在分支名称上双击,就可以了,项目资源管理器中的文件随之变化。

这里主要看一下合并,

我们先切换到新建的分支"2016-2-7",在分支名称右击,选择 合并自...

选择master ,点击合并,即可完成将master合并到新分支了。

2.9 删除分支

删除分支,首先要从远端删除,如下:

注意,如果要删除刚才新建的分支,和上篇TortoiseGit一样,要切换到另一分支 *** 作。

远端删除后,服务器上的分支就被删除了,本地的分支,直接删除即可。

3. 使用VS2015+HubGit创建开源项目

前面我们介绍了Git作为一个分布式版本控制系统,其最大的优势就是适合开源项目管理。如果你还没有托管一个开源项目,那么你Out了。

目前即于Git开源项目托管平台非常多,Hubgit.com可以说非常知名,只是免费用户,只能托管开源项目。

本篇我介绍一下如何在VS2015中创建并开发自己的开源项目,以Hubgit为例,其他平台使用都差不多。

3.1 创建Github用户

创建完成后,点右上角Sign in进入Github

3.2 在Github上创建版本库

进入GitHub主页,点右上的 + 创建一个版本库

打开以后,如下

按图示完成,就可以了。

点右上角按钮,”your profile“查看你创建的版本库 test,点击进入

接下来的 *** 作,我们已经很熟悉了,就是在VS2015中打开GitHub版本库,进入开源项目的世界了。。。

3.3 在VS2015上发布自己的开源项目

这一步相信,大家一定非常熟悉了,对,就和上面介绍的克隆自己服务器上的版本库一样。

然后,我们新建一个解决方案或打开一个已有的解决方案

创建完成后,

工具栏 - 团队 - 管理连接,打开团队资源管理器

点击小房子,回到Git主页,点击 更改

点击 提交和推送,这时提示一个身份验证,这是必须的,使用 前面注册的用户名和密码即可,当然这是开源项目,只要有Github用户,都可以进行版本克隆和提交代码

推送完成后,我们可以在github上查看

没问题,刚才推送的解决方案已经更新到github服务器了。

提交、获取、推送、分支,这些我就不用再说了吧,和上面介绍的完全一样了

3.4 如何加入别人的开源项目?

如何加入别人的开源项目?也就是别人如何参与你的开源项目,意思是一样的,就是除原创建者之外的人,要如何克隆版本库?

比如比较著名的开源项目Jquery,你如何开发他的项目呢?

你又不能直接在VS 2015中克隆人家的库,其实这个并不难办,看下面的图:

先进入Jquery的项目URL,然后点 右上的 Fork ,就将这个项目加入到你的库里了,相当于直接克隆了一个副本到你的GitHub上。

这下,你就可以用自己的帐号,在VS上克隆你的GitHub中的Jquery项目了,你可以加入自己的idear,如果你希望jquery的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。当然,官方是否接受你的pull request就不一定了。

最后,我忘记说一件事了,我们刚才建的版本库test,别人也可以用同样的方法进行参与,只是你一定要记得,将初始库设为只读。

3.5 如何删除创建的版本库

先进入你的版本库,点右边的setting,进入设置页,拉到最底下

点击 删除该版本库,再输一次版本库名称,即可。

3.6 桌面版的GitHub

如果你在网站上看项目进度等信息,感觉不方便 ,你可以下载安装桌面版的Github

有windows和mac版本,可以通过桌面版完成网站上的所有功能。

使用GitHub进行团队协作的流程,可以参考这个视频,感觉非常好,推荐一下,

(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1)return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"")b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.lengthif(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d)return a}if(d!==w){f=!j&&f&&c.isFunction(d)for(o=0o<io++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j)return a}return i?

e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=areturn c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,ri=c.data(this,"events")if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=thisvar u=i.live.slice(0)for(k=0k<u.lengthk++){i=u[k]i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget)n=0for(r=

j.lengthn<rn++)for(k=0k<u.lengthk++){i=u[k]if(j[n].selector===i.selector){o=j[n].elemf=nullif(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0]if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0for(r=d.lengthn<rn++){j=d[n]a.currentTarget=j.elema.data=j.handleObj.dataa.handleObj=j.handleObjif(j.handleObj.origHandler.apply(j.elem,e)===false){b=falsebreak}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g,

"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f)if(f=f&&f.events){delete e.handlee.events={}for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,jb=b&&b[0]?b[0].ownerDocument||b[0]:sif(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e=

trueif(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment()c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1return{fragment:f,cacheable:e}}function K(a,b){var d={}c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a})return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,

Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOfc.fn=c.prototype={init:function(a,b){var d,fif(!a)return thisif(a.nodeType){this.context=this[0]=athis.length=1return this}if(a==="body"&&!b){this.context=sthis[0]=s.bodythis.selector="body"this.length=1return this}if(typeof a==="string")if((d=Ta.exec(a))&&

(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:sif(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])]c.fn.attr.call(a,b,true)}else a=[f.createElementwww.huashijixun.com?else{a=sa([d[1]],[f])a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a)this.length=1this[0]=b}this.context=sthis.selector=areturn this}else if(!b&&/^\w+$/.test(a)){this.selector=athis.context=sa=s.getElementsByTagName(a)return c.merge(this,

4. 本节要点:

本篇主要介绍了如何在Visual Studio 2015中使用Git,然后介绍了目前流行的一些开源托管平台,最后以GitHub为例,介绍了如何创建自己的开源项目和参与别人的开源项目。

如果你还没有自己的开源项目,快点动手申请一个Github帐号,共享出你的项目吧~开源需要每个人的努力~

git是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL发布。最初目的是为更好地管理Linux内核开发而设计。林纳斯·托瓦兹在编写第一个版本时就使用了“git”这个名称, 他将工具描述为“愚蠢的内容跟踪器”。

[图片上传失败...(image-c23291-1619063471664)]

四个专有名词:

Workspace:工作区

Index / Stage:暂存区

Repository:仓库区(或本地仓库)

Remote:远程仓库

打开本地生成的.git隐藏文件

创建新项目gittest

创建新文件test.txt

git add <file>

git status显示有变更的文件

git restore <file> 撤回文件修改内容

git commit –m “注释”

修改内容->执行git diff工作区和本地仓库的差异

git log显示当前分支的版本历史

git reset --hard HEAD^ 当前版本回退到上一个版本

git reset --hard HEAD^ ^ 当前版本回退到上上一个版本

git reset --hard HEAD~100 回退到前100个版本

恢复已经删除的版本

git reflog 展示所有的提交记录

git reset --hard <版本号>回退到指定版本

git push origin master 将本地master分支推送到远程master分支,相当于创建远程分支

git checkout -b dev = git branch dev + git checkout dev 创建并切换分支

git branch 不带参数,会列出所有本地的分支;带参数表示创建分支

git branch –d name 删除本地分支(-D表示强制删除)

git branch –r 不带参数,会列出所有远程的分支

git branch --set-upstream-to=origin/<branch本地>本地和远程分支关联

git push origin –delete <branch>删除远程分支

git merge release用于合并指定分支到当前分支上

注:Fast-forward表示的合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。在这种模式下,删除分支后,会丢掉分支日志信息。可以使用带参数 --no-ff来禁用”Fast forward”模式。

git merge --no-ff -m “注释”dev

git checkout release 切换release分支

vim test.txt 修改某条内容

git commit test.txt -m “release修改某条内容”

git checkout master 切换master分支

vim test.txt 修改某条同release内容

git commit test.txt -m “master修改某条内容”

git merge release 显示冲突

git status 显示冲突提示

Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,其中>>>>release 是指release上修改的内容

vim test.txt 修改内容

git add test.txt

git commit -a -m “fix conflict”

当前分支有没有提交但也不合适现在就提交的内容,Git提供了暂储功能stash

git checkout release

vim test.txt 修改test.txt内容

git checkout develop 此时会提示Aborting

git status 查看当前状态

Git stash list 查看所有暂储列表

git stash apply恢复,恢复后stash内容并不删除,你需要使用命令git stash drop来删除;

另一种方式是使用git stash pop,恢复的同时把stash内容也删除了

创建Git Tag并推送远程服务器

git tag -a V1.0.0 –m“注释”//创建TAG

git push origin V1.0.0 //推送到远程服务器

git push origin --tag //提交所有tag至服务器

git tag -d V1.0.0 //删除本地标签

git push origin --delete tag <tagname> //删除远程标签

HEAD,它始终指向当前所处分支的最新的提交点。你所处的分支变化了,或者产生了新的提交点,HEAD就会跟着改变

add相关命令很简单,主要实现将工作区修改的内容提交到暂存区,交由git管理。

git add .添加当前目录的所有文件到暂存区

git add 添加指定目录到暂存区,包括子目录

git add 添加指定文件到暂存区

commit相关命令也很简单,主要实现将暂存区的内容提交到本地仓库,并使得当前分支的HEAD向后移动一个提交点。

git commit -m 提交暂存区到本地仓库,message代表说明信息

git commit --amend -m 使用一次新的commit,替代上一次提交

上传本地仓库分支到远程仓库分支,实现同步。

git push 上传本地指定分支到远程仓库

git push --force强行推送当前分支到远程仓库,即使有冲突

git push --all推送所有分支到远程仓库

关于分支,大概有展示分支,切换分支,创建分支,删除分支这四种 *** 作。

git branch列出所有本地分支

git branch -r列出所有远程分支

git branch -a列出所有本地分支和远程分支

git branch 新建一个分支,但依然停留在当前分支

git checkout -b 新建一个分支,并切换到该分支

git checkout 切换到指定分支,并更新工作区

git branch -d 删除分支

git push origin --delete 删除远程分支

关于分支的 *** 作虽然比较多,但都比较简单好记

merge命令把不同的分支合并起来。在实际开放中,我们可能从master分支中切出一个分支,然后进行开发完成需求,中间经过R3,R4,R5的commit记录,最后开发完成需要合入master中,这便用到了merge。

git merge 合并指定分支到当前分支

注:如果在merge之后,出现conflict,主要是因为两个用户修改了同一文件的同一块区域。需要针对冲突情况,手动解除冲突。

rebase又称为衍合,是合并的另外一种选择。

在开始阶段,我们处于new分支上,执行git rebase dev,那么new分支上新的commit都在dev分支上重演一遍,最后checkout切换回到new分支。这一点与merge是一样的,合并前后所处的分支并没有改变。

git rebase dev,通俗的解释就是new分支想站在dev的肩膀上继续下去。

rebase *** 作不会生成新的节点,是将两个分支融合成一个线性的提交。

rebase也需要手动解决冲突。

1.如果你想要一个干净的,没有merge commit的线性历史树,那么你应该选择git rebase

2.如果你想保留完整的历史记录,并且想要避免重写commit history的风险,你应该选择使用git merge

reset命令把当前分支指向另一个位置,并且相应的变动工作区和暂存区。

git reset —soft 只改变提交点,暂存区和工作目录的内容都不改变

git reset —mixed 改变提交点,同时改变暂存区的内容

git reset —hard 暂存区、工作区的内容都会被修改到与提交点完全一致的状态

git revert用一个新提交来消除一个历史提交所做的任何修改。

在回滚这一 *** 作上看,效果差不多。git revert是用一次新的commit来回滚之前的commit,git reset是直接删除指定的commit。

在 Git工作区的根目录创建一个特殊的.gitignore文件。

在.gitignore文件中,添加需要忽略的文件。

git rm -r --cached .//将仓库中的index递归删除

git add . //重新添加仓库索引

git commit -m “update git.ignore” //提交

git branch --set-upstream-to=origin/<branch><branch>//重现将本地仓库和远程仓库关联

最后,如果此篇博文对你有所帮助,别忘了点个赞哟~


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11691489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存