Git概述
Git是一个免费的,开源,分布式版本控制系统。
Git易于学习,占地小,性能快。性能优于Subversion,CVS等版本控制工具。
Git最突出的特性是分支特性。
版本控制:
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制最重要的是可以记录文件修改历史记录,从而让用户可以查看历史版本,方便切换。
版本控制是从个人过渡到团队协作!所必需的。
集中式版本控制工具
用的最多的是:CVS,SVN,VSS等
他们都有一个单一集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或提交更新。
优点:
- 每个人都可以在一定程度上看到项目中其他人在做什么
- 管理员可以轻松掌握每个开发者的权限
缺点:
- 如果中央服务器损坏,就无法协同工作。
分布式版本控制工具
常用的是:Git,Mercurial等
分布式版本控制工具,每个电脑都有一个本地库,相当于每台电脑都存有全部的版本信息。
可以从远程代码托管库把代码克隆下来进行版本控制,然后再推送上去。
优点
- 服务器断网情况下也可开发(因为版本控制是在本地进行的)
- 每个客户端都有完整的项目(包括项目的历史记录,更加安全)
Git工作机制
Git在本地主要分为三个区域:
-
工作区
存放代码的地方
一般我们创建了Git管理目录后,这个目录就叫工作区。
-
暂存区
用来临时存储的区域
在工作区写了代码后,让git知道我们在其中写了代码。
-
本地库
历史版本记录存储区
一旦代码进入本地库,就会生成历史版本记录!
此时除非把目录删了!要不然记录无法消除!!
工作区---git add--->暂存区--->git commit--->本地库
一般在本地库后,还会推送到远程库中,即代码托管中心。
代码托管中心
代码托管中心就是基于网络服务器的远程代码仓库。
一般根据网络分为:
局域网:
GitLab
互联网:
GitHub(国外)
Gitee码云(国内)
Git安装
- 在Git官网下载安装包。
- 选择安装路径时路径不能有中文!
- 安装选项的解释:
- 剩下的默认下一步即可。
- 安装完后,设置你提交的用户名字,和用户邮箱
安装完git后俩个工具
Git GUI :Git提供的图形化工具
Git Bash:命令行模式的git
安装完Git之后首先要做的事是设置用户名和email地址!因为每次Git提交都会使用该用户信息。
在GitBash中和Linux的命令是通用的!
Git的一些配置
-
添加命令的别名
在Git安装目录下的etc目录中找到bash.bashrc文件
在第22行添加
source ~/.bash_profile
在系统家目录下找到.bash_profile文件
然后添加对应命令的别名即可
添加方式
alias 命令='命令别名'
-
防止Git中文报错的方式
打开GitBash执行
git config --global core.quotepath false
在Git的安装目录下etc目录中 bash.bashrc文件
在最后俩行下添加
export LANG="zh_CN.UTF-8" export LC_ALL="zh_CB.UTF-8"
Git常用命令
设置用户名
git config --global user.name 用户名
设置用户邮箱
git config --global user.email 用户邮箱
这俩个设置可以用户目录下的
.gitconfig文件中查看到
首次安装Git必须设置用户名和用户邮箱不然提交代码会报错
这里的用户签名和登录GitHub账号没有任何关系,只是给本地看的
初始化本地库
git init
要让Git管理目录必须先初始化目录。
在目录内右键启动GitBash后执行命令即可
也可以cd命令跳转过去
当目录生成了 .git这个隐藏目录说明初始化成功了
查看本地库状态
git status
首次查看会出现三行内容
第一行On branch master代表现在所处master分支
第二行 No commits yet代表没有提交过东西
第三行 nothing to commit代表没有东西需要提交
当我们在Git管理的目录中创建了一个文件后再次执行次命令会出现
Untracked files(未被追踪的文件)
红色的hello.txt代表文件虽然有,但并未被git追踪。
添加暂存区
git add 文件名
将未被追踪的文件追踪
或者是将工作区的文件添加进暂存区
可以用通配符
git add .
将所有文件添加到暂存区,这里的所有文件指的是所有未被追踪的文件。
此时执行git status
Changes to be committed代表需要被提交的文件
绿色代表文件被追踪了
删除处于暂存区的文件
git rm --cached 文件
提交到本地库
git commit -m '日志信息' 文件名
将暂存区的文件提交到本地库形成一个记录
如果不加-m
git也会跳出一个文本手动添加提交日志也可
我们可以不加文件名,就默认将处于暂存区的文件全部提交。
注意下:64c40b4是这次提交记录的提交id用来切换版本用的!
此时查看本地库状态
在主干分支
没有东西可提交,工作树很干净。
但是!我们修改了文件之后,再次执行git status命令可发现这个文件没有被添加到暂存区
我们再次git add即可。
git是以行来管理文件的,我们修改了一行他会提示一行新增一行删除。
查看历史版本
查看版本信息
git reflog
前面黄色的字符串是版本号的缩写,用来切换版本用。
(HEAD->master)代表指针指向master分支,同时代表当前所处版本
HEAD@{0}
HEAD@{1}
查看详细的版本信息
git log
一般会加上一堆参数来简化这个信息,同时加上命令的别名简化。
常用选项
--all 显示所有分支
--pretty=online 将提交信息显示未一行
--abbrey-commit 让输出的commitld更加简短
--graph 图形化显示
一般全部加上
切换版本
git reset --hard 版本号
一旦切换版本后再次查看历史版本
出现:reset:moving to 64c40b4
代表指针转移到了第一次提交这个版本。
Git切换版本底层就是移动指针:具体原理如下
初始状态,head指针指向master分支,master分支指向first版本
当出现second版本后,master指针指向second,first指针指向second
Git分支
分支的介绍
在版本控制过程中,同时推进多个任务,为每个任务我们可以创建一个单独的分支。
使用分支意味着,可以把工作从开发主线上分离,开发自己的分支时,不会影响主线分支的运行。
分支的底层也是指针的运用。
分支一般是在给项目添加模块,修复项目bug等情况运用。
分支可以并行推进多个功能的开发,提高效率。
各个分支开发过程中,如果某一个分支开发失败,不会影响其他分支,失败分支删除重新操作即可。
分支的操作
查看分支
查看当前有几个分支
git branch -v
创建分支
git branch 分支名
删除分支(检查,删除)
git branch -d 分支名
不能删除当前所处的分支
删除分支(强制删除)
git branch -D 分支名
切换分支
git checkout 分支名
git checkout -b 分支名
创建分支同时切换到这个分支上
分支合并
git merge 分支
将分支和自己当前分支合并
解决分支合并冲突问题
冲突原因:
俩个分支在同一个文件的同一个位置进行了不同的修改,Git无法替我们决定用那一套必须认为决定。
多个分支对同一个文件,同一行进行了不同的修改。
解决冲突
他会在冲突文件对应冲突的位置用符号比较
<<<<<<< HEAD
当前分区修改的代码块
========
hot-fix分区修改的代码块
> > > > hot-fix
将你要保留的代码留下,将特殊符号删除如 <<<<< HEAD ===== > > > > > > HOT -FIX
修改保存后将其添加进暂存区(因为此时文件没有被追踪)
然后提交进记录即可。
注意要点
比如说现在俩个分支分别是master分支和fix分支
在master分支中创建了hello.txt文件里面内容为hello
提交一次记录
切换到fix分支操作这个文件将内容改成hello world
提交一次记录
此时切换到master分支我们看不到fix分支中已经提交过记录的操作,依然显示为master分支。
比如上述:master分支合并fix分支后,master分支内容改变但!fix分支内容不变。
分支切换图解
假设一开始在master分支上存在
first,second,third,fourth四个版本
然后创建hot-fix分支,修改third版本的内容
此时在hot-fix分支上修改了third版本变成hot-fix版本
此时切换分支就相当于将HEAD指针指向了hot-fix分支实现分支切换。
master、hot-fix其实都是指向具体版本记录的指针
当前所在的分支,由HEAD决定的。
故创建分支的本质是多创建一个指针。
head如果指向master,那么当前就处于master分支上
head如果指向hot-fix,那么当前就处于hot-fix分支上
Git团队协作机制
团队内协作
-
客户端A制作了一个项目1,将他发布到代码托管中心,(git push)
-
客户端B从代码托管中心下载这个项目1(git clone)
-
客户端B修改了这个项目1后将他发布到代码托管中心(git push)
-
客户端A从代码托管中心拉取最新修改版本到自己本地(git pull)
跨团队协作
远程库叫岳不群的是一个团队A的远程库
远程库叫东方不败的是另外一个团队B的远程库
团队A需要团队B的协作修改项目
-
团队B从团队A的远程库中fork他们的项目,作为团队A项目的一个分支。
-
然后从远程库克隆下来这个项目
-
修改完后push到团队B的远程库中
-
团队B再对团队A的远程库发起一个拉去请求(pull requests)
-
在团队A审核后,将团队A的项目作为分支进行合并
-
然后团队A的人将项目从远程库克隆到本地。
在GitHub上创建远程库并与本地建立连接
GitHub在外网,需要进去自己想办法~
-
创建GitHub远程代码库
远程库名最好和本地库名一样。
- 创建好远程库之后会显示
这是俩种连接GitHub远程库的方式
先说明使用https连接远程库
创建远程库别名
因为使用的是HTTPS方式连接远程库,这玩意很长不可能直接打到cmd中
创建别名方便以后代码的推送,拉去
语法
- 查看当前所有远程地址别名
git remote -v
- 创建远程地址别名
git remote add 别名 远程地址
将本地库推送到远程库
语法
git push 别名/地址 分支
在执行的时候会弹出登录界面登录一次
拉取远程库到本地库
更新远程库已经更新的代码
语法
git pull 地址别名/地址 分支
拉去后版本自动更新为远程库的版本
即将本地库和远程库同步
拉去后会和分支直接合并!
git fetch 地址别名/地址 分支
拉去远程库最新版本到本地库
需要用户区考虑需不需要进行分支合并!
git pull=git fetch + git merge
如果这俩个都不加分支就默认全是git clone将全部分支拉去了
克隆远程库到本地
拿来将整个项目复制到本地
语法
git clone 地址
克隆代码是不需要登录账号的,是在你创建的库是公共库的前提下!
克隆会做以下操作
- 拉取代码
- 初始化本地仓库
- 创建别名(地址别名)
设置GitHub的仓库权限
在GitHub中,不是所有人都可以推送代码到我们本地库的。
我们需要指定设置谁可以推送代码到远程库。
设置方法
- 打开我们的GitHub仓库
- 点击Settings
- 在右边栏找到Collaborators
- 点击后添加对应人员
- 之后复制出现的邀请函
- 发送给你添加的对应人员
这个权限是GitHub用户之间的权限
GitHub使用技巧
用户名/仓库名
这样搜索可以精确找到指定用户写的仓库
复制别人Git仓库到自己的仓库
在右上角的fork点击即可
拉取请求(pull request)
当我们从别人的Git项目库fork放到自己本地后
修改后可以点击pull requests请求
然后发送请求给这个项目的主人,实现帮别人修BUG
GitHub的SSH免密登录
在GitHub的项目仓库中有俩种方式对远程库进行连接,上面已经说了HTTPS连接方式了
GitHub的SSH连接仓库方式过程:
-
在我们系统的家目录中右键GitBash窗口打开
-
输入代码创建.ssh文件
ssh-keygen -t rsa -C add_for_git_hub
-t是指定用什么加密算法
rsa 是著名的非对称加密协议
-C 注释内容(不需要加双引号)
输入后连续三下回车
-
此时会在家目录下生成.ssh目录
在这个目录下会生成俩个文件分别是 id_rsa和id_rsa.pub
一个是私钥,一个是公钥
-
打开存放公钥的文件id_rsa.pub,复制里面的内容
-
打开我们的GitHub账号,在账号头像框下拉找到设置按钮打开
-
在右侧找到SSH and GPG keys
-
点击NEW SSH KEY将复制的内容添加进去(名字随意)
-
添加成功后直接使用ssh协议的链接在本地连接即可。
这个代码就是把本机设置为免密登录的机器,这样就不需要push代码到github仓库的时候登录了
在Idea中集成git
配置Git忽略提交文件
-
在家目录下创建一个git.ignore文件
git.ignore文件模板如下
###################### # 解决java产生文件 ###################### *.class # Mobile Tools for Java (J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.ear # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* ###################### # 解决maven产生的文件 ###################### target/ **/target/ pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup pom.xml.next release.properties dependency-reduced-pom.xml buildNumber.properties .mvn/timing.properties ###################### # 解决各类编辑器自动产生的文件 ###################### *.iml ## Directory-based project format: .idea/ # if you remove the above rule, at least ignore the following: # User-specific stuff: # .idea/workspace.xml # .idea/tasks.xml # .idea/dictionaries # Sensitive or high-churn files: # .idea/dataSources.ids # .idea/dataSources.xml # .idea/sqlDataSources.xml # .idea/dynamic.xml # .idea/uiDesigner.xml # Gradle: # .idea/gradle.xml # .idea/libraries # Mongo Explorer plugin: # .idea/mongoSettings.xml ## File-based project format: *.ipr *.iws ## Plugin-specific files: # IntelliJ /out/ /target/ # mpeltonen/sbt-idea plugin .idea_modules/ # JIRA plugin atlassian-ide-plugin.xml # Crashlytics plugin (for Android Studio and IntelliJ) com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties
-
在.gitconfig文件引用他(这个文件也在系统的家目录吧)
[core] excludefile = C:/Users/用户名/git.ignore
在idea定位Git程序
在idea设置-->版本控制--->git
找到Git的安装目录,Git/bin/git.exe
将项目文件加入Git管理
在idea的菜单栏中,找到VSC选项,添加本地仓库即可
此时文件会有颜色变化:
- 红色代表未被追踪
- 绿色代表文件在暂存区
- 蓝色代表文件被修改过,还未被追踪
- 白色代表已经提交了