Git学习

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)

  1. cd:改变目录。
  2. cd … :回退到上一个目录,直接cd进入默认目录
  3. pwd :显示当前所在的目录路径。
  4. ls(ll):都是列出当前目录中的所有文件,只不过ll(两个小写L)列出的内容更为详细。
  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是目标文件夹,当然,这样写;A夹在同一目录下。
  10. reset:重新初始化终端/清屏。
  11. clear:清屏。
  12. history:查看命令历史。
  13. help:帮助。
  14. exit:退出。
  15. #:表示注释

Git环境配置

所有的配置文件,其实都保存在本地!

查看配置: git cofig -l

查看不同级别的配置文件:

  • 查看系统config : git config --system --list
  • 查看当前用户(global)配置 : git config --global --list

Git相关的配置文件:

  1. E:\git\Git\etc : Git安装目录下的gitconfig --system系统级
  2. 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)]

本地仓库搭建

创建本地仓库的方法有两种:一种是创建全新的仓库,另一种是克隆远程仓库。

创建全新的仓库

  1. 创建全新的仓库,需要用GIT管理的项目的根目录执行︰

    #在当前目录新建一个Git代码库
    s git init
    
  2. 执行后可以看到,仅仅在项目目录多出了一个.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"文件,此文件有如下规则∶

  1. 忽略文件中的空行或以井号(#)开始的行将会被忽略。
  2. 可以使用Linux通配符。例如:星号 (*) 代表任意多个字符,问号 (?) 代表一个字符,方括号 ( [abc] ) 代表可选字符流,大括号 ( {string1,string2.…} ) 代表可选的字符串等。
  3. 如果名称的最前面有一个感叹号 ( ! ) ,表示例外规则,将不被忽略。
  4. 如果名称的最前面是一个路径分隔符( / ),表示要忽略的文件在此目录下,而子目录中的文件不忽略。
  5. 如果名称的最后面是一个路径分隔符 ( / ) ,表示要忽略的是此目录下该名称的子目录,而非文件(默认文件或目录都忽#为注释
#为注释
*.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服务器

  1. 注册登录码云,完善个人信息
  2. 设置本机绑定SSH公钥,实现免密码登录(免密码登录,这一步挺重要的,码云是远程仓库,我们是平时工作在本地仓库!)
#生成公钥
ssh-keygen -t rsa

git命令生成RSA公钥密码(生成的目录是C:\Users\wp990.ssh),并复制公钥密码的文本在gitee公钥框中并确定

  1. 将公钥信息pulic key添加到码云账号即可
  2. 使用码云创建一个自己仓库!(用户头像信息傍边)

许可证:开源是否可以随意转载,开源但是不能商用,不能转载

  1. 克隆到本地

IDEA中集成Git

  1. 新建项目,绑定git

    • 将我们远程的git项目目录拷贝到项目中即可
    • 注意idea的变化
  2. 修改文件,使用IDEA操作git

    • 添加到暂存区
    • commit提交
    • push到远程仓库
  3. 提交测试

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上来



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值