介绍集中式和分布式版本控制系统的概念。
官网入门书籍
菜鸟git教程
蛙课网视频地址
版本控制系统(version control system),是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型的文件进行版本控制。用的比较多的如svn(subversion),git等。
版本控制系统理解
git百度百科
Git(读音为/gɪt/。)是一个开源的分布式版本控制系统
,可以有效、高速地处理从很小到非常大的项目版本管理。 [1] Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
svn百度百科
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS迁移到Subversion。说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的。
区别:
Git只关心文件数据的整体是否发生了变化,而多数的其他系统则只关心文件内容的具体差异,它们在每个版本中记录着各个文件的具体差异。在Git中的绝大多数操作都只需要访问本地文件和资源,不需要联网。这是因为Git在本地磁盘上就保留着所有当前项目的历史更新,所以处理起来速度飞快,这是使用空间换时间的处理方式。使用Git,即使在没有网络或VPN的情况下,你同样可以非常愉快的频繁提交更新,等到有了网络的时候再提交到远程的仓库。
版本控制系统的工作模式分为两种: 集中式的工作模式和分布式的工作模式
有一个单一的集中管理的服务器,保存所有文件的修订版本。而协同工作的人们都通过客户端连接到这台服务器,获取最新的文件或者提交更新。
集中式版本控制系统存在以下缺点:
优点
1、管理方便,逻辑明确,符合一般人思维习惯。
2、易于管理,集中式服务器更能保证安全性。
3、代码一致性非常高。
CVS, SVN都是集中式版本控。
在分布式版本控制系统中,客户端不仅仅是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。所以每一次提取的操作,都是对代码仓库的完整备份,因此也就不必担心协同工作用的服务器发生故障。
优点:
git官网
git的诞生
git的工作模式
和集中式版本控制系统一样,Git设置了一个共享库,每一个开发者可以从其中获取更新版本和提交最新版本,每一个开发者都是平等的,(版本信息本地也有)。
若干的开发者从共享仓库克隆代码,更改代码提交给集成经理,然后由集成经理提交到共享仓库,他们具有不同的权限。
项目分成不同的子系统,开发子系统相关的程序源提交对应的代码到上一级,上一级再对子系统进行集成提交到共享仓库
1)初始化一个本地版本库,每个版本库仅需要执行一次。
2)将中央版本库内容克隆到本地版本库,每个客户机仅需要执行一次。
3)添加指定文件到版本控制管理(只是添加到暂存区)
4) 将修改操作提交到本地版本库(将暂存区的内容提交到本地版本库)
5) 将本地版本库中的修改内容“推送”到中央版本库,客户机需要在一阶段性工作完成之后或在某些时间点(下班,周五)将修改过的内容备份到中央版本库,方便他人更新到最新的代码。
6) 将中央版本库中的变化内容“拉取”本地版本库,客户机需要不时的更新才可以获取最新的内容。
以下是对Git部分概念的示意图,工作区和版本库都是在本地
工作区:存放着用户可编辑的文件本身。
暂存区:staging area,存放对文件的快照。
分支区:该区域中可以包含很多分支,而每个分支都可以记录当前工作区中文件的状态快照。
下面是暂存区示意图
staging area 位于本地,在提交之前可以对代码进行格式化和检查。
git基础概念
windows版本的下载地址:https://git-scm.com/download/win
运行下载的windows的exe(可执行程序)(不太会,一路默认,除了配图的
)
验证安装成功
在桌面右下角找到或搜索到git Bash,打开,执行git --version
查看当前版本信息。如下说明安装成功
git Bash 是一种windows下的一种linux命令行工具,git的命令行工具
,可以执行linux命令,将盘符模式的目录模拟成linux的二级目录形式。
但是由于是在windows系统中运行,不区分大小写。默认打开是在当前用户的目录下
mingw百度百科
版本控制文件类型:对于版本控制系统,无论是CVs, SVN, GIT,都只能控制文本文件,对二进行制文件是无法控制。不幸的是,微软的office文件都属于二进行制文件,不能使用版本系统进行控制。字符编码与记事本:建议使用编码UT-8
1.由于我们可能有很多的项目,那么创建一个易于理解的目录结构来当做对应项目的本地版本库
如 d:/git/repositories/billing(在repositories目录下以项目名称的形式创建目录存放对应的项目的版本信息)
2.对创建的目录执行初始化操作 git init
,那么关于billing项目的本地版本库就创建好了,会在billing文件夹下生成.git
文件(隐藏目录)
3. .git
这个目录下包含了当前版本库正常工作所需要的所有内容:暂存区文件、版本记录文件、配置文件等。换句话说,如果你想从项目中删除Git的版本控制,但又要保留项目原文件,那么只需要删除这个.git目录就可以了。这样,这个项目就与Git没有了任何关系。
作为版本控制系统的客户端,每台客户机对版本库的所有提交操作都需要注明操作者身份,所以客户机首先需要进行自我身份的注册,即创建用户。Git要求“用户名与Email"这两样信息是必不可少的
。Git具有三种不同的创建方式,会产生三种不同作用域的用户。这三种创建方式的用户信息会写到三个不同的配置文件中。这三种用户的创建均要使用git config命令,只不过使用的选项不同。这三种创建方式的创建的用户作用域由大到小依次是:系统用户、全局用户与本地库用 。在多种用户都进行了创建的前提下,小范围的用户会覆盖大范围用户,即默认会以小范围用户操作Git。系统用户:当前主机系统中所有用户均可使用的Git用户。全局用户:当前主机系统的当前登录用户可以使用的Git用户。本地库用户:只能对当前的本地版本库进行提交的Git用户。
注意:window10中有权限限制,以管理员省份运行即可
1.执行git config --system (window10中有权限限制,以管理员省份运行即可)
2.这个命令具体是修改git安装目录下/mingw64/etc/gitconfig文件(可以在命令行窗口使用cat命令查看),还用git config --system --list
必须在本地库的目录下执行对应的命令
git config以下操作需要在初始化的版本库目录下操作
下面是文件的四个状态,
当然还有简单的格式输出git status -s
,其中s也可以改成short。
这里的A表示第一次添加到暂存区,M:红色为修改过未被添加进暂存区的,绿色为已经添加进暂存区的,??表示没有添加到暂存区,还有MM,AM之类的组合
git add
(以跟踪)警告说明: 这里的LF是linux下面的换行符,而CRLF是win上的换行符
![在这里插入图片描述](https://img-blog.csdnimg.cn/2019030217030382.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwMTgyODcz,size_16,color_FFFFFF,t_70
在暂存区修改后的文件需要使用git add 命令重新添加,否则使用提交命令提交的是上次使用add命令添加的文件(未修改之前的文件)
使用add 命令重新添加后上图中红色字体显示为绿色,表示修改已暂存,然后就可以提交到本地库
中文文件名的字节码也是无语了
git commit -m
这里的-m表示操作提示(就是标注一下具体修改了啥的)(而且git禁止不带注释的提交)
大致就是告诉你提交文件发生了那些变化
一般刚clone下来的版本库和提交所有的版本库查看状态如下
 (这里说的是在git初始化版本库目录(工作区))一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。
通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件模式。 来看一个实际的例子:
- 在工作区创建一个名称为` .gitignore`的文件,(`这个文件需要add到暂存区并且commit才会生效`),我们编辑该文件,写入一些匹配规则
- .gitignore 的格式规范如下:
- 所有空行或者以 # 开头的行都会被 Git 忽略(理解为注释)。
- 可以使用标准的 glob 模式匹配。
- 匹配模式可以以(/)开头防止递归。
- 匹配模式可以以(/)结尾指定目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
所谓的 glob 模式是指 shell 所使用的简化了的正则表达式。 星号()匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。 使用两个星号() 表示匹配任意中间目录,比如a/**/z
可以匹配 a/z, a/b/z 或 a/b/c/z
等。
# 不跟踪这个名称的文件
info.txt
# 不跟踪以 .a结尾的文件
*.a
# 但是lib.a文件例外
!lib.a
# 忽略当前目录下的todo文件,子目录中的TODO文件不被忽略
/TODO
# 忽略 build 目录下的所有文件
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf
1)比较工作区与暂存区
查看工作区与暂存区内容的区别,使用无选项的git diff命。
git diff 本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行 git diff 后却什么也没有,就是这个原因。
对于已修改过的文件内容需要进行撤销,根据修改内容已经出现的位置可以分为三种情况:
1, 仅仅是工作区中内容进行了修改,还未添加add到暂存区 。
2, 已经add添加到暂存区,但是还未commit提交到本地版本库 。
3, 已经提交commit到本地版本库
不同的情况具有不同的撤销方式。
git checkout
git reset HEAD
(取消暂存)先执行暂存区修改撤销,再执行工作区修改撤销
若修改过的文件,不仅add到了暂存区,还commit到了本地版本库,还能撤销吗?已经是无法撤销修改了,但是可以回退到修改前的版本。
git log
查看历史版本,这里会显示提交的作者,提交日期,提交的注释信息
每一个记录单元均由五行构成:
第1行: commit的id,由于Git是分布式版本控制系统,整个系统中存在有多个版本库,为了保证各个版本库中commit的id不重复,所有Git中的commit的id不是顺序递增的,而是与版本库主机的IP,版本库,提交者,提交时间相关的内容计算出来的一个值。
第2行:提交者的信息
第3行:提交的时间
第4行:分隔行,即空行。将前面所述基本信息与后面的修改日志内容进行分隔。
第5行:提交日志信息。
3.git log --pretty=oneline --abbrev-commit
前面方式下的commit-id显示的是全长度的id,可以以简写的commit-id方式来显示,只需要添加--abbrev-commit
选项即可。abbrev:缩写,简写。
4.翻页与退出
当 git log日志命令显示的内容太多,无法在一页内显示完毕所有内容时,其最后一行会出现一个冒号,让输入命令。
常用的命令有:
回车:显示下一行
空格:显示下一页
q:退出git log命令
~的数量来表示当前版本之前的版本,例如, HEAD^表示当前版本的前一个版本, HEADA^表示前两个版本,但是之前的版本较多的时候, ^的数量将不好数,此时可以使用~加数字表示当前版本之前的第几个版本。
git reflog
gitreset命令可以实现版本回退,其有三个选项,可以完成三种不同效果的回退,回退三种不同的Git状态。
回退到指定版本。但仅仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本。实现上是改变回暂存区commit之前的状态。
以下是回退前后对比:
提交前后版本对比
git reset --mixed
回退到指定版本。它不仅修改了分支中HEAD指针的位置,还将暂存区中数据也回 退到了指定版本。但是工作区中的版本仍是回退前的版本。
–mixed是git reset命令的默认选项。
git reset --hard
回退到指定版本。该命令不仅修改了分支中HEAD指针的位置,还将工作区、暂存区和本地库中数据也回退到了指定的版本。
要删除文件,首先要清楚该文件所处的git状态。若要是该文件未被Git管理,在工作区直接进行删除即可。但是,若该文件已经经过多次add与commit操作后要文件要被删除,则我们就需要通过Git命令来操作
1.查看暂存区的文件git ls-files
2.查看本地库文件列表
git ls-files --with-tree=HEAD
该命令实际上查看的是主分支上当前HEAD指针所指向的时间点的文件列表。若查看上一时间点的文件列表,则可将HEAD替换为HEAD^。当前,也可以使用HEA~n
3。只删除暂存区的文件
git -rm --cached
仅仅只能删除暂存区的文件
4. 删除本地库文件只需要将上面的操作提交git commit
即可。
5.恢复被删除的文件git reset HEAD
暂存区与本地库中的指定文件均被删除后要恢复,最简单的方式就是再对该文件进行add和commit操作,该操作不再演示。这里主要演示的是如何恢复在暂存区删除的文件。
这个命令执行之前,你必须能看到如下状态
6. 完全删除git rm
所谓完全删除,指的是将工作区、暂存区和本地库中的指定文一次性均删除。
这个时候就会发现工作区和暂存区的文件被删除,但是本地版本库需要执行提交操作
7.恢复被删除的数据
查看一下被删除版本的commit-id,然后回退到对应版本即可,自行查看前后区别
$ git reset --hard HEAD^
然后就会发现数据已经恢复(包含工作区,暂存区,本地库)
官网分支简介
官网分支与合并
1、master的最后的版本 处在其他分支的上游,(而不是其他叉路),只需要将master的指针向前移动
2、 如果道路已经岔开的话,Git 会使用两个分支的末端所指的快照(C4 和 C5)以及这两个分支的工作祖先(C2),做一个简单的三方合并。(这种情况下存在对同一文件的修改,可能会发生合并冲途
)
1.创建一个分支并且切换到该分支
git checkout -b
后跟分支名称
2.单独的创建和切换分支
上面的操作相当于两个命令
git branch 分支名称
git checkout 分支名称
3、查看分支(可以显示当前分支所在)
git branch
4、 删除分支
git branch -d 分支名称
(不能删除当前所在的分支)
5、合并分支
git merge 分支名称
这里需要理解分支的主次,如果当前在master分支,那么git merge a,就是将a分支合并到master上,
1.我们切换到hotfix 分支,做出修改,提交,然后切换回master,执行合并命令,完成后hotfix指针和master指针指向同一位置
6. 分支合并与冲突
Git的冲突检测单位是文件,即当不同分支对同一个文件进行修改后进行合并,就会产生冲突。
这是与SVN不同的。SVN检测冲突是文件中的列,什么意思?若两个分支修改的不是同一个文件,合并时肯定不会产生冲突;但若修改的是同一个文件上的不同行的内容,合并时也不会产生冲突;若修改的是同一个文件上同一行上的不同列,在合并的时候也不会产生冲突。只有两个分支修改的是同一个文件同一行中同列数据的时候,在合并时才会产生冲突。
模拟:
a.切换分支,分别查看两分支下文件内容一致
b. 切换分支,分别修改两个文件的hello.html文件,并且add,commit
c. 切换到master 上,执行合并命令
d.修改冲突的文件合并后文件会变成这样,你可以使用vim查看,手动修改,add,commit即可
e.成功后切换分支查看内容即可
一般分支创建是为了解决问题或者完成对应的任务,问题解决后合并,合并后应该删除,需要时可以重新创建
f.使用命令查看分支的版本历史
添加 git log --pretty=oneline --abbrev-commit
命令后添加--graph
选项
h.删除分支(以前的版本历史还存在)
命令详情 | 描述 |
---|---|
git branch -v | 查看当前分支的最后一次提交 |
git branch --merged | 查看哪些分支已经合并到当前分支 |
git branch --no-merged | 查看所有包含未合并工作的分支 |
git branch -D | 工作未合并可能会删除失败,这需要-D强制删除 |
分支开发工作流
分支 - 变基
将提交到某一分支上的所有修改都移至另一分支上 git rebase
为了方便团队协作, Git一般会使用中央版本库。相对于本地版本库而言,中央版本库都在其它主机上,我们一般称中央版本库为远程版本库。常用的远程版本库有: GitHub,码云Gitee
GitHub是一个面向开源及私有软件项目的托管平台,因为平台只支持Git作为唯一的版本库格式进行托管,故名为GitHub. Hub:中心,所以Git Hub,即Git中心。
简单说,Github是一个基于git的社会化代码分享社区。
1.打开官网,天写注册表单
官网地址:https://github.com
2、个人计划:选择免费用户还是付费用户
免费用户的仓库是公开的,付费是私有的
3、点击continue后进行,定制你的个人经验。
第一项是:你怎样描述你的编程经验等级。第一个选项是:编程新手
,第二个选项是:有些经验,第三个选项是:非常有经验
第二项是:你使用GitHub来做什么。选项分别是:设计,作业,查找;开发,项目管理,其它。
第三项是:对你自己的描述,哪个最接近。选项分别为:业余爱好者,学生,专业人士,其它。
完成后提交即可
4.验证邮箱地址(打开邮箱,按提示操作即可)
5、重新登录后,显示界面
Git的本地仓库要不时的从GitHub上接取数据及向GtHub推送数据,但每次都要通过帐号与密码的身份验证才可访问,非常麻烦。所以我们要设置免密登录,使用Git本地版本库可以免密登录并访问
1、免密登录机制Git主机间的通信采用的是SSH协议,即Sercure Shell协议。该协议的免密登录机制要求主机之间采用SSH-key即SSH密钥进行身份验证。SSH密钥包含“公钥与私钥”,所以我们首先要了解什么是“公钥与私钥”,然后还要理解“公钥与私钥”在免密登录中的作用,即免密登录的工作原理。
A. 公钥与私钥
对与公钥与私钥要了解以下三点:
“公钥与私钥加密”是一种“不对称的加密文式” ,是传统的“对称加密方式”的功能的增强。最常见的对称加密方式是:用户名密码方式。
公钥与私钥是成对的,即一个公钥对应一个私钥。使用公钥加密后,只能使用私钥进行解密。
公钥与私钥的关系:就好比“锁与钥匙”的关系。公钥相当于“锁”,锁是可以被他人看到的,是要发送给别人的,所以称为公钥;私钥相当于“钥匙”,它是不能公开的,只能有公钥发出者保存。
B. 免密码登录的工作原理免密登录在Master/Slave主从集群中使用较多,且多用于Master主机免密登录访问Slave主机,所以对于免密登录原理的分析就以Master/Slave为例。对于免密登录的机制,主要由两部分构成:构建与验证。
此时我们要设置本地库免密登录GitHub,即这里的本地版本库相当于前面的 Master,而 GitHub则相当于slave。所以,密钥对应由本地版本版本库生成,而GitHub中只需要保存公钥即可。
当前用户主目录下的隐藏目录.ssh下面 两个隐藏文件中,这两个文件分别是id_sra与id_sra.pub。
其中id_sra中存放的是私钥, id_sra.pub中存放的是公钥。所以生成密钥前首先要看本地版本库主机的当前用户主目录,确认有没有.ssh目录。
ls -a
命令查看即可B.使用ssh-keygen
ssh-keygen -t rsa -C "[email protected]" 一般是这样的命令进行生成的,这里的-c表示备注,内容随意,-t 表示生成公钥的类型介绍
C. 再次查看密钥文件再次查看本地版本库主机的当前用户主目录时,发现已经生成了.ssh目录,查看该目录其下也生成了id_rsa与id_rsa.pub文件。说明SSH密钥生成成功。
D。github设置
e. 赋值id_sra.pub文件中的公钥到这个界面,提交即可(这里的title是任意定义的)
1.打开new repository页面(右上角)
2.填写表单
名称和本地版本库保持一致即可
3)进入空版本库页面
点击create repository后,即可进入远程版本库页面。远程版本库创建好之后,默认Git间的连接采用的是Https协议。
较之SSH协议, HITIPS协议数据传输速度慢, B无法实现免密登录,即每次连接均需要输入用户名和密码,所以生产环境下一般采用的是SSH协议。所以首先要点击SsH,其后显示的就是远程版本库的访问地址。
远程版本库创建好之后,由于版本库仍然为空的,所以GtHub给出了三条建议:
1,使用命令行创建一个新的仓库。即删除这个空的版本库再创建一个新的版本库。
2.使用命令行推送一个新的仓库。即将本地版本库的内容push到远程版本库。
3,从其它版本库中导入代码
git remote add
命令的意思是为远程版本库命名一个本地名称,这里是origin
,后跟ssh协议,git push
命令用法git push origin master
:将本地版本库中master分支推送到origin远程库。git push origin
:将本地版本库中当前分支推送到origin远程版本库。git push-u origin
:将本地版本库master分支推送到origin远程版本库,并将origin设置为默认的远程库,即以后所有git push就不用再指定远程版本库了。git push
:将本地版本库中当前分支推送到默认远程片库。在Git Bash的本地版本库目录中远程以上两条命令。在第一次连接GitHub时本地库的Git系统会给出提示, GitHub站点主机的真实性不能确定, RSA密钥指纹是xxx,你确定要连接吗?输入yes,然后再给出一个警告,永久性的添加GitHub站点到已知主机列表。以后再连接就不会出现该警告。
(一),创建本地库的存放目录
只是创建文件目录即可,无需初始化
(二)。复制远程库地址
(三)运行克隆命令
(二) gitfromgithub将修改的内容push到远程库.
由于git和gitfromgithub是同一台主机作为远程版本库地址,而git已经指定了默认的远程版本库地址
否则应执行
git remote add origin [email protected]:cloudinwinter/billing.git
git push -u origin master
(三) git从远程库pull到本地
进入git本地版本库目录,直接git pull
即可
git pull命令常见的用法:
以下命令执行的前提是默认的远程版本库已经指定等价于 git pull origin master,当然先命名远程版本库
git reomote
:该命令可列举出当前本地版本库可操作的远程版本库名称
git remote-v
:该命令可以显示出更为详细的信息:远程库地址及本地库可执行的操作权限。
现代的开发多采用敏捷开发模式,该开发模式可以应需求的快速变化,可以频繁交付新的软件版本,其采用迭代方式逐步完善软件功能。当开发出新的版本生如何进行发布?Git中软件的发行,是通过标签完成的。
像其他版本控制系统(VCS)一样,Git 可以给历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记发布结点(v1.0 等等)。
一个软件的某个发行版本对应的其实就是软件开发过程中其一阶段的最后一次git commit提交。我们知道每一个git提交,对应的都会有一个commit-d,而标签就是与某一个commit-d绑定的名称。一个标签一旦与某一个commit-id绑定,那么该标签就不能修改绑定到其它commit-id了,除非将该标签删除后才可以与其它commitid绑定。
官网打标签
Git 使用两种主要类型的标签:轻量标签(lightweight)与附注标签(annotated)。
一个轻量标签很像一个不会改变的分支 - 它只是一个特定提交的引用。
然而,附注标签是存储在 Git 数据库中的一个完整对象。 它们是可以被校验的;其中包含打标签者的名字、电子邮件地址、日期时间;还有一个标签信息;并且可以使用 GNU Privacy Guard (GPG)签名与验证。 通常建议创建附注标签,这样你可以拥有以上所有信息;但是如果你只是想用一个临时的标签,或者因为某些原因不想要保存那些信息,轻量标签也是可用的。
git tag 标签名称
这里的标签名称一般是特定的版本号,默认是和当前HEAD指针指定到的版本进行绑定
git创建标签和历史版本绑定 ,上面的命令跟简写的commit-id即可(如果你查看的是完整的id的话,输入前七位)
git tag -a 名称 -m 标签存储信息
-a 指定标签名称
-m 选项指定了一条将会存储在标签中的信息。 如果没有为附注标签指定一条信息,Git 会运行编辑器要求你输入信息。
这里的和历史版本绑定和之前轻量标签是一样的
查看所有标签(输出顺序为字母顺序,而非时间)
git tag
查看指定标签(这里*号之前不要加.)
git tag -l 标签模糊匹配名
显示指定标签的详细信息(使用这个标签可以确定其绑定的版本)
git show 名称
以下说的是如果你要修改和指定标签绑定的版本,那么就应该使用标签切换到该版本,并且在该节点创建新的分支,并且提交修改才能生效
软件版本一旦被指定,即标签一旦与某一commit-id绑定,那么这个版本的代码还能修改吗?若将master回退到该commit-id,然后再修改代码,修改完成后再commit,我们会发现代码修改过了,但该标签绑定的commit-id并没有发生变化,即该软件版本的代码仍未修改。
当然,此时我们可以将该标签删除,然后再定义一个同名标签与修改过代码的commit-id绑定。这样也是可以的。但是这里存在一个巨大的风险,我们修改过的代码是master主分支上的,一旦修改过的代码出现问题,将可以导致整个代码出问题。
所以,我们一般不会修改master主分支上的代码。那应该怎么办? Git将标签定义为了与分支同级别的概念,它不仅驻是一个 commit-id的别名。Git允许程序员使用分支切换命令git checkout将代码转向标签所指定的版本。
命令执行完毕,系统给出了很多的提示,该提示的总体意思为:当前处于“游离”状态,在该状态下用户的任何修改与提交对任何的分支都没有影响(言外之意是:其修改将不会被保留)。若保留修改,则可以通过git checkout-b命令创建一个新的分支。
在该新分支上再进行修改提交,然后再合并到master分支,最后再将该分支删除。此时创建的分支名称可以随意。当前,合并到master分支后,仍需要删除原标签,然后再与·新的commit_id绑定。不过,生产环境下,一旦标签定义完成就不会与删除再绑定了。而是会再定义一个新的标签与新的commitid绑定。
 前面通过标签定义的版本仅仅是定义在本地库,其最终需要推送到远程版本库作为一个发行版本出现。可以通过以下两种方式:
A、推送指定标签git push 远程库名称 标签名称
这里由于创建了和标签名一样的分支,推送失败
B、git push origin --tags
这将会把所有不在远程仓库服务器上的标签全部传送到那里。
c、查看结果
其他用户在更新本地版本库时,会将标签一并更新,然后可以指定标签版本作为一个新的分支进行编辑,编辑完成后再合并到master,最后将该分支删除。
A、删除本地标签git tag -d 标签名称
B. 删除远程标签: git push origin:refs/ltas/标签名称
若要删除远程库中的标签,首先要删除本地库中的该标签
,然后再运行如下命令
c.自行查看结果
码云:https://gitee.com/
码云专为开发者提供稳定、高效、安全的云端软件开发协作平台,无认是个人、团队、或者企业,都能够用码云实现代码的托管、项目管理、协作开发。码云同样也只支持Git作为唯一的版本库格式进行托管。
码云的免费版本也提供私有库功能,只是有5人的成员上限。
登录之后,点击页面右上角的+号,在弹出的菜单项中单击“新建项目”
在“新建项目”页面,只需要填写项目名称及完成项目的路径,选择编程语言为Java即可,其它保持默认设置。然后点击“创建”按键。项目创建完毕后,马上就会进入到远程版本库页面。点击“克隆/下载”,即可看到基于HTTPS协议与SSH协议的仓库地址
可能出现错误: https://blog.csdn.net/fightingforcv/article/details/52073182
码云官方帮助:https://gitee.com/help/articles/4122
大致的操作和GitHub相同
需要一台linux 主机
官网地址
一般使用yum命令安装的都不是最新的版本,安装时可能由于网络问题发生错误
1.直接安装
yum install git
# 安装依赖
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
# 源码包可以直接使用linux命令下载,也可以从官网下载,再试用ftp工具
tar -zxf git-2.0.0.tar.gz
3.可以通过执行git --version查看git是否安装成功。安装的版本 ,
1.创建git用户并设置密码创建一个名称为git的用户,用于运行Git服务。当然,系统会在/home下创建一个名称为git的目录,作为git用户的主目录。useradd git
2。为git用户设置密码(应该不允许设置太简单)
在git用户主目录/homel/git新建一个目录.ssh,并在其中新建一个名称为authoried_keys的文件。将本地版本库主机中的公钥复制到该文件中。若有多台git客户端的公钥,则将其它公钥也粘贴到该文件中,一个公钥占一行。目录/home/git/.ssh/authorized_keys
这里使用mkdir命令创建后.ssh是隐藏文件夹,可以使用ls -a 来查看
(一)创建存放目录任意选定一个目录用于存放版本库。例如,在/usr目录中新建一个目录repositories,用于存放版本库。
(二)初始化裸库
git init --bare
命令与git init
命令的不同之处是:加有–bare选项的命令创建的版本库中没有工作区。我们之前通过git init命令创建的版本库是这样的:创建了版本库目录,该目录即工作区目录,并且在其中有一个.git目录,其中存放的是版本库的相关文件。而 git int-bare命令所创建的版本库目录中没有.git目录,直接在版本库目录下存放的就是原来的.git目录中的内容,所以就没有了工作区(不要执行错了目录)。因为在服务器上的git主要是为了共享,不需要工作区,避免用户在工作区修改文件,其他用户推送文件冲途
这里的billing.git 是初始化的目录,一般是当前项目名加.git
chown -R git:git billing.git/
由于版本库是由root用户创建的,所以其默认的owner就是root.将版本库的owner修改为git用户,使git用户具有版本库的最高访问权限。这里的-R表示递归,其子目录也改变权限。git:git表示git用户组下的git用户,前一个表示账户,最后的billing.git是文件名
来源
出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成。找到类似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改为:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。
上面有介绍,不在讲述
1.这条命令需要切换到自己的工作区执行
git remote add 远程库本地别名 用户@远程库地址/共享库所在目录
# 这条不解释了
git push -u custom master
这里添加README文件的目的,并不是说这个README文件多么的重要,其作用是为了使用远程库在创建时直接就存在一个文件。这样的话, Git客户端若要使用该远程库,就必须从Clone远程库开始。若客户端先对于其本地版本库进行编辑,然后直接push到当前的远程库则会出现rejected拒绝连接的提示。因为远程库比本地库中多一个文件。
不在使用git init 而是使用git clone保持本地版本库和远程版本库的一致