上云管理之Git/GitHub/GitLab 详解(一)
- 引言
- 1. GIT软件安装
- 2.初始化配置与提交代码
- 2.1. 初始化配置
- 2.2 本地仓库代码提交
- 2.2.1 初始化仓库并提交代码
- 2.2.2 再次提交已修改的代码
- 2.2.3 文件夹层次结构代码提交
- 2.3 GIT 的文件状态
- 3.GIT 分支
- 3.1. 分支的切换与删除
- 3.2 合并分支
- 3.2.1 Fast forward 合并
- 3.2.2 3 way merge 合并
- 3.2.2 3 way merge with conflict 合并
- 3.2.2 4 rebase 合并
引言
Git是一个开源的分布式版本控制系统,可以有效、高速的处理从很小到非常大的项目版本管理。本课程主要包含Git的基础知识和GitHub、GItLab的使用,课程涵盖Git底层原理,通过详细的讲解两款产品的特性。
Git是一个开源的分布式版本控制系统,由Linus Torvalds开发。Git是当前世界上最流行的版本控制系统之一,被广泛用于软件开发过程中的源代码管理。
特点
-
分布式架构:Git的每个开发者都拥有完整的代码仓库副本,包括标签、分支和标签。
-
非线性开发:支持快速切换分支,方便开发者并行开发。
-
离线提交:支持离线提交和合并,不需要持续联网。
-
灵活的工作流:支持多种工作流,可以灵活地管理开发流程。
-
离线合并:可以离线合并分支,然后一次性合并到主分支。
-
轻量级:Git是轻量级的,易于学习和使用。
-
可扩展性:Git有许多插件和工具支持,可以扩展其功能。
基本概念 -
仓库(epository):Git仓库是Git用来管理项目的地方,包含所有的文件和历史记录。
-
分支(ranch):分支是Git中开发线,可以创建多个分支并行开发。
-
提交(ommit):提交是将更改保存到仓库。
-
合并(erge):合并两个或多个分支的更改。
-
标签(ag):标签是给特定的提交打上标记,通常用于版本发布版本。
-
远程仓库(emote):远程仓库是托管在服务器上的仓库,可以与其他人共享和协作。
基本操作
- 初始化仓库:
git init
创建新的Git仓库。 - 添加文件:
git add
添加文件到暂存区。 - 提交更改:
git commit
提交暂存区的更改。 - 查看状态:
git status
查看当前仓库状态。 - 查看历史:
git log
查看提交历史记录。 - 检出文件:
git checkout
检出文件到工作区。 - 创建分支:
git branch
创建新分支。 - 切换分支:
git checkout
切换分支。 - 合并分支:
git merge
合并分支。 - 删除分支:
git branch -d
删除分支。 - 克隆仓库:
git clone
克隆远程仓库到本地。 - 推送更改:
git push
推送更改到远程仓库。 - 拉取更改:
git pull
拉取远程仓库的更改。
工作流程
- 创建仓库:
git init
或git clone
。 - 开发新功能:创建新分支并开发。
- 提交更改:
git add
和git commit
。 - 合并分支:
git merge
合并分支。 - 推送更改:
git push
推送到远程仓库。 - 拉取更改:
git pull
拉取远程更改。 - 解决冲突:合并时解决冲突。
- 删除分支:
git branch -d
删除分支。
Git是现代软件开发中不可或缺的工具,它提供了强大的版本控制功能,使得团队协作和代码管理变得容易。通过Git,开发者可以高效地管理代码,跟踪更改,并与团队成员共享和协作。
1. GIT软件安装
点击链接 git下载地址
点击下载 代码编辑器vscode下载地址
新建立一个文件夹git_test,在windows 自带的powershell 中打开vscode;
PS D:\> cd git_test
PS D:\git_test> code .
在扩展区安装git插件,安装git的两个插件,如果搜索不到则更新vscode至最新版;
2.初始化配置与提交代码
2.1. 初始化配置
在使用Git进行版本控制之前,通常需要配置用户信息,以便在提交时能够正确地记录更改的作者。配置用户信息可以通过以下命令完成:
git config --global user.name "Your Name"
git config --global user.email "your.email@example.com"
这里的Your Name
和your.email@example.com
应该替换为实际的用户姓名和电子邮件地址。配置这些信息后,每次提交(commit)都会使用这些信息。
-
配置用户名:
使用user.name
配置项来配置用户名,这个名称将显示在提交历史中。git config --global user.name "John Doe"
-
配置用户邮箱:
使用user.email
配置项来配置用户的电子邮件地址,这个地址将用于提交历史中识别提交者。git config --global user.email "john.doe@example.com"
-
全局配置:
使用--global
选项来配置全局配置,这意味着配置将应用于当前用户在所有Git仓库。 -
应用范围:
- 全局配置:配置影响当前用户在所有Git仓库。
- 本地配置:只影响当前仓库。
-
修改配置:
如果需要修改已经配置的用户信息,可以使用以下命令:git config --global user.name "New Name" git config --global user.email "new.email@example.com"
-
查看配置:
查看当前配置的信息,可以使用以下命令:git config --global --list
-
删除配置:
如果需要删除某个配置项,可以使用以下命令:git config --global --unset user.name git config --global --unset user.email
-
配置文件:
Git的配置信息存储在用户主目录下的.gitconfig
文件中。
2.2 本地仓库代码提交
2.2.1 初始化仓库并提交代码
- 初始化仓库,之后本地仓库中会生成.git 文件
2. 新建一个hello.txt 文件,并交由git管理,git 只存储文件的内容,不存储文件名,git会根据内容存储一个对象,对应的内容通过hash算法计算出一个hash值存储;
echo "hello">hello.txt
git add hello.txt
tree .git 查看结构
git status 查看git状态
文件的名字在index目录下,可以通过以下函数查看
git ls-files -s 查看索引区的文件名
git cat-file -t 06oed3;查看对象的类型
git cat-file -p 06oed3;查看对象的内容
3.提交代码至代码仓库,将索引库的代码提交至代码仓库
git commit -m "lst commt";第一条记录进行提交
提交后会生成一个commit的对象,commit对象中的内容是tree对象已经相关提交者的信息,tree对象的内容是git add 的文件;
2.2.2 再次提交已修改的代码
假如实际需要修改已经commit的对象,使用vim 文件名进行操作 q 保存退出;之后重新提交,新提交的对象与前一次是一个父子关系
2.2.3 文件夹层次结构代码提交
新增文件夹,,新增文件夹不会生成新的待提交的内容,文件夹下有新文件,重新提交,会生成新的版本,三个版本的关系如下:
2.3 GIT 的文件状态
GIT的文件状态在工作区分为:untracked、modified,索引区的状态为staged,代码仓库中的状态为unmodified,这几个状态也可以相互转换。
git rm --cached test.txt;从索引库中直接将add的文件删除
rm -rf test.txt;从工作区中直接将add的文件删除
git restore --staged text.txt ;索引区的代码版本回退到上一个版本;
git restore text.txt 工作区的代码回退到上一个版本;
3.GIT 分支
在Git中,分支(Branch)是一种允许开发者在开发新功能时,可以创建一个独立的开发线。分支,使得开发者可以并行开发不同的功能,而不会影响到主分支(通常是master或main)。
3.1. 分支的切换与删除
.git文件中的HEAD可以理解为是一个指针,它总是指向当前的工作分支和版本,可以使用cat .git/HEAD查看, 它里面报错了一个目录地址:例如:refs/heads/master,通过cat .git/refs/heads/master, 可以查看当前目录地址下的内容以及对应对象的类型。
GIT分支有相关的命令可以查看、创建等分支。
git branch 可以查看分支
* master
git log --oneline --decorate HEAD 查看当前HEAD指向的提交:
d06dee4 (HEAD -> master) lst commit
git branch branch_name 新建立分支
git branch -D branch_name 删除分支,必须在工作分支删除另外一个分支,强制删除;
git branch -d branch_name 删除分支前检查是否进行过合并,以防止删除未合并的分支;
git checkout branch_name 切换分支
git checkout -b new-branch-name 新建分支并切换到该分支
git checkout commit_name;git checkout -b branch_name;切换到特定commit对象上,新创建分支进行操作,可以恢复删除分支之后的动作;
git checkout hello.txt 索引区的文件会回退到工作区的内容
git branch -m <old_name><new_name> 为branch改名字;
git diff 工作区与索引区的区别
git diff --cached 索引区与代码仓库的区别
注意:分支删除后,在分支上提交的特定对象不会被删除,也就是在索引库中的对象不会被删除,这些对象称为垃圾对象。
3.2 合并分支
实际开发中是创建分支,修改代码后合并到master主分支,然后再通过master部署代码,方便分布式开发过程中,多人协同作业.
下载git图形化界面工具sourcetree
3.2.1 Fast forward 合并
通过HEAD的移动来完成branch 的合并,fast forward是最简单的分支合并,它的前提是假设合并前没有人曾经修改过master 的代码,以下为fast forward合并例子:
git checkout -b bugfit; 新建立分支
echo 'test'>test2.txt;新建立文件
git add test2.txt;
git commit test2.txt;此时已经提交待代码仓库,当前的分支为bugfit
git checkout master;切换到主分支
git merge bugfit;合并分支
git reset ORIG_HEAD;回退合并分支
3.2.2 3 way merge 合并
正常协同开发的时候,不同的开发都拿到的是master的代码分支,修改代码后各个开发的分支为C3,C4,
, 这2个分支都是基于master的修改,假如C3在C4之前进行合并,那么C3合并的时候,代码就会发生差异,3 way merge 通过新生成一个commit,来达到合并的目的,如果C3和C4是修改的同一个文件,就需要借助人为来合并,到底取舍那一个。
3.2.2 3 way merge with conflict 合并
C3和C4是修改的同一个文件,就需要借助人为来合并,到底取舍那一个,t通过一下示例进行说明
ls
echo 'test'>test.txt
git add test.txt;
git commit -m '1th commit';在master上新建立的文件修改
git checkout -b bugfit;
vim test.txt;编辑该文件增加内容
add from bugfit;
git add test.txt;
git commit -m '2th commit';在 bugfit 上新建文件并提交
git checkout master;切换到master分支
vim test.txt;
add form master;
git add test.txt;
git commit -m '3th commit';
git merge bugfit;合并分支
系统会提示冲突,需要人为手工修改冲突
修改之后再提交
git add test.txt
git commit;
3.2.2 4 rebase 合并
rebase,字面上的意思是“基地重建”,在 Git 中,它指的是将一系列提交转移到另一个基准之上。与合并(merge)不同,rebase 在整合多个分支的修改时,会创建新的提交历史