Git:
1.学习目标
2.3.分布式版本控制系统
为了解决集中化版本管理所带来的问题分布式版本管理控制系统(Distributed Version Control System,简称 DVCS)就应运而生了. 在这类系统中,像 Git,Mercurial,Bazaar 以及 Darcs 等, 客户端不只是提取出最新版的文件快照, 而是把最原始的代码仓库镜像到本地. 这样一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
4.理解Git文件的三种状态与工作模式
使用Git 操作文件时,文件的状态有以下三种:
针对Git 文件的三种状态,这里需要了解Git项目的三个工作区域:工作区、暂存区和Git仓库。
基本的Git 工作流程描述如下:
在工作区中修改某些文件。
对修改后的文件进行快照,然后添加到暂存区。
提交更新,将保存在暂存区域的文件快照永久转储到 Git 仓库中。
5. 创建版本库并提交文件
版本库又名仓库,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。理解了Git 文件状态与三种工作区域之后,通过一个例子来体验Git对于文件的基本操作。
1.初始化git 本地仓库
通过执行 git init 命令在本地初始化一个本地仓库,执行该命令后会在本地初始化一个没有任何文件的空仓库。
2.执行 git add 命令添加文件到暂存区
git add path 通常是通过git add path的形式把path添加到索引库中,path可以是文件也可以是目录。
git不仅能判断出path中,修改(不包括已删除)的文件,还能判断出新添的文件,并把它们的信息添加到索引库 中。
3.git status:
git status 命令用于显示工作目录和暂存区的状态。使用此命令能看到那些修改被暂存到了, 哪些没有, 哪些文件没有被Git tracked到。
4.git commit:
git commit 命令用于将更改记录(提交)到存储库。将索引的当前内容与描述更改的用户和日志消息一起存储在新 的提交中。通常在执行提交时 在 git commit 命令后跟上 -m 属性 加入本次提交的记录说明 方便后续查看提 交或改动记录。
5.git log:
git log 命令用于显示提交日志信息。 (比较常用,后续讲到时光穿梭时会经常使用该命令)。
6. 时光穿梭机
企业中在多人的项目开发环境下,使用Git 版本控制工具对项目版本进行管理时,通常会对项目不同版本的文件进行查看,项目历史版本,未来版本的切换操作,对于一个项目开发人员,此时对于Git 的这些基本命令操作就成为了一项基本技能。
1.git commit -am “提交信息”:
git commit -am “提交信息”,不需要add,直接提交已经追踪过的文件,在暂存中,在工作区进行了修改的。
2.git diff HEAD – git01.txt :
diff --git a/git01.txt b/git01.txt
index b7459a3..6f08525 100644
--- a/git01.txt //改变前文件
+++ b/git01.txt //改变后文件
@@ -2,4 +2,6 @@ //减号表示第一个文件,"2"表示第2行,"4"表示连续4行。同样的,"+2,6"表示变动后,成为 第二个文件从第2行开始的连续6行。
3.git restore file名:
在git add之后,修改该文件的内容,使用git restore能够撤回对该文件的修改。对工作区的内容有效。
4.git reset HEAD 文件
当发现因失误而将文件添加到暂存区时,git 支持文件的撤销操作 执行命令 git reset HEAD 文件。
5.git restore --staged:
git restore --staged的作用是将暂存区的文件从暂存区撤出,但不会更改文件的内容
6.2. 版本回退
当文件修改后被提交的次数很多时,对于版本库中存放的文件就会出现不同的版本,在多人开发的项目环境中,通常会对不同版本文件进行查看甚至回退的情况(比如某些游戏中所提供的状态保存功能,能够在某一时刻保存整个游戏场景状态以方便后续继续在该状态下进行游戏进行而不是从头开始),值得庆幸的是 Git 也提供了同样的功能,能够让开发者在不同版本的项目中进行切换,达到时空穿梭自如的目的!
暂存区与工作目录都会发生相应的回退
对于历史版本的查看 使用 git log 命令:
git log:命令用于显示提交日志信息
列表显示的结果按提交时间倒叙排序,其中第一条中 HEAD -> master 代表当前指针指向Git 版本库中master 主干分支,每次提交 Git 内部均会生成一个唯一的SHA 算法构建的字符串来唯一标识当前版本此时如果想要执行版本版本回退操作使用命令 git reset。
git reset 命令用于将当前HEAD复位到指定状态。一般用于撤消之前的一些操作(如:git add,git commit 等)。
回滚前在执行两次提交操作 方便文件不同版本间的切换
当然,如果提交历史记录较多 可以加入数字控制显示的版本记录数 并且使用 --pretty=oneline 简化输出
git log --pretty=oneline或者 git log -3 --pretty=oneline显示最近三次提交
1.回退到上一版本
执行 git reset --hard HEAD^
其他情况:
HEAD^:将指针指向上一个版本,如果是上上一个就是 HEAD^^,上上上一个HEAD^^^,但这样记就比较麻烦, 如果回退版本较多,简写为 HEAD~100 往前回退100个版本 ~后跟数字即可。
**回到指定的版本:**可以是之后的也可以是之前的。
首先使用git log找到版本的唯一标识,只需要前6位即可
$ git reset --hard 262c02
但是git log只能找到历史的版本,找不到未来的
git reflog命令:
可以找到全部的提交信息:
用来记录用户操作的每一次命令
6.3. 文件删除
在Git中,删除文件同样是一个修改操作,即在Git世界中,Git仅仅关注文件是否被修改(文件添加,更新,删除)
1.直接在工作目录中进行删除:
如果此时发现文件是被误删除呢,不用担心,这里可以将误删除的文件重新从版本库中检出,执行命令:
git checkout – 文件名
如果确定是要执行删除操作 执行git rm ‘文件’ 命令即可
会同时删除git仓库和工作区所选中的文件
7. 远程仓库
Git是一个分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。截止目前,并没有看到分布式的环境,因为以上的操作都在在本地发生的,对于Git,除了前面提到的本地版本库外,Git 支持远程仓库的托管服务即使用者可以将本地版本库中的文件托管到远程服务器进行存储,这样就极大的方便开发,无论你走到哪,只要你的机器能够联网,就可以通过远程的仓库地址得到一份相同的项目库文件,并且下载到本地的文件版本记录与远程文件版本保持一致,并且可以很方便的实现多人协同开发操作。
对于Git 远程仓库,GitHub( https://github.com/ )是比较知名的一个,目前已被微软收购,而国内比较知名的当属码云( https://gitee.com/ )了,当然除了这些远程仓库外,在公司,有的公司处于安全考虑,可能会自己搭建一套Git服务区来自Git的远程仓库,对于内部仓库会有专门人员来进行维护操作。这里以当下比较流行的GitHub仓库来介绍Git 远程仓库基本操作与使用。
7.1. 克隆远程项目到本地
初次接触GitHub的话,在没有账号的情况下,也可以很容易得到一些比较好的开源项目,即通过克隆的方式将远程项目下载到本地 比如现在java12 都已经发布,想要找一些java12 相关的项目入门,这里就可以借助GitHub来发现你想要的相关项目。
1.使用 git clone HTTPS或者SSH的地址。
在本地磁盘指定目录下右键 git bash here 操作
2.直接下载Download ZIP
7.2. 将本地库推送到远程
创建本地版本库并提交文件到本地库(这里以前面创建版本库为主,这里不再赘述)
使用GitHub创建远程个人仓库
http形式:
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/XiaoHai001/git01.git
git push -u origin main
SSH形式:(推荐使用)时间上与响应上效率都更高
需要配置公钥
-
使用本地Git客户端生成SSH公钥与私钥 执行命令 ssh-keygen -t rsa -C “GitHub账户邮箱”
然后去放公钥的文件中复制,放入github公钥配置的key中,然后生成公钥。
-
检查测试链接 执行命令 ssh -T git@github.com
-
使用SSH执行远程推送操作
git init git add README.md git commit -m "first commit" git branch -M main git remote add origin git@github.com:XiaoHai001/git02.git git push -u origin main
8. Git 分支操作
开发企业项目中在使用Git 或者其他类似版本控制软件对项目版本进行管理时,多人合作的项目在开发时通常不会直接在主干master 上进行操作,而是重新开辟新的分支,在新的分支上进行开发 调试 等操作,当项目调试通过时才会将分支项目的代码合并到主干中,这是在实战中比较好的一种策略,特别是多人协同开发一个项目的情况下尤其明显。Git 对于分支操作提供了一下基本命令:
8.1. 本地分支创建、合并、重命名与删除
1.创建本地分支、并查看分支
git checkout -b new_branch
默认Git 版本库所在分支为main 通常称为项目的主干,开发中通常会在主干上创建新的分支类进行本地开发工作 使用命令 git checkout -b new_branch 创建分支.
git checkout -b dev
1.1.分支创建完毕 该命令会自动切换到新建分支上
1.2.使用命令 git branch 查看分支列表 * 号标记为当前git 所在分支
git branch
1.3.分支上添加文件dev01.txt 添加操作同主干添加命令
git add
1.4.切换到主干main 并执行合并操作
git checkout main
git merge dev
1.5.重命名分支dev->dev2
先进入分支dev:
git checkout dev
修改名称:
git branch -m dev dev2
1.6.删除分支(不能再待删除的分支上执行删除当前分支操作!!!)
git branch -d dev2
8.2. 分支Push与Pull操作
相关命令操作
8.3. 分支操作冲突出现与解决
开发中对不同分支下同一文件进行修改后执行合并时就会出现文件修改冲突情况,这里说明一种比较常见的冲突问题 以master 和leaf01 两个分支进行演示说明。
8.3.1. 本地分支操作冲突
在某分支上修改了某个文件,并提交到git仓库,然后切到主干上也对该文件进行了修改,并提交,然后进行合并分支时就会发生冲突。
cat ‘文件’ 能够查看文件,然后可以在工作区对它进行要想的整合方式,并提交。
8.3.2. 多人协同操作冲突
拉取远程库dev 并在本地创建dev开发库,执行命令 git checkout -b dev origin/dev 这里以同台机器不同窗口来模拟两个用户操作同一分支同一文件(实际开发时多人操作统一文件冲突情况比较常见)
多个人从远程仓库拉取文件,当修改了同一文件并推送到远程仓库就会发生冲突。
所以在每次提交前在拉取一下,看下有哪些冲突文件,然后进行修改再去推送。
这里两个客户端以c1与c2来描述
c1 客户端本地修改dev 分支git01.txt 文件并在本地执行提交操作
执行远程推送 将本地C1客户端提交的git01.txt 推送到远程dev分支
而此时C2 客户端在本地同样修改了dev分支git01.txt 文件并在本地执行提交
执行推送操作 此时冲突出现 原因是另外一个用户推送的文件与当前客户端推送内容存在冲突
此时解决方式Git 已有对应提示 Push 之前先执行Pull 操作 将远程文件拉取到本地 解决完冲突后再次执行Push 操作
冲突解决
先执行Pull 拉取操作
查看冲突文件内容
这里在本地先处理冲突 将文本进行合并 然后提交 在 push 操作即可
9. 标签管理
标签操作基本命令 git tag
10. Idea下Git基本操作
10.1. 环境集成配置
全局setting 下 git 环境指定
10.2. 克隆远程仓库到本地
10.3. Idea 下分支拉取与远程推送
10.3.1. 分支拉取
默认情况下,使用Idea检出远程仓库master文件到本地,这里点在idea中可以方便查看(与使用命令方式一致)
10.4. ignore插件集成
前面讲到dev 分支拉取与文件修改推送操作,遇到一个小的问题-在修改完git01.txt 文件后添加文件到暂存区后会将idea 本地环境相关配置文件一并提交,而这些文件没有必要提交 如果提交对于另外一方更新到本地后反而会影响项目运行 前面解决的方式是借助命令方式将暂存区文件转移到工作区来解决。命令方式虽然能够解决,但操作麻烦,每次提交不可避免会遇到同样问题,这里介绍一个插件- gitignore,使用gitignore 插件可以在执行文件添加前将没有必要提交的文件让git给自动忽略掉这样开发中就只需要关注修改的文件即可。
10.5. 分支操作与冲突处理
10.3.1. 分支拉取
默认情况下,使用Idea检出远程仓库master文件到本地,这里点在idea中可以方便查看(与使用命令方式一致)
10.4. ignore插件集成
前面讲到dev 分支拉取与文件修改推送操作,遇到一个小的问题-在修改完git01.txt 文件后添加文件到暂存区后会将idea 本地环境相关配置文件一并提交,而这些文件没有必要提交 如果提交对于另外一方更新到本地后反而会影响项目运行 前面解决的方式是借助命令方式将暂存区文件转移到工作区来解决。命令方式虽然能够解决,但操作麻烦,每次提交不可避免会遇到同样问题,这里介绍一个插件- gitignore,使用gitignore 插件可以在执行文件添加前将没有必要提交的文件让git给自动忽略掉这样开发中就只需要关注修改的文件即可。
10.5. 分支操作与冲突处理
idea 下对于分支的操作使用起来相比命令操作是比较简单的,开发环境下idea分支操作比较常见。