我们所用的Git就是最常用的一种版本控制工具,所以我们有必要了解一些版本控制的基本知识
版本控制(Revision control)
是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。
版本控制系统(Version Control System)
理解为一个“数据库”,在需要的时候,它可以帮你完整地保存一个项目的快照。当你需要查看一个之前的快照(称之为“版本”)时,版本控制系统可以显示出当前版本与上一个版本之间的所有改动的细节。版本控制最主要的功能就是追踪文件的变更。它将什么时候、什么人更改了文件的什么内容等信息忠实地了记录下来。每一次文件的改变,文件的版本号都将增加
软件开发往往是多人协同作业,版本控制可以有效地解决版本的同步以及不同开发者之间的开发通信问题,提高协同开发的效率。并行开发中最常见的不同版本软件的错误(Bug)修正问题也可以通过版本控制中分支与合并的方法有效地解决。
实际开发过程中,我们对源文件的修改并不是在
软件配置管理库
中,而是每个人都有自己的工作空间,对源文件的修改依赖于基本的文件系统在自己的工作空间下进行
访问控制
需要管理各个人员存取或修改一个特定软件配置对象的权限。
同步控制
的实质是版本的检入检出控制
,可用来确保由不同的人并发执行的修改不会产生混乱。
检入
就是把软件配置项从用户的工作环境存入到软件配置库的过程检出
就是把软件配置项从软件配置库中取出的过程首先了解一下两个基本的概念:
版本分支
:以一个已有分支的特定版本为起点,但是独立发展的版本序列
版本合并
:来自不同分支的两个版本合并为其中一个分支的新版本
版本分支
的人工方法就是从主版本(主干)上拷贝一份,并做上标记。
版本合并
有两种途径:
版本的历史记录有助于对软件配置项进行审核,有助于追踪问题的来源。
历史记录包括:
主流的版本控制器有如下这些:
现在影响力最大且使用最广泛的是Git与SVN
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合
个人
用,如RCS。
所有的版本数据都保存在
服务器
上,协同开发者从服务器上同步更新或上传自己的修改
SVN
服务器
上,用户的本地只有自己以前所同步的版本所有版本信息仓库全部同步到本地的每个用户
Git
,Git是目前世界上最先进的分布式版本控制系统。每个人都拥有全部的代码,有很大的安全隐患
可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时push到相应的服务器或其他用户那里。
由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。
不会因为服务器损坏或者网络问题,造成不能工作的情况!
SVN是集中式版本控制系统
,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本,然后工作,完成工作后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作,对网络带宽要求较高。
Git是分布式版本控制系统
,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件!
首先在系统环境变量path
中删除Git
的配置
打开控制面板(win+r再输入control),直接卸载
官网:https://git-scm.com/(如果下载速度很慢,建议用以下镜像地址进行下载)
镜像地址:http://npm.taobao.org/mirrors/git-for-windows/
安装路径最好选择自己的路径
此处默认即可
下一步默认
这里是选择默认的文本编辑器,大家选择自己电脑上使用的即可,这里选择Sublime
接下来的操作默认即可,直接next
Git Bash
:Unix与Linux风格的命令行,使用最多,推荐最多
Git CMD
:Windows风格的命令行
Git GUI
:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
同时我们在任意地方鼠标右键,可以看到新添加的功能
注意:Git环境变量的配置在安装的时候已经自动添加,不用再配置
查看配置
git config -l
查看不同级别的配置文件
#查看系统configgit config --system --list
#查看当前用户(global)配置git config --global --list
首先了解两种等级的配置文件
位置:
Git安装目录/etc/gitconfig
位置:C盘/用户/用户名/.gitconfig
每次Git提交时都会使用该信息,需要预先设置好
git config --global user.name "zsr204"#名称git config --global user.email "1412578784@qq.com"#邮箱
--global
是全局配置选项,如果你希望在一个特定的项目中使用不同的名称或e-mail地址,你可以在该项目中运行该命令而不要--global
选项再次查看配置文件即可看到修改内容
前三个区域是本地的,第四个区域是远程的
工作区(WorkSpace)
:本地存放项目代码的目录暂存区(Stage/Index)
:是一个文件,临时存放对文件的更改,保存即将提交到文件列表信息本地仓库(Repository)
:安全存放数据的位置,包含提交的所有版本的数据;HEAD指向最新放入仓库的版本远程仓库(Remote)
:托管代码的服务器,比如Gitee、Github等文件在这四个区域之间的传输命令如下:
日常使用的六个命令
1、在工作目录
中添加、修改文件;
2、将需要进行版本管理的文件放入暂存区域
;
3、将暂存区域的文件提交到git仓库
。
由此可见,git管理的文件有三种状态:已修改(modified)
,已暂存(staged)
,已提交(committed)
工作目录是通过Git帮助你管理的文件夹
可以是项目的目录
也可以是一个空目录,建议不要有中文
这里在任意地方新建一个空文件夹GitCode
,作为Git管理的项目文件夹
有两种方式:
在需要用Git管理的项目目录执行以下代码:
#在当前目录新建一个Git代码库git init
在上述第一步新建的目录中空白位置右键Git Bash
,输入上述代码
执行完成后,就可以看到新生成了一个.git
目录,关于版本的信息都在这个目录里面
注意:.git
目录是一个隐藏目录,需要设置显示隐藏目录
另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地,而不是取某一个特定版本,所以用clone而不是checkout
# 克隆一个项目和它的整个代码历史(版本信息)git clone [url]
我们可以去 gitee 或者 github 上克隆一个测试!
这里再Gitee上新建了一个新仓库GitCode
,复制url地址
https://gitee.com/zhong_siru/git-code.git
Git Bash
(这里先删除刚刚生成的.git
目录)Untracked
:未跟踪,此文件在工作文件夹中,但并没有加入到git库,不参与版本控制,通过git add
状态变为Staged.Unmodify
:文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件Modified
:文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改 !Staged
:暂存状态. 执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified上面说文件有4种状态,通过如下命令可以查看到文件的状态:
#查看指定文件状态git status [filename]#查看所有文件状态git status#添加所有文件到暂存区 git add . #提交暂存区中的内容到本地仓库 -m 提交信息git commit -m "消息内容"
在使用
git
的过程中,一般我们总会有些文件无需纳入git
的管理,也不希望它们总出现在未跟踪文件列表,这些文件通常是日志文件、临时文件、编译产生的中间文件、工具自动生成的文件等等。
.gitignore
文件就可以控制忽略某些文件纳入版本控制中
#
开始的行将会被忽略!
进行取反/
,表示要忽略的文件在此目录下,而子目录中的文件不忽略/
,表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)所谓的 glob 模式是指 shell 所使用的简化了的正则表达式
*
代表任意多个字符?
代表一个字符[abc]
代表可选字符范围{string1,string2,...}
代表可选的字符串等logs/#忽略当前路径下的logs目录,包含logs下的所有子目录和文件/logs.txt#忽略根目录下的logs.txt文件*.class#忽略所有后缀为.class的文件!/classes/a.class#不忽略classes目录下的a.class文件tmp/*.txt#只忽略tmp目录下的.txt文件**/foo#可以忽略/foo, a/foo, a/b/foo等
该步骤可以实现免密码登录,码云是远程仓库,我们是平时工作在本地仓库,免密码登录十分重要
首先进入C:\Users\用户名\.ssh目录
Git Bash
,输入以下代码,一路回车 # 生成公钥ssh-keygen -t rsa
打开id-rsa.pub
文件
点击新建一个仓库
GitCode
目录,右键GitBash
git clone https://gitee.com/zhong_siru/remote.git
remote
,将其中的文件拷贝到该项目目录中.git
文件夹首先需要了解一些IDEA中的一些基本操作
点击下方的Git
(或者alt+9)可以查看关于仓库的所有信息
拉取、提交按钮的位置
add
添加到暂存区我们手动进行add
,打开IDEA的Terminal
,输入以下命令将代码添加到暂存区
git add .
然后可以看见项目目录被add
的文件变成绿色
如果我们修改了某个文件,可以直接右键进行add
更改内容到暂存区
commit
提交到本地仓库点击上述提交按钮或者(ctrl+k)
2020IDEA代码提交已经不是以前那种模态化弹框式
窗口,现在集成到左边commit
侧边栏中
如果想使用以前弹出式的提交窗口,可以按下图所示进行切换
切换后,想要换回来,可以在如下图所示进行设置
提交代码前,需要做相关设置
勾选要提交的文件,然后填写提交的信息,然后点击Commit
提交完成后,点击Git
可以查看关于仓库的所有信息,我们在Log
中可以看到我们刚提交的操作以及提交的文件
同时在Console
控制台可以看到相关信息
push
到远程仓库同样在
Terminal
中输入以下代码,push到远程仓库
git push
出现如下结果即成功
我们随便在一个地方新建一个Hello类,这时候显示为红色
Git
Add
即可添加到Git,然后可以看到文件变为绿色接下来,我们通过命令行的方式将这个添加的Hello.java
添加到远程仓库
打开Terminal
窗口,先后输入以下三个命令
git add .git commit -m "new .java file Hello"git push
几乎所有的版本控制系统都以某种形式支持分支。
- 使用分支就是可以把你的工作从开发主线上分离开来,以免影响开发主线。
- 在很多版本控制系统中,该过程略微低效——常常需要完全创建一个源代码目录的副本。对于大项目来说,这样的过程会耗费很多时间。
Git
处理分支的方式十分轻量,创建新分支几乎能在瞬间完成,并且不同分支之间的切换操作十分便捷- 所以有人把 Git 的分支模型称为它的
必杀技特性
我们可以在Gitee随便找一个项目,查看其分支,通常是一个主分支master
加上开分分支dev
和其他一些版本的分支
master
主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作dev
分支上工作我们在上述实验环境中测试
# 列出所有本地分支git branch
# 列出所有远程分支git branch -r
# 新建一个分支,但依然停留在当前分支git branch [branch-name]# 新建一个分支,并切换到该分支git checkout -b [branch]
# 合并指定分支到当前分支git merge [branch]
# 删除分支git branch -d [branch-name]# 删除远程分支git push origin --delete [branch-name]git branch -dr [remote/branch]
我们也可以在IDEA中查看分支,并进行相应的操作
项目右键,点击Git
,然后点击Repository
,然后点击Branches
在Gitee中有关于Git
的相关资料,大家可以自行查看
Git大全:https://gitee.com/all-about-git
Git命令大全:https://oschina.gitee.io/learn-git-branching/
联系客服