目录
Git的版本控制
常见的版本控制工具
版本控制分类
1、本地版本控制
2、集中版本控制 svn
3、分布式控制 git
Git和SVN的主要区别
Git的历史
Git环境配置
软件下载
启动git
常用的Linux命令
Git配置
Git相关的配置文件:
设置用户名与邮箱(用户标识必须填写)
git基本理论(重点)
三个区域
工作流程
Git项目搭建
本地仓库搭建
init 创建全新的仓库
克隆远程仓库
Git的文件操作
查看文件状态
忽略文件
使用远程仓库码云
创建仓库
代码提交
idea中集成Git
方式1:将新建的项目放在远程的git文件目录下
方式2:将远程仓库中的.git文件和其他文件拷贝到项目中
碰到git上传文件出错[rejected] master -> master (fetch first) error: failed to push some refs to '
git中的分支
什么是版本控制
版本控制是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复御前的版本的软件工程技术
多人开发就必须使用版本控制
主流的版本控制器有如下这些
版本控制产品非常的多(Perforce、Rational ClearCase、RCS(GNU Revision Control System)、Serena Dimention、SVK、BitKeeper、Monotone、Bazaar、Mercurial、SourceGear Vault),现在影响力最大且使用最广泛的是Git与SVN
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS
所有的版本数据都保存在服务器上,协同开发者从服务器上绒布更新或者上传自己的修改
所有的版本数据都存在服务器上,用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本验证问题,或在不同分支工作。而且,所有数据都保存在单一的服务器上,有很大的风险这个服务器会损坏,这样就会丢失所有的数据,当然可以定期备份。代表产品:SVN、CVS、VSS
每个人都有所有的代码,这存在安全隐患
所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需要在联网是推到相应的服务器或者其他用户哪里,由于每个用户保存的都是所有版本数据,只要有一个用户的设备就可恢复所有的数据,但这增加了本地存储空间的占用,不会因为服务器或者网络问题,造成不能工作的情况
svn是集中式版本控制系统,版本库是集中在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器中得到最新的版本,然后工作,完成工作后,需要把自己做完的东西推送到中央服务器。集中式版本控制系统必须联网才能工作,对网络宽带要求较高
Git是分布式版本控制系统,没有中央服务器,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。协同的方法是这样的:比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件!
git是目前世界上最先进的分布式版本控制系统
同生活中的许多伟大事物一样,Git 诞生于一个极富纷争大举创新的年代。
Linux 内核开源项目有着为数众广的参与者。绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上(1991-2002年间)。到 2002 年,整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。
Linux社区中存在很多的大佬!破解研究 BitKeeper !
到了 2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。这就迫使 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds)基于使用 BitKeeper 时的经验教训,开发出自己的版本系统。(2周左右!) 也就是后来的 Git!
Git是免费、开源的,最初Git是为辅助 Linux 内核开发的,来替代 BitKeeper!
Linux和Git之父李纳斯·托沃兹(Linus Benedic Torvalds)1969、芬兰人
打开 [git官网] https://git-scm.com/https://git-scm.com/,下载git对应操作系统的版本。
所有东西下载慢的话就可以去找镜像!
官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/http://npm.taobao.org/mirrors/git-for-windows/
下载后选择对应版本安装即可
环境变量只是为了全局使用而已,配置了就可以在任意地方使用
Git Bash:Unix与Linx分隔的命令行,使用最多,建议使用这个
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git,不建议使用这个,尽量先熟悉命令操作
1)cd : 改变目录。
2)cd . . 回退到上一个目录,直接cd进入默认目录
3)pwd : 显示当前所在的目录路径。
4)ls(ll): 都是列出当前目录中的所有文件,只不过ll(两个ll)列出的内容更为详细。
5)touch : 新建一个文件 如 touch index.js 就会在当前目录下新建一个index.js文件。
6)rm: 删除一个文件, rm index.js 就会把index.js文件删除。
7)mkdir: 新建一个目录,就是新建一个文件夹。
8)rm -r : 删除一个文件夹, rm -r src 删除src目录
9)、mv 移动文件, mv index.html src index.html 是我们要移动的文件, src 是目标文件夹,当然, 这样写,必须保证文件和目标文件夹在同一目录下。
10)reset 重新初始化终端/清屏。
11)clear 清屏。
12)history 查看命令历史。
13)help 帮助。
14)exit 退出。
15)#表示注释
和Linux的命令基本一致
所有的陪文件,其实都是保存在本地
查看配置 git config -l
查看不同级别的配置文件:
#查看系统的config
git config --system --list
#查看当前用户(global)配置
git config --global --list
1)、Git\etc\gitconfig:Git安装目录下的gitconfig --system 系统级
2)、C:\Users\Administrator\ .gitconfig 只适用于当前登录用户的配置 --global 全局
这里可以直接编辑配置文件,通过命令设置后会响应到这里
当你安装Git后首先要做的事情是设置你的用户名称和e-mail地址,这是非常重要的,因为每次gir提交都会使用该信息,他被永远的跟随到你的提交中:
git config --global user.name "xxxxx" #名称
git config --global user.email "xxxxx" #邮箱
Git本地有三个工作区域:工作目录(Working Dierctory)、暂存区(Stage/Index)、资源库(Repository 或Git Directory),如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间你的转换关系如下
Workspace:工作区,就是你平时存放项目代码的地方
index/Stage:暂存区,用于临时存放你的改动,事实上他只是一个文件,保存即将提交到文件列表信息
Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据,其中HEAD是指向最放入仓库的版本
Remote:远程仓库,托管代码的服务器,可以简单的人为你是项目组中的一台电脑用于远程数据交换
本地的三个区域确切的说应该是git仓库中HEAD指向的版本:(.git是隐藏文件,在windows中勾选之后显示出来)
git的工作流程一般为:
1、在工作目录中添加、修改文件;(如:UserMapper.xml)
2、将需要进行版本管理的文件放入暂存区域;(git add .) . 表示全部
3、将暂存区域的文件提交到git仓库 (git commit)
因此git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
闯进工作目录与常用指令
工作目录(WorkSpace)一般就是你希望Git版主你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文
常用的一下六个命令
创建本地长裤的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库,
1、创建全新的仓库,需要用Git管理的项目的根目录执行:
#在当前目录新建一个Git代码库
git init
找一个文件夹,右键打开git,输入命令即可
执行后可以看到,只是在项目目录中多出来一个.git目录,关于版本等的所有信息都在这个目录里。
另一种方式是可隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地
#克隆一个项目和他的整个代码历史(版本信息)
git clone [url]
如:克隆springmeng的水果商城源码
$ git clone https://gitee.com/springmeng/ssm-code.git
文件操作的四种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能提交了现在还不想提交得文件,或者要提交得文件还没有提交上去。
Untracked:未跟踪,此文件在文件夹中,但是没有加入doagit库中,不参与版本控制,通过
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
文件得建立在.git之下
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
# git add . 添加所有文件到暂存区
# git commit -m "消息内容" 提交暂存区中的内容到本地仓库 -m 提交信息
新建两个文件,使用git status查看他们的状态可以发现他们都是Untracked未跟踪的状态
当使用git add 文件时,发现两个文件的状态,一个已经处于staged暂存状态,一个还是处于未跟踪的状态
已经提交后,所变得颜。
有时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件吗,设计文件等在主目录下建立“.gitignore”文件,此文件有如下规则:
1、忽略文件中的空行或以井号(#)开始的行将会被忽略。
2、可以使用Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,当括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
3、如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
4、如果名称的最前面是一个路径分隔符(/),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
5、如果名称的最后面是一个路径分隔符(/),表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽略)。
#为注释
*.txt #忽略所有 .txt结尾的文件,这样的话就不会上传上去了
!.lib.txt #但lib.txt除外,意思是这个文件会上传
/temp #仅忽略项目根目录下的所有文件,不包括其他目录temp
build/ #忽略build/目录下的所有文件
设置绑定ssh公钥,可以免密登录
生成ssh公钥的指令
#rsa加密协议
ssh-keygen -t rsa
输入之后,连续两次回车就可以在你的users用户生成.ssh秘钥了。
将.pub的文件打开后复制过去即可,这样就可以实现免登陆了。
将创建好的仓库克隆到本地
增加/删除文件
# 添加指定文件到暂存区
$ git add [file1] [file2] ...
# 添加指定目录到暂存区,包括子目录
$ git add [dir]
# 添加当前目录的所有文件到暂存区
$ git add .
# 添加每个变化前,都会要求确认
# 对于同一个文件的多处变化,可以实现分次提交
$ git add -p
# 删除工作区文件,并且将这次删除放入暂存区
$ git rm [file1] [file2] ...
# 停止追踪指定文件,但该文件会保留在工作区
$ git rm --cached [file]
# 改名文件,并且将这个改名放入暂存区
$ git mv [file-original] [file-renamed]
# 提交暂存区到仓库区
$ git commit -m [message]
# 提交暂存区的指定文件到仓库区
$ git commit [file1] [file2] ... -m [message]
# 提交工作区自上次commit之后的变化,直接到仓库区
$ git commit -a
# 提交时显示所有diff信息
$ git commit -v
# 使用一次新的commit,替代上一次提交
# 如果代码没有任何新变化,则用来改写上一次commit的提交信息
$ git commit --amend -m [message]
# 重做上一次commit,并包括指定文件的新变化
$ git commit --amend [file1] [file2] ...
我的远程是gitTest,我们只需要将新建的目录放在gitTest/下即可
提交到远程仓库
在这依次输入git add . , git commit -m "", git push 之后
这样就传上来了。
出现错误的主要原因是gitee中的README.md文件不在本地代码目录中
解决方法:
第一步此时我们要执行
git pull --rebase origin master命令将README.md拉到本地,
然后执行git push origin master就可以成功了
# 列出所有本地分支
$ git branch
# 列出所有远程分支
$ git branch -r
# 列出所有本地分支和远程分支
$ git branch -a
# 新建一个分支,但依然停留在当前分支
$ git branch [branch-name]
# 新建一个分支,并切换到该分支
$ git checkout -b [branch]
# 新建一个分支,指向指定commit
$ git branch [branch] [commit]
# 新建一个分支,与指定的远程分支建立追踪关系
$ git branch --track [branch] [remote-branch]
# 切换到指定分支,并更新工作区
$ git checkout [branch-name]
# 切换到上一个分支
$ git checkout -
# 建立追踪关系,在现有分支与指定的远程分支之间
$ git branch --set-upstream [branch] [remote-branch]
# 合并指定分支到当前分支
$ git merge [branch]
# 选择一个commit,合并进当前分支
$ git cherry-pick [commit]
# 删除分支
$ git branch -d [branch-name]
# 删除远程分支
$ git push origin --delete [branch-name]
$ git branch -dr [remote/branch]
如果同一个问价在合并分支是都被修改了则会引起冲突:解决方法是我们可以修改冲入问价后重新提交!选择要保留的要删除的代码。