您现在的位置是:首页 >技术教程 >Git版本控制工具详解网站首页技术教程

Git版本控制工具详解

木公176 2024-08-08 00:01:02
简介Git版本控制工具详解

1 邂逅版本控制工具

2 集中式和分布式区别

3 Git的环境安装搭建

4 Git初始化本地仓库

6 Git远程仓库和验证 目录 content

5 Git记录更新变化过程

7 Git的标签tag用法

8 Git分支的使用过程

9 工作中的Git Flow

10 Git远程分支的管理

11 Git rebase的使用

12 Git常见命令速查表

 

要从本地使用git的话,最好是clone下来的,或者自己在创建的时候,把本地仓库的分支创建成和远程仓库的分支一样的名字,后续pull和push操作才会方便一些。否则就得通过修改本地仓库的上游跟踪来实现pull和push操作,会很麻烦。

不管开发的是什么东西,基本上都可以使用到git,比如c++、java等等开发的时候也可以使用git来管理。

Git是一种分布式版本控制系统,与传统的集中式版本控制系统(如SVN)相比,有以下几个关键区别:

1. 中心化:集中式版本控制系统有一个中央服务器存储所有的版本信息,开发者需要与服务器交互才能获取和提交代码。而Git是分布式的,每个开发者都有一份完整的代码库,可以离线工作,并且可以将自己的更改同步到其他开发者的代码库中。

2. 非线性开发:由于每个开发者都有完整的代码库,因此可以轻松创建和管理多个分支,在不同的分支上进行不同的开发工作,最终将不同的分支合并成一个工作版本。这种非线性开发方式可以使开发过程更加灵活和高效。

3. 安全性:由于每个开发者都有完整的代码库,可以轻松备份和恢复自己的数据。同时,由于代码库在多个地方存储,避免了服务器出现故障导致数据丢失的情况。

总之,Git的分布式特性使得开发过程更加灵活、高效、安全。

安装git之后会附带3样东西,bsah、cmd、gui

 

Git的配置分类:

一般用的多的是对对当前用户的配置

Git的配置选项:

打开git bash输入下列代码来账号和邮箱:

git config --global user.name "自定义用户名"
git config --global user.email "自定义邮箱"

查看用户信息的代码:

git config --list

本地仓库

 git对项目的创建仓库和下载仓库的操作:

(1)在需要使用的项目的根目录打开git bash,初始化git代码仓库:

git init

此操作会在该项目的根目录产生一个名字叫.git的文件夹,里面有很多文件。往后从本地仓库上传的东西就是这个文件夹。

(2)让git知道追踪哪些文件到仓库

git add 文件名字
git add .

(3)提交文件的内容到本地仓库 

git commit -m "初始化项目"

 

查看文件的状态的命令:

git status

 指定不需要跟踪的文件:

在开发的时候,我们上传的项目肯定不会把node_modules、打包后的文件、本地环境、日志文件等等文件进行上传,因为占内存大,也没必要上传。

这些忽略文件可以自己写自己想要忽略的文件,也可以去GitHub上面查找通用忽略的文件:

github/gitignore: A collection of useful .gitignore templateshttps://github.com/github/gitignore

 查看历史提交本地仓库的命令:

查看完历史提交记录,我们想要继续操作bash的话需要按键盘上的 “q”

git log

用一行的显示格式显示历史记录: 

git log pretty=oneline

显示分支的图结构历史记录: 

git log pretty=oneline --graph

回退版本命令:后续有分支的时候可以通过checkout来跳到某个指针上再创建新分支指针(具体看后续的分支内容)。

回退版本会出现一个问题,就是退旧版本之后就没法回到新的记录的位置了,如下图:

输入命令 git reflog可以查看往期所有的记录,包括回退前后的版本:

git reflog
git reset --hard xxxx(校验和,即commitID)

了解一下文件的状态:

(1)当我们创建一个文件的时候,这个文件是处于未跟踪的状态

(2)当我们在bash里面执行代码 git add .   的时候,我们就把未跟踪状态的文件和被我们修改过内容的文件存到了暂存区。修改过的文件要参与暂存区才能最后提交到本地仓库。

(3)当我们执行 git commit - m "自定义名称" 就可以把项目目前的内容存到本地仓库里面,并且会被记录一次,每次记录都会被单独存储以便日后按记录获取当时的代码。

远程服务器

第三方的服务器、自己的云服务器搭建,目前有三种:GitHub、Gitee、Gitlab

密钥就是因为远程仓库是私密的,所以需要输入账号密码或者要有权限。

 把远程仓库的内容下载、clone下来:

clone一个好处是,之后向远程仓库上传本地仓库的时候就不需要先添加远程仓库了,可以直接git pull来下载合并新的远程仓库并git push上传本地仓库到远程仓库。

git clone 网址

 

 

想要打开长期验证的方法就是输入下面的代码:

第一种方法:远程仓库的验证 – 凭证

建议使用git自带的 git credential manager来保存账号密码

git config credential.helper
git clone 网址

第二种方法:远程仓库的验证 – SSH密钥

生成公钥和私钥,公钥在服务器,私钥在用户手上。

 在任意地方打开bash命令提示符,输入下面的代码:

ssh -keygen -t ed25519 -C "这里写你的邮箱"

 输入后按照要求填写存放公钥的文件夹位置和密码

 然后取放公钥的位置,上图位置为c/Users/DELL/.ssh/id_ed25519,到达文件夹时,打开后缀是.pub的文件复制里面的内容到服务器里面的添加公钥就ok了。

管理远程服务器:

(如果是clone远程服务器的代码来创建的项目就不用添加远程仓库(自动已经添加了)也不会出现跟踪和不允许合并的问题)

下面开始的添加远程仓库和下载合并是针对你自己创建的项目想要和远程仓库合并

在此之前提到的方法都是克隆服务器的代码到我们本地,那现在我们需要知道怎么从本地仓库向服务器仓库发送代码。

(1)需要和服务器进行连接,添加远程仓库,此操作只需要执行一次,其中的shortname是自定义的名字。

(2)从服务器获取仓库的代码并合并到本地仓库,最后在发送本地仓库的代码到服务器。

 

有2个问题:

(是针对你自己项目的,如果是clone远程服务器的代码来创建的项目就不用添加远程仓库也不会出现跟踪和不允许合并的问题)

fetch从服务器下载到的代码,git fetch命令执行完之后,本地项目是没有变化的,原因是我们需要再输入命令git marge来合并到项目中,我们才能在项目发现有下载到远程仓库的代码。这两个操作可以简化成一个操作git pull。但是一般情况下使用git pull会发现报了两个错误。原因是git不知道你本地仓库的哪个分支要和服务器的哪个分支进行连接,类似于这样子:。为本地仓库暂时指定远程仓库的某个分支的办法:

git pull 你连接某个远程仓库时候取的名称 远程仓库的某个分支名称

上面指定做法很麻烦,每次都要输入很长的命令,这个时候我们需要让本地的项目长期进行跟踪某个分支(让指定的远程仓库的分支指定为本地仓库的基础,祖先),输入以下代码来完成:

git fetch
git branch --set-upstream-to=你连接某个远程仓库时候取的名称/远程仓库的某个分支名称

 

 之后就只需要输入 git pull就可以自动从远程仓库分支获取代码并合并到你的项目中了。

但是,由于你只是跟踪的,所以在git push的时候还是得选择把你这个本地仓库的代码上传到远程仓库的哪一个分支里面,需要使用以下代码:

git push 你连接某个远程仓库时候取的名称 本地仓库的某个分支名字:远程仓库的某个分支名称
git push 你连接某个远程仓库时候取的名称 head:远程仓库的某个分支名称

 

上面这个push方法每次上传都要输入很长一段,(之所以觉得麻烦是因为在之前配置pull的时候就已经指定跟踪了远程仓库的某个分支了,我push肯定就是向这个分支上传代码,但是居然还要我们选择分支来上传,于是我们来修改push的默认行为来实现这个想法)所以也有办法缩写到只需要输入git push就可以:

输入代码来修改git的配置文件来修改git push默认的行为的值为upstraem

git config push.default upstream

 

 这里还要说的是,git的push行为的值包括三个,找本地仓库分支与服务器分支相同的来上传代码simple,依靠之前本地仓库pull跟踪的分支来上传代码的是upstream、以本地仓库的新的分支来在远程仓库创建新的分支上传代码current

 

 

 

git 2.9版本以后,如果合并的时候出现以下错误是因为本地仓库和远程仓库的代码没有共同的基础,所以合并被拒绝了:可以通过下面代码进行强制合并代码:

git merge --allow-unrelated histories

 

 Git refusing to merge unrelated histories on rebase - Stack Overflowicon-default.png?t=N4P3https://stackoverflow.com/questions/37937984/git-refusing-to-merge-unrelated-histories-on-rebase

 

 正常git的操作流程:

Git标签(tag) - 创建tag

类似于打上版本号的记号

tab操作包括两个,一是在本地查看的操作,二是对远程仓库的操作

下图上传tag到远程仓库的时候需要指定哪个远程服务器里面,下图的origin可以修改成指定哪个远程服务器(这里的origin是先前本地连接远程仓库时候去的自定义名字)

 

我们可以删除本地仓库的tag或者删除远程仓库的tag

 

当我们需要回退到某个版本,然后修改某个版本的内容,这个时候我们就需要使用分支了。

 

git的分支:

本地仓库上传远程仓库没有的分支时,用以下代码:

git push 你连接某个远程仓库时候取的名称 本地仓库的某个分支名字:远程仓库的某个分支名称

 

 

 

 两个指针指向的内容进行合并的时候可能会冲突,如下图:

下图中绿色部分的内容是目前指针指向的代码多出来的内容,蓝色的代码是另外一个分支指针指向的代码内容。

(1)我们可以手动来合并:删除<<<xxx 和==== 和>>>xxx 的那三行就可以了。

(2)我们可以通过vscode的4种选项来自动合并,选第三个可以真正做到合并:

合并完成之后我们继续git add .来上传本地仓库代码

 

 

 了解一下工作流:

 工作流的情况下,我们默认clone下来的是master的代码,没有其他分支的代码,但是我们又需要从develop里面的代码开始开发,于是使用以下代码切换到deveolp:

git checkout develop

 

 

 

 

 

git原理:

 我们每次git add . 的时候只会在git文件夹底下的object文件夹里面添加项目里面文件数量的二进制文件,暂存区

当执行git commit -m "xxx"  的时候就会把这些add将来的二进制文件进行联系。会多出来一些文件,这些文件是树形结构的记录这次上传的所有二进制文件有哪些

 

 

 

 

 

 

 

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。