项目版本管理Git使用详细教程

kenx
• 阅读 1018

前言

记得刚开始做项目开发的时候都是一个人完成一个项目,单打独斗的开发,也不知道什么是团队开发,没有这个概念,随着工作后来知道公司里项目都是团队开发,这个时候这么多人怎么开发一个项目呢,难道用u盘拷贝嘛,后来知道有这个一个项目版本管理工具前期SVN比较流行后面,开始使用Git 这样团队·在做项目开发基于git 版本管理就会很轻松

快速上手

初始化本地仓库

项目中使用git需要把项目初始化为git仓库这里要自行安装git 通过git --version查看git版本是否安装成功

  1. 初始化项目git仓库 找到项目根路径 通过命令git init初始化本地仓库

  2. 把项目代码添加到仓库 通过 git add .来添加点代表所有文件。添加本地仓库成功后,java文件会变成绿色

  3. 提交文件到本地仓库通过git commit -m "First commit" m后面表示提交的注释信息

关联远程仓库

这里我们以GitHub作为项目远程仓库例子到远程仓库的页面上,复制仓库地址

这里可以使用https或者ssh两种远程连接方式,htts比较方便直接连接使用,ssh需要配置对呀key和toke,但是比http更加的安全,这里我为了方便就使用https,一般在公司项目都会使用ssh的

  1. 关联远程仓库地址到本地仓库
git remote add origin {远程仓库地址}
# Sets the new remote
  1. push到远程仓库

把本地项目代码push同步到远程仓库通过git push -u origin master命令来实现,master代表远程主分支。

忽略文件

在项目中有一些代码,是不需要提交的每次更新,比如,class字节文件,也就是targer文件,还有开发工具的生成的一些文件,jar文件,属性文件,等等,这个时候我们就可以通过编写.gitignore 把不需要的提交的文件目录添加到.gitignore文件中就可以啦

  1. 忽略规则

通过在项目下定义.gitignore文件,在该文件中定义相应的忽略规则,来管理当前文件夹下的文件的Git提交行为

在.gitingore 文件中,遵循相应的语法,在每一行指定一个忽略规则。如:

*.log
*.temp
/vendor
  1. 语法规则

gitignore注释用'#', *表示匹配0个或多个任意字符,所以上面的模式就是要忽略所有的xml文件,log文件和apk文件。

.gitignore配置文件用于配置不需要加入版本管理的文件,配置好该文件可以为版本管理带来很大的便利

#               表示此为注释,将被Git忽略
*.a             表示忽略所有 .a 结尾的文件
!lib.a          表示但lib.a除外
/TODO           表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/          表示忽略 build/目录下的所有文件,过滤整个build文件夹;
doc/*.txt       表示会忽略doc/notes.txt但不包括 doc/server/arch.txt

bin/:           表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin:           表示忽略根目录下的bin文件
/*.c:           表示忽略cat.c,不忽略 build/cat.c
debug/*.obj:    表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo:         表示忽略/foo,a/foo,a/b/foo等
a/**/b:         表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh    表示不忽略bin目录下的run.sh文件
*.log:          表示忽略所有 .log 文件
config.php:     表示忽略当前路径的 config.php 文件

/mtk/           表示过滤整个文件夹
*.zip           表示过滤所有.zip文件
/mtk/do.c       表示过滤某个具体文件

被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:
!*.zip
!/mtk/one.txt

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?
想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::
/mtk/*
!/mtk/one.txt

假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!

----------------------------------------------------------------------------------
还有一些规则如下:
fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;

/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;

/*
!.gitignore
!/fw/ 
/fw/*
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。

注意 这里一般会出现问题.gitignore 文件明明配置了但是没有生效

有两种可能:

  1. .gitignore 文件配置有问题,比如我碰到过一次这个问题:我在 windows 系统下的 idea 中使用了 「Add to gitignore」 这个插件去添加需要被 ignore 的文件夹时候,它会在我的 .gitignore 文件中写入:.idea\ ,实际上应该是:/.idea/

  2. 在你添加新的 ignore 规则前,你曾经已经提交过这个规则对应的文件,这时候你需要先把本地缓存删除(改变成未 track 状态)使用指令:

git rm -r --cached .
git add .
git commit -m 'update .gitignore'

git 常用命令

远程仓库相关命令

  1. 检出仓库:git clone git://github.com/jquery/jquery.git

  2. 查看远程仓库: git remote -v

  3. 添加远程仓库: git remote add [name] [url]

  4. 删除远程仓库:git remote rm [name]

  5. 修改远程仓库:git remote set-url --push [name] [newUrl]

  6. 拉取远程仓库:git pull [remoteName] [localBranchName]

  7. 推送远程仓库:git push [remoteName] [localBranchName]

如果想把本地的某个分支test提交到远程仓库,并作为远程仓库的master分支,或者作为另外一个名叫test的分支,如下:

$git push origin test:master // 提交本地test分支作为远程的master分支

$git push origin test:test // 提交本地test分支作为远程的test分支

分支(branch)操作相关命令

  1. 查看本地分支:git branch

  2. 查看远程分支: git branch -r

  3. 创建本地分支: git branch [name] ----注意新分支创建后不会自动切换为当前分支

  4. 切换分支: git checkout [name]

  5. 创建新分支并立即切换到新分支:git checkout -b [name]

  6. 删除分支:git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项

  7. 合并分支: git merge [name] ----将名称为[name]的分支与当前分支合并

  8. 创建远程分支(本地分支push到远程):git push origin [name]

  9. 删除远程分支:git push origin :heads/[name]$ git push origin :[name]

版本(tag)操作相关命令

  1. 查看版本:git tag

  2. 创建版本:git tag [name]

  3. 删除版本:git tag -d [name]

  4. 查看远程版本:git tag -r

  5. 创建远程版本(本地版本push到远程): git push origin [name]

  6. 删除远程版本:git push origin :refs/tags/[name]

  7. 合并远程仓库的tag到本地:git pull origin --tags

  8. 上传本地tag到远程仓库: git push origin --tags

  9. 创建带注释的tag: git tag -a [name] -m 'yourMessage'

git分支

项目版本管理Git使用详细教程

这里git基本使用 参考 廖雪峰老师 git基本使用教程

主分支

实际开发中,一个仓库(通常只放一个项目)主要存在两条主分支:masterdevelop分支。这个两个分支的生命周期是整个项目周期。就是说,自创建出来就不会删除,会随着项目的不断开发不断的往里面添加代码。master分支是创建git仓库时自动生成的,随即我们就会从master分支创建develop分支,如下图所示。

项目版本管理Git使用详细教程

  1. master:这个分支最为稳定,这个分支代表项目处于可发布的状态。

例如王二狗向master分支合并了代码,那就意味着王二狗完成了此项目的一个待发布的版本,项目经理可以认为,此项目已经准备好发布新版本了。所以master分支不是随随便便就可以签入代码的地方,只有计划发布的版本功能在develop分支上全部完成,而且测试没有问题了才会合并到master上。

  1. develop:作为开发的分支,平行于master分支。

例如王二狗要开发一个注册功能,那么他就会从develop分支上创建一个feature分支 fb-register(后面讲),在fb-register分支上将注册功能完成后,将代码合并到develop分支上。这个fb-register就完成了它的使命,可以删除了。项目经理看王二狗效率很高啊,于是:“二狗你顺带把登录功能也做了吧”。二狗心中暗暗骂道:日了个狗的,但是任务还的正常做,二狗就会重复上面的步骤:从develop分支上新创建一个名为fb-login的分支,喝杯咖啡继续开发,1个小时后登录功能写好了,二狗又会将这个分支的代码合并回develop分支后将其删除

支持分支

这些分支都是为了程序员协同开发,以及应对项目的各种需求而存在的。这些分支都是为了解决某一个具体的问题而设立,当这个问题解决后,代码会合并回主分支develop或者master后删除,一般我们会人为分出三种分支

  1. Feature branches:这种分支和我们程序员日常开发最为密切,称作功能分支 必须从develop分支创建,完成后合并回develop分支
  1. Hotfix branches:这个分支主要为修复线上特别紧急的bug准备的

  2. Release branches:这个分支用来分布新版本。

参考

  1. git常用命令
  2. gitignore配置规则
  3. .gitignore不生效
点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这