git
git简介
版本控制系统(VCS)是软件开发中不可或缺的工具之一,它允许开发者跟踪和管理代码变化,协同工作,以及在出现问题时回滚到之前的状态。
在所有版本控制系统中,Git是最流行的一个,由Linux之父----Linus Torvalds在2005年创建,旨在提供速度、数据完整性和对分布式、非线性工作流的支持。
Git是开源的,支持多种操作系统,包括Linux和Windows,使其成为跨平台项目的理想选择。
git的基本概念
- 仓库(Repository):Git 仓库是存储代码及其历史记录的地方。它可以存在于本地计算机或远程服务器上。只有在Git仓库中保存的文件才能够被Git进行管理,因此我们一般想使用git的时候一般都要先创建仓库.
- 提交(Commit):提交是对代码库中更改的快照。每次提交都有一个唯一的标识符,并包含作者、时间戳和提交消息。
- 分支(Branch):分支是在开发过程中独立存在的工作流。它允许并行开发和测试新功能,而不会影响主代码库。
- 合并(Merge):合并是将一个分支的更改合并到另一个分支的过程。它允许开发人员将不同分支的工作整合到一起。
- 远程仓库(Remote Repository):远程仓库是托管在网络服务器上的 Git 仓库,用于团队协作和代码共享。
- 克隆(Clone):克隆是从远程仓库复制整个代码库到本地计算机的操作。
下面是git工具的流程图,一般我们新的增删查改的文件都在工作区,
需要进行一些命令操作才能到真正的版本库中进行版本管理
当然这只是本地代码仓库的区域,最终的版本管理实在远端的代码仓库中,如
github
gitee
等远程代码仓库
git的安装和使用
git的安装
- centos :
sh
sudo yum install git
- ubuntu :
sh
sudo apt install git
- Windows:
链接: git官网
Windows环境下的安装过程中,向导会提供多个选项,包括选择命令行环境(推荐使用Git Bash),以及配置默认的文本编辑器等。完成安装后,你可以通过Git Bash或Windows命令提示符使用Git。
在Windows环境下,可以下载一个使用图形化界面对git进行操作的软件小乌龟: 小乌龟官网
git的使用
创建本地仓库
只有在创建的git仓库下的文件才能够被git进行管理
因此我在我自己的Linux下选择一个目录作为仓库,在目录下创建一个Git仓库:
sh
git init
此时可以看见,我已经创建了一个本地仓库
配置本地仓库
在对一个仓库进行管理的时候,最好对这个仓库配置name和email,方便我们后续管理
而配置仓库的命令有对当前仓库的配置和整个系统下所有仓库的配置,其中,当前仓库可以直接使用配置命令即可,而全局配置需要再命令前加上--global
在仓库目录下配置name:
sh
git config user.name "cris"
配置email:
sh
git config user.email "11111111@qq.com"
删除配置:
sh
git config --unset user.name
git config --unset user.enmail
添加文件到版本仓库
首先我们要明确,git仓库被分为两个大致区域,一个是工作区
,一个是版本库
工作区是我们对文件进行增加,修改,删除的地方,而版本库就是git对文件进行版本控制的地方
我们一般在git仓库中创建了一个新的文件之后git是没有办法对这个文件进行版本控制管理的,因为新创建的文件都在工作区
因此,想要git对文件进行版本控制的管理,那么我们首先要把想要管理的文件添加到版本库中才行,此时就用到了git的添加命令 add和提交命令commit
add
:将工作区的文件提交到暂存区
commit
:将暂存区的内容提交到版本仓库中
例如,我在我的git仓库下创建了一个新的文件testgit,将它添加到我的git仓库中:
sh
git add testgit
在这里也可以进行多个add操作来进行多文件的添加,add完成后接着commit
sh
git commit -m "这里添加对提交文件的描述,比如添加了什么,更改了什么,删除了什么"
完成之后我们可以使用 git log命令来查看git仓库的提交记录
sh
git log
也可以使用 git log --pretty=oneline 只查看一行
sh
git log --pretty=oneline
此时前面着一串16进制的数字就是我们对这个文件进行更改的关键
,这串长长的十六进制数字是 Git 的提交对象的哈希值(hash value)。
这个哈希值是通过 SHA-1 算法生成的,用于唯一标识每个提交对象。每次提交都会生成一个唯一的哈希值
,它是 Git 中对提交的唯一标识符,用于在版本控制中进行引用和识别。
更改文件的添加
当我们想知道仓库中的哪些文件有修改时,可以使用命令:
sh
git status
显示所更改文件内容:
sh
git diff filename
更改完成之后把文件再提交到版本仓库中:add->commit
版本回退命令
既然是版本控制,那一定可以将文件回退到我们想要的版本,因此git提供了一个命令
sh
git reset
当然,这只是一个大方向命令,后面还有细分的--命令,接下来先了解第一个
--soft:
sh
git reset --soft
这个命令只是对版本仓库中的文件进行回退
,而工作区和暂存区的内容都不发生改变
--mixed
sh
git reset --mixed
这个命令会使版本库和暂存区进行回退
,而工作区不发生改变
--hard
sh
git reset --hard
回退所有区域中的版本
以上三个细分命令中,--mixed是默认选项,若不适用其他两个细分选项,那么git reset命令就执行的事 --mixed 命令的选项
例如,此时我们想要对文件进行回退:
首先使用log命令查看每次提交的版本的唯一哈希值
sh
git log --pretty=oneline
然后选择一个版本进行reset
sh
git reset --soft 选择想要退回版本的唯一哈希值
撤销修改命令
当我们在对某个文件进行更改的时候,忽然觉得今天改的东西都好垃圾,想把今天所更改的内容全部都撤销掉,分为以下几种情况:
- 撤销工作区的更改(还没有add)
sh
git checkout -- filename
- 撤销工作区和暂存区的修改(add了还没有commit)
sh
git reset --hard HEAD filename
注意,HEAD 是指回退到当前版本,
HEAD^回退到上一个版本
HEAD^^指回退到上上一个版本
- 撤销工作区,暂存区和版本库中的修改(已经add和commit过了但是还没有push到远端仓库)
sh
git reset --hard HEAD^ filename
删除
在本地rm 然后add->commit即可
或者使用git提供的命令:
sh
git rm filename
完成之后不用add,直接commit即可
分支
分支的概念和作用
在 Git 中,分支(Branch)是一个非常重要的概念,它允许开发者在不影响主线(通常是主分支,如 master 或 main)的情况下并行开发多个功能或修复。
Git 分支的原理基于分布式版本控制和提交历史。在 Git 中,分支是提交(commit)的引用,它们指向提交树中的不同位置。每个分支都维护一个指向最新提交的指针,这个指针通常被称为 HEAD。
但是一般情况下,无论有多少分支,又要存在一个稳定的分支master,这个分支一般是被上线的分支,因此要保证这个分支的版本稳定,无bug
以下是分支的一些主要作用:
-
并行开发:分支允许多个开发者同时在不同的特性上工作,而不会相互干扰。每个人可以在自己的分支上开发,完成后可以将分支合并到主分支上。
-
实验和探索:开发者可以使用分支来实验新的想法或尝试不同的解决方案,而不必担心这些更改会破坏主分支的稳定性。
-
特性开发:当开发一个新的特性时,可以创建一个分支来隔离开发工作。完成特性后,可以将分支合并到主分支上,以便其他开发者使用。
-
修复和维护:当需要修复主分支中的一个问题时,可以在一个单独的分支上进行修复,修复完成后合并回主分支。
-
回滚和撤销更改:如果不慎作出了错误的更改,可以使用分支回滚到之前的提交。在 Git 中,这通常是通过 git reset 或 git revert 命令实现的。
-
代码审查:在合并更改到主分支之前,可以在一个专门用于代码审查的分支上进行讨论和修改。
-
部署和发布:在准备发布新版本时,可以创建一个发布分支来准备发布候选版本,完成测试后合并到主分支进行正式发布。
-
版本回滚:如果发布的版本存在问题,可以使用分支来回滚到上一个稳定的版本。
查看分支
查看分支的命令:
sh
git branch
此时可以看到,我的git仓库下只有一条主分支master,而 * 指的HEAD指针所指向的分支
创建分支
接下来我们创建一条分支:
sh
git branch deputy
此时可以看到已经有两条分支了,而当前的HEAD指针指的是主分支master
切换分支
切换分支:
sh
git checkout deputy
此时可以看到分支已经切换到deputy了
合并分支
当我们想要把副分支上更改的内容合并到主分支上时,首先要把HEAD指针切换到想要合并其他分支的那一条,而不是 被合并的那条分支
因为我想要把deputy分支合并到master分支上,因此切换HEAD指针到master
sh
git checkout master
然后进行合并
sh
git merge deputy
此时master分支就指向deputy分支的最近的一次更改
删除分支
想要删除一条分支,前提条件是让HEAD指针指向的不是这条分支,因此想要删除deputy分支的时首先要让HEAD指针指向其他分支然后再进行删除操作:
sh
git branch -d deputy
此时可以看到只剩下一条主分支master 了
合并冲突
当两个分支分别提交了不一样的更改内容,最终要合并在一起的时候就会发生合并冲突,因为git不知道你到底要保留那个更改,此时就要手动选择并重新commit
举例:
创建新的分支dep并让HEAD指针指向它
sh
git checkout -b dep
在此分支下更改testgit文件
然后add->commit
再返回master分支,对testgit进行更改:
然后 add->commit
此时两个分支的更改是不同的,然后把dep合并到master
此时合并异常
那么我们重新进入异常文件:
其中<<< === >>> 这三种符号之间指的是当前所指分支和另一个分支不同的地方,我们选择一个想要留下来的内容,然后把另一个删掉即可,此时我把master分支更改的内容留下
然后进行add->commit
分支冲突解决
此时master指向最新的这一次提交,而dep分支不变
远程仓库
我们熟知的github,gitee等实际上就是分布式版本控制 的网站
我们可以吧主要的库放在网站中的服务器中,然后把项目分为多人开发,只需要在开发完成后上传和解决冲突即可
下面就在国内的网站 gitee.com 上面创建我们自己的远程仓库
创建仓库
在gitee上面注册号账号后,就可以创建自己的远程仓库啦
下面是创建步骤:
- 点击有右上角加号,创建仓库:
- 填写仓库名称
- 创建:
此时,远程仓库已经创建完成,网站还细心的提示我们如何在本地仓库同步 - 初始化readme文件(这一步可以省略)
这个readme文件是作者对当前项目的一个说明,这一步也可以在创建仓库时勾选即可 - 保存
点击管理,填写对仓库的描述,然后保存即可
此时,我们的一个远程仓库就创建成功啦
克隆到本地
-
找到克隆链接:
复制HTTPS链接
-
本地仓库clone
sh
git clone 刚才复制的链接
此时远程仓库已经克隆到本地
配置本地的远程仓库
我们将远程仓库clone到本地后,首先要进行用户配置
sh
git config --global user.name '网页注册的id'
git config --global user.email '网页注册的邮箱'
git config --global user.name 'crischeung'
git config --global user.email '1042300082@qq.com'
配置完成后就可以对仓库中添加代码,并推送到远程仓库
推送文件到远程仓库
当我们有文件需要添加到远程仓库时,首先要确保这个文件在本地仓库中
然后使用add->commit
此时我创建了一个file.txt文件,首先在本地仓库中添加到git
然后进行远程仓库的添加,此时要用到命令push
sh
git push origin 远程仓库的分支:本地要拉取到的分支
因为我这里的分支名是一样的,因此可以省略:后面的分支
sh
git push origin master
其中origin指的是远程仓库,master指的是要添加的分支
push完成后要输入gtee网站自己的id及密码
此时可以看到已经添加完成
拉取文件到本地仓库
如果远程仓库要领先我们自己的本地仓库的版本,那么就可以使用命令pull
pull 命令可以先将远程仓库的内容拉取过来,再合并到我们想要添加的分支中去
sh
git pull origin 远程仓库的分支:本地要拉取到的分支
若分支名相同,同样可以省略:后面的命令:
sh
git pull origin master
忽略特殊文件
有时候我们在本地完成修改之后,有的文件想要提交到远程仓库,有的文件不想提交,那就需要配置一个.gitignore 文件,这个文件的作用就是让我们在提交的时候对特性属性的文件进行忽略
首先在本地仓库下创建,gitignore文件:
sh
vim .gitignore
然后再里面添加想要限制的文件后缀即可:例如,我不想让所有的.so文件提交:
*.so
当然,如果这时我有一个文件为a.so想要提交,别的.so文件不想提交,就可以在.gitignore文件中添加命令 !a.so
此时的a.so就可以正常add了
如果有一天我们,gitignore文件中写的太多了,提交某个文件的时候被忽略了,那就可以使用查看,gitignore的命令:
sh
git check-ignore -v 被忽略的文件名
此时就会显示出被忽略的原因