Git学习
文档:https://git-scm.com/book/zh/v2
版本控制
关于版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。 在所展示的例子中,我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制。
如果你是位图形或网页设计师,可能会需要保存某一幅图片或页面布局文件的所有修订版本(这或许是你非常渴望拥有的功能),采用版本控制系统(VCS)是个明智的选择。 有了它你就可以将选定的文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态,你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。 使用版本控制系统通常还意味着,就算你乱来一气把整个项目中的文件改的改删的删,你也照样可以轻松恢复到原先的样子。 但额外增加的工作量却微乎其微。
本地版本控制系统
许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。
为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异。
记录文件每次的更新,可以对每一个版本做一个快照,或者是记录补丁文件,适合个人使用,如RCS
Figure 1. 本地版本控制.
其中最流行的一种叫做 RCS,现今许多计算机系统上都还看得到它的踪影。 RCS 的工作原理是在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。
集中化的版本控制系统
接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。 这类系统,诸如 CVS、Subversion (SVN) 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 多年以来,这已成为版本控制系统的标准做法。
Figure 2. 集中化的版本控制.
这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。 这么做最显而易见的缺点是中央服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。
分布式版本控制系统
于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份。
Figure 3. 分布式版本控制.
更进一步,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的。
安装以及配置环境变量
打开[git官网] https:/lgit-scm.com/下载git对应操作系统的版本。
所有东西下载慢的话就可以去找镜像!
官网下载太慢,我们可以使用淘宝镜像下载:http://npm.taobao.org/mirrors/git-for-windows/
安装一直下一步即可
安装完成后会有开始菜单栏会有一个Git文件,里面有三个程序(任意位置鼠标右击也可看到)
-
Git Bash :Unix与Linux风格的命令行,使用最多,推荐最多
-
Git CMD :Windows风格的命令行
-
Git GUI:图形界面的Git,不建议初学者使用,尽量先熟悉常用命令
基本命令行使用(Linux)
- cd:改变目录。
- cd … :回退到上一个目录,直接cd进入默认目录
- pwd :显示当前所在的目录路径。
- ls(ll):都是列出当前目录中的所有文件,只不过ll(两个小写L)列出的内容更为详细。
- touch :新建一个文件如 touch index.js 就会在当前目录下新建一个index.js文件。
- rm:删除一个文件, rm index.js 就会把index.js文件删除。
- mkdir:新建一个目录,就是新建一个文件夹。
- rm -r:删除一个文件夹, rm -r src删除src目录
- mv:移动文件, mv index.html src ,index.html是我们要移动的文件, src是目标文件夹,当然,这样写;A夹在同一目录下。
- reset:重新初始化终端/清屏。
- clear:清屏。
- history:查看命令历史。
- help:帮助。
- exit:退出。
- #:表示注释
Git环境配置
所有的配置文件,其实都保存在本地!
查看配置: git cofig -l
查看不同级别的配置文件:
- 查看系统config : git config --system --list
- 查看当前用户(global)配置 : git config --global --list
Git相关的配置文件:
- E:\git\Git\etc : Git安装目录下的gitconfig --system系统级
- C:\Users\Administrator.gitconfig 只适用于当前登录用户的配置 --global全局 (注意:只有写了global配置行才有)
这里可以直接编辑配置文件,通过命令设置后会响应到这里。
设置用户名和邮箱(用户标识,必要)
必要性:因为每次Git提交都会时使用该信息嵌入到你的提交中
git config --global user.name "wangping" #名称
git congfig --global user.email 990587904@qq.com #邮箱
git config --global --list 检查
注:环境变量在安装时就自动给我们配置了,因此在任意位置都可以使用
Git基本理论(核心)
工作区域
Git本地有三个工作区域∶工作目录( Working Directory )、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果在加上远程的git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下∶
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fkR5s6Q0-1636206736492)(C:/Users/wp990/AppData/Roaming/Typora/typora-user-images/image-20211104205758760.png)]
Working Directory <-------> Stage/Index 正操作: git add files 反操作:git checkout
Stage/Index <-------> Repository/Git Directory 正操作: git commit 反操作:git reset
Repository/Git Directory <-------> Remote Directory 正操作: git push 反操作:git pull
- Workspace :工作区,就是你平时存放项目代码的地方
- Index / Stage:暂存区,用于临时存放你的改动,事实上它只是一个文件,保存即将提交到文件列表信息
- Repository:仓库区(或本地仓库),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本
- Remote :远程仓库,托管代码的服务器,可以简单的认为是你项目组中的一台电脑用于远程数据交换
工作流程
git的工作流程一般是这样的:
- 在工作目录中添加、修改文件; UserMapper.xml
- 将需要进行版本管理的文件放入暂存区域; git add
- 将暂存区域的文件提交到git仓库。 git commit
- 推送到远程 git push
- 因此,git管理的文件有三种状态︰已修改( modified ) ,已暂存( staged ) ,已提交(committed)
Git项目搭建
创建工作目录与常用指令
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S8qrihTw-1636206736494)(C:/Users/wp990/AppData/Roaming/Typora/typora-user-images/image-20211104211813500.png)]
本地仓库搭建
创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。
创建全新的仓库
-
创建全新的仓库,需要用GIT管理的项目的根目录执行︰
#在当前目录新建一个Git代码库 s git init
-
执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录里面。
注:该文件是一个隐藏文件,需要打开显示隐藏文件设置
克隆远程仓库
1、另一种方式是克隆远程目录,由于是将远程服务器上的仓库完全镜像一份至本地!
#克隆一个项目和它的整个代码历史(版本信息)
git clone [url]
2、去 gitee或者github上克隆一个测试!
GIT文件操作
文件4种状态
版本控制就是对文件的版本控制,要对文件进行修改、提交等操作,首先要知道文件当前在什么状态,不然可能会提交了现在还不想提交的文件,或者要提交的文件没提交上。
- 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
查看文件
上面说的文件有四种状态,通过如下命令查看到文件的状态:
#查看指定文件状态
git status [filename]
#查看所有文件状态
git status
#git add 文件 添加指定文件
#git add . 添加所有文件到暂存区
#git commit -m "消息内容" 提交暂存区中的内容到本地仓库 -m 提交信息
忽略文件
有些时候我们不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等在主目录下建立".gitigpore"文件,此文件有如下规则∶
- 忽略文件中的空行或以井号(#)开始的行将会被忽略。
- 可以使用Linux通配符。例如:星号 (*) 代表任意多个字符,问号 (?) 代表一个字符,方括号 ( [abc] ) 代表可选字符流,大括号 ( {string1,string2.…} ) 代表可选的字符串等。
- 如果名称的最前面有一个感叹号 ( ! ) ,表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符( / ),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
- 如果名称的最后面是一个路径分隔符 ( / ) ,表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽#为注释
#为注释
*.txt #忽略所有 .txt 结尾的文件,这样的话上传就不会被选中
!lib.txt #除lib.txt文件,都不被检查
/temp #仅忽略项目根目录下的TODO文件,不包括其它目录temp 向上忽略
build/ #忽略build/目录下的所有文件 向下忽略
doc/*.txt #会忽略doc/notes.txt但不包括 doc/server/arch.txt
如下一个idea项目的 .gitigpore 文件
*.class
*.log
*.lock
# Package Files #
*.jar
*.war
*.ear
target/
# idea
.idea/
*.iml
*velocity.log*
### STS ###
.apt_generated
.factorypath
.springBeans
### IntelliJ IDEA ###
*.iml
*.ipr
*.iws
.idea
### STS ###
.apt_ generated
.factorypath
.springBeans
### IntelliJ IDEA ###
*.iml
*.ipr
*.iws
.idea
.classpath
.project
.settings/|
bin/
*.log
tmp/
#rebel
*rebel.xml*
使用码云
github 是有墙的,比较慢,在国内使用gitee,公司中有时候会搭建自己的gitlab服务器
- 注册登录码云,完善个人信息
- 设置本机绑定SSH公钥,实现免密码登录(免密码登录,这一步挺重要的,码云是远程仓库,我们是平时工作在本地仓库!)
#生成公钥
ssh-keygen -t rsa
git命令生成RSA公钥密码(生成的目录是C:\Users\wp990.ssh),并复制公钥密码的文本在gitee公钥框中并确定
- 将公钥信息pulic key添加到码云账号即可
- 使用码云创建一个自己仓库!(用户头像信息傍边)
许可证:开源是否可以随意转载,开源但是不能商用,不能转载
- 克隆到本地
IDEA中集成Git
-
新建项目,绑定git
- 将我们远程的git项目目录拷贝到项目中即可
- 注意idea的变化
-
修改文件,使用IDEA操作git
- 添加到暂存区
- commit提交
- push到远程仓库
-
提交测试
Git分支
#新建一个分支,但是依然停留在当前的分支
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]
多个分支如果并行执行,就会导致我们的代码不冲突,也就是同时存在多个版本!
如果同一个文件在合并分支时被修改了则会引起冲突;解决办法是我们可以修改文件后重新提交!选择
要保留谁的代码
master主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,工作一般在新建的dev分支上工作,工作后,比如要发布,或者说dev分支代码稳定后可以合并到主分支master上来
anch]
#合并指定分支到当前分支
git merge [branch]
#删除分支
git branch -d [branch-name]
#删除远程分支
git push origin --delete [branch-name]
git branch -dr [remote/branch]
多个分支如果并行执行,就会导致我们的代码不冲突,也就是同时存在多个版本!
如果同一个文件在合并分支时被修改了则会引起冲突;解决办法是我们可以修改文件后重新提交!选择
要保留谁的代码
master主分支应该非常稳定,用来发布新版本,一般情况下不允许在上面工作,工作一般在新建的dev分支上工作,工作后,比如要发布,或者说dev分支代码稳定后可以合并到主分支master上来