Git
Git简介
Git是一款免费、开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
官网地址为:https://git-scm.com/
优点
- 适合分布式开发,强调个体;
- 公共服务器压力和数据量都不会太大;
- 速度快、灵活;
- 任意两个开发者之间可以很容易的解决冲突;
- 离线工作。
缺点
- 代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息
- 权限控制不友好
和SVN的区别
SVN
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。集中式版本控制系统是必须联网才能工作.
集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。
但是相较于其优点而言,集中式版本控制工具缺点很明显:
- 服务器单点故障
- 容错性差
Git
Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
Git是分布式版本控制系统,它没有中央服务器,每个人的电脑就是一个完整的版本库,这样工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了
两者的区别
- Git是分布式的,SVN不是:这是Git和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
- Git把内容按元数据方式存储,而SVN是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。
- Git分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外的一个目录。
- Git没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
- Git的内容完整性要优于SVN:Git的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
Git工作流程
- 从远程仓库中克隆 Git 资源作为本地仓库
- 从本地仓库中checkout代码然后进行代码修改
- 在提交本地仓库前先将代码提交到暂存区
- 提交修改,提交到本地仓库;本地仓库中保存修改的各个历史版本
- 在需要和团队成员共享代码时,可以将修改代码push到远程仓库
Git中的两区两库----核心
Workspace: 工作区,就是你平时存放项目代码的地方
Index / Stage: 暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
Repository: 仓库区(或版本库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
Remote: 远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
Git的安装、卸载
这边直接下一步
选择自己常用的编辑器
安装完成
Git Bash:与Linux的命令行风格一样
Git CMD:Windows风格的命令行
Git GUI:图形界面的Git
Git配置
$ git config -l ---查看git所有的配置
$ git config --system --list ---查看系统下的配置
$ git config --global --list ---查看全局配置
在git中所有的配置文件都是保存在本地文件下
E:\Git\Git\etc\gitconfig —-system系统级
C:\Users\asus.gitconfig --list查看全局配置
设置用户名以及邮箱 —重要,不设置不能提交项目
$ git config --global user.name "wj" 设置用户名
$ git config --global user.email "wj1623847352@gmail.com"
仓库搭建
本地
在本地建立一个文件夹,然后在文件夹里边右键Git Bash
$ git init 初始化一个项目
克隆远程仓库
克隆远程目录
$ git clone [url] https://gitee.com/mihh/mimihuhu.git --Gitee
$ git clone [url] https://github.com/MMHH-mh/mmhh.git --GitHub
Git文件的四种状态
版本控制就是对文件的版本控制,要对文件修改、提交等操作。首先我们要先知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上
-
untracked :刚被新建,存放在文件夹中并没有加入到git库中。还未被跟踪 通过
git add 或者 git add.
将其状态变为staget
也就是将其添加到暂存区 -
unmodify:文件已入库,还未被修改,这个时候版本库中的文件快照内容与文件夹内容完全一致。如果他被修改状态就会变为
modify
,如果使用git rm
移出版本库,他就又会变成为untracked 文件 -
modify :文件已经修改并没有进行其他操作。通过
git add
可以将其添加到staget
(暂存区)或使用git checkout
从库中取出文件,覆盖掉当前修改的内容,并将其状态变为unmodify -
staget : 暂存状态,执行
git commit
将修改文件同步到库中,这时库中的文件和本地文件又变为了一致。文件变为unmodify
状态。执行git reset HEAD fileame
取消暂存,文件变为modify
查看文件的状态
--可以查看文件夹下所有文件的状态,也可以查看单文件的状态
git status [filename]
--添加所有文件到暂存区
git add .
--提交暂存区的内容到本地仓库 -m为提交信息
git commit -m "new file Hello.java"
在IDEA中如何在每次提交的时候不会自动提交不想要提交的文件,比如数据库文件,临时文件等
在主目录下建立.gitignore
文件,然后可以在里边定义一些规则
-
以
#
号开头的行会被忽略 -
可以使用通配符·
*
来代表多个任意字符,用?
表示一个字符,方括号([a,b,c])代表可选字符范围,大括号({string1,string2})代表可选的字符串 -
名称最前边加一个
!
号表示例外规则,不会被忽略 -
名称最前边为
/
表示要忽略的文件在此目录下,而子目录中的文件不被忽略 -
名称最后边为
/
表示的是此目录下该名称的子目录,而非文件(默认文件和目录都忽略)
码云设置
设置SSH公钥
我们每次提交代码的时候都需要输入用户名和密码,绑定本地SSH之后就可以实现免密登录
进入本机下 C:\Users\asus\.ssh 目录
进入git窗口中
ssh-keygen 便可生成公钥
如果自己想加密的话可以使用 : ssh-keygen -t rsa ----rsa就为加密算法
然后一路回车即可(三个回车)
在码云中添加SSH公钥
将公有文件打开,将里边的内容复制到码云里边
复制到码云中
---- 密码验证 的时候密码就是自己码云账号的密码
在IDEA中集成Git
第一种
-
在IDEA中新建一个项目
-
将已经远程拷贝下来的目录复制到新建的项目目录中
第二种
-
打开IDEA设置
-
找到Version Control -->Git
将Git上的项目拉取到本地
提交代码
和SVN中的操作基本一致
提交代码
也可使用命令来提交
将代码提交到远程仓库,也可使用命令直接push到远程仓库
Git分支
在一个比较大的项目中会有许许多多的分支,我们也可以使用一些命令来对他进行管理
git branch 查看本地所有分支
E:\collection\IDEA\git-test\mimihuhuw>git branch
* master
git branch -r 查看远程所有的分支
E:\collection\IDEA\git-test\mimihuhuw>git branch -r
origin/HEAD -> origin/master
origin/master
git branch 0.0.1dev 新建分支
$ git checkout 0.0.1dev 切换分支
git merge 0.0.1dev 将指定分支合并到当前分支 注意:需要切换到需要接收的那一个分支上
每次的提交Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里这个分支叫主分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,master才是指向提交的。
一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:
每次提交,master分支都会向前移动一步,这样随着不断提交,master分支的线也越来越长。
当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
不过切换到了dev分,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
假如我们在dev上的工作完成了,就可以把dev合并到master上。直接把master指向dev的当前提交,就完成了合并
合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后就剩下了一条master分支
.ignore插件的使用
IDEA在提交项目到本地仓库的时候,会把.idea
文件夹中的内容也提交上去,这里面放的是一些项目的配置信息,包括历史记录,版本控制信息等。可以不传到Git上面去。有时候会造成一些奇奇怪怪的小问题。这个时候就需要编写.gitignore
文件来忽略提交这些文件,不过有的小伙伴又嫌每次编写配置文件太麻烦,使用这个插件就可以免去编写的麻烦(懒人专用)
最后点击Generate生成
也可右键在单文件添加
常用Git命令
配置用户名和邮箱
$ git --version # 查看git的版本信息
$ git config --global user.name # 获取当前登录的用户
$ git config --global user.email # 获取当前登录用户的邮箱
登录Git
# 如果刚没有获取到用户配置,则只能拉取代码,不能修改 要是使用git,你要告诉git是谁在使用
$ git config --global user.name 'userName'
# 设置git账户,userName为你的git账号,
$ git config --global user.email 'email'
# 获取Git配置信息,执行以下命令:
$ git config –list
配置https和ssh推送时保存用户名和密码
# https提交保存用户名和密码
$ git config --global credential.helper store
# 生成公钥私钥,将公钥配置到GitHub,ssh提交就可以免输入用户名密码
# 三次回车即可生成 ssh key
$ ssh-keygen -t rsa
# 查看已生成的公钥
$ cat ~/.ssh/id_rsa.pub
提交代码
#将项目克隆到本地
git clone [url]
#将所有项目添加到暂存区
git add .
#将单个文件提交到暂存区
git add 文件名
#将所有文件提交到本地仓库
git commit
#提交单个
git commit 文件名
#新建分支
git branch <name> bugFix
#切换到该分支
gir checkout <name>
#在不切换分支的情况下将文件提交到其他分支上
git checkout bugFix;git commit
#merge合并就是将另外一个分支的所有内容都合并到一个分支上
#合并新建分支内容到主分支(master)上
git merge bugFix
#将主分支合并到其他分支上
git checkout bugFix;git merge master
#rebase也是合并,但是更像是复制,他将一个分支上的内容复制到另外一个分支下,两个就变成了并行开发
#合并到主分支下
git rebase master
#切换到主分支,然后合并. 这时候两个分支就变为了一个
git rebase bugFix
#将本地仓库中的远程分支更新成了远程仓库相应分支最新的状态,但是它并不会改变你本地仓库的状态。它不会更新你的 master 分支,它可能已经将进行这一操作所需的所有数据都下载了下来,但是并没有修改你本地的文件
git fetch
#当远程分支中有新的提交时,你可以像合并本地分支那样来合并远程分支
git rebase o/master
git merge o/master
#由于先抓取更新再合并到本地分支这个流程很常用
git pull
#提交到远程仓库
git push
#在项目中你在前一天将远程仓库上的项目都拷贝下来进行开发,到了周末想要提交代码的时候发现,有人对远程仓库的分支内容进行了改动,在svn中如果提交就会造成冲突,但是在git中他会默认不允许你将代码提交到远程仓库,你需要将远程的先pull下来,然后进行合并,在提交到远程仓库
git pull --rebase;git push