>首页> IT >

深入分析Git基本工作原理

时间:2022-04-07 13:46:49       来源:转载
本篇文章给大家带来了关于Git的相关知识,其中主要介绍了git的基本工作原理,入门级教程,通过玩转Git本地仓库,帮助新手快速入手Git,希望对大家有帮助。

推荐学习:《Git学习教程》

一、分区及工作流程

1. Git分区

Git的分区包括工作区、暂存区、本地仓库(本地版本库)、远程仓库(远程版本库)。

工作区工作区(Workspace)即本地代码所在的目录,同时也是存放 .git/ (本地仓库)的目录。

暂存区暂存区(Index/Stage)是工作区和本地仓库的缓存空间,里面记录着即将提交给本地仓库(版本库)的文件修改信息,.git/ 目录里的index文件就是暂存区。

本地仓库本地仓库(Repository)也称本地库或版本库,存放了本地的所有版本(commit提交记录),本地仓库的文件都在 .git/ 目录中。

远程仓库远程仓库(Remote)在网络上,GitHub、Gitee和GitLab都能创建远程仓库,和本地仓库一样,远程仓库存放的也是不同的代码版本,只是这些版本可以来自多个本地仓库。

2. 工作流程

------------------------------------------------------下图来源网络---------------------------------------------------------

上图生动地描述了Git不同分区之间的操作命令。

假如要实现上传代码功能,工作区使用add添加文件到暂存区,暂存区再通过commit提交版本给本地仓库,最后本地仓库使用push将版本推送到远程仓库;工作区修改的文件可以通过checkout命令从本地仓库或暂存区恢复;如果要将工作区某分支的代码更新为远程仓库最新版本,可以使用pull命令;对远程仓库使用clone可以将远程仓库主分支拷贝到本地仓库,fetch命令与pull类似,只是pull会合并本地代码,而fetch只会把最新版本抓取到本地版本库,不考虑本地仓库是否有新增。

二、本地仓库初始化

1. git init

本地仓库(版本库)需要使用 git init 命令来创建(也可以直接从远程仓库克隆,后面介绍)。 进入工作区(代码存放目录),输入git init,git会在工作区新建一个.git/目录:

2. .git/目录简单介绍

在一个新建的.git/目录中,有3个文本文件:

config存放了本地仓库的配置信息;description用来描述仓库的名字;HEAD为本地仓库当前分支,默认为master,指向了refs/heads/master,可见refs/目录主要存放一些分支信息;

后面在对本地仓库进行操作时,还会产生其他文件,比如logs/——保存提交的记录,index——暂存区。

【注意】 千万不要手动更改.git/里的文件,可能会破坏本地仓库的结构,造成不良后果。

三、用户信息配置

1. 用户名和邮箱配置介绍

初始化本地仓库后的第一件事情就是给本地仓库添加用户配置信息,包括用户名和邮箱地址,这里的用户名和邮箱地址和托管平台(如gitee)的账户没有直接关系,它唯一的作用就是让别的用户或托管平台知道代码的上传者信息,邮箱乱填也不会导致不能上传代码。

比如下面我用“张三”和“李四”上传了代码,邮箱地址不是真实存在的,同样可以上传成功:(commit信息出了点意外) 李四的邮箱地址显然不是真实的。 由于“张三”和“李四”的邮箱没有在gitee绑定账户,所以点击它们头像时,不会显示用户信息,如果用户配置里填写了gitee账号的提交邮箱,则可以在gitee上查看上传者账号信息。 gitee用户的提交邮箱,可以在gitee->个人主页->个人设置->邮箱管理中设置和查看:

2.使用git config配置用户信息

讲了那么多用户名和邮箱的注意事项,其实用户信息配置十分简单:

git config --global user.name "your name"git config --global user.email "your email"

user.name 后接用户名,任意填写。 user.email 后接用户邮箱,任意填写。 –global 为配置全局属性 提交代码到本地仓库时,git会先检索本地仓库的.git/config文件,如果没有user的信息,则使用全局的配置文件(符合就近原则)。

全局配置文件存放位置为 系统用户目录/用户名/.gitconfig,里面只有user属性。

不加–global时,仅设置本地仓库的用户配置,本地仓库用户配置信息存放位置:.git/config 上图我仅设置了本地配置的用户名,此时如果提交修改到本地仓库,提交记录(下图)中用户名使用本地配置,因为本地没有配置用户邮箱,所以邮箱依然使用全局配置中指定的邮箱。

四、管理暂存区文件

配置完用户信息后,我们就可以开始考虑提交代码了,但是有时候,我们并不想把整个工作区的文件都提交到本地仓库(版本库)。暂存区(index/stage)的存在,替我们解决了这个困扰,我们可以先把代码文件添加到暂存区,如果觉得还需要改动,可以将文件从暂存区删除,直到我们觉得文件选择得差不多了,再进行下一步(提交到本地仓库)。

1. Git文件状态

在管理暂存区之前,我们还需要了解工作区文件的几种状态:

Untracked未跟踪,工作区中没有加入过暂存区的文件,不参与版本控制;Unmodified未修改,加入版本控制,但和版本库中文件快照相同;Modified已修改,加入版本控制,而且和上次加入版本库时的快照不同;Staged已暂存,下一步可以提交到本地仓库(版本库)。

------------------------------------------------------下图来源网络--------------------------------------------------------- git status命令可以用来查看工作区文件当前的状态:

#查看特定文件的状态git status [filename]#查看所有文件状态git status#精简的方式显示文件状态git status -s

2. 添加文件到暂存区

先查看工作区所有文件的状态,发现还没有任何文件:

现在创建3个文件,再次使用git status(-s表示精简显示),3个文件的状态为Untracked,??为精简显示下Untracked的标志,意思是新创的文件没有被本地仓库(版本库)跟踪。 git add [文件…] 可以添加一个或多个文件到暂存区,使文件状态变为Staged,A表示该文件被add到暂存区。 也可以使用 git add . 或 git add -A 将工作区所有文件添加到暂存库(除了.gitignore里声明的文件,本文暂不介绍)。

3. 删除暂存区的文件

既然可以向暂存区添加文件,那么反向操作必然也不能少,git rm --cached [文件…] 命令可以将暂存区的文件移除,使其恢复到Untracked状态。

4. 文件修改管理

如果已经存入暂存区,但在文件提交到本地仓库前,我们对其进行了修改,那么它的状态将变为Modified。 对于Modified状态的文件,我们可以使用git add将修改后的版本加入到暂存区,也可以使用git checkout -- [file...]将工作区的该文件恢复到暂存区的版本。

git add a.c重新添加a.c到暂存区: 下图为使用git checkout -- a.c从暂存区恢复a.c文件,下图中我没有加 “ --”,它的作用是让checkout不检测任何其他选项参数,目的是防止该命令把a.c当做一个分支(checkout 还有一个作用是切换分支)。 对Modified状态下的文件使用 git diff 可以得出文件修改的详细记录,git diff和diff命令虽然作用都是对比文件,但git diff的作用是对比不同的状态下的同一文件,而diff用来对比两个不同的文件。

五、提交文件到本地仓库

文件添加到暂存区的目的就是将其提交到本地仓库(版本库),提交命令为git commit -m “message”

我们可以在commit 后面添加文件,这样能指定提交的文件: 通过git log 可以查看提交记录,HEAD为本地仓库当前分支,指向主分支master: 直接使用 git commit -m “message” 可以将整个暂存区都提交到本地仓库:

#以一行的形式显示所有提交版本:git log --pretty=oneline
#一行显示,只显示哈希值的前7位:git log --oneline
#显示历史提交版本与当前版本的间隔数:git reflog

六、推送到远程仓库

代码文件提交到本地仓库后,还需要推送到远程仓库进行托管。

1. 创建远程仓库

我以码云为例,远程仓库的创建可以通过以下三步实现:

2. 添加远程仓库地址

git remote add 命令可以添加远程仓库,name为远程仓库地址的别名,自定义,url为仓库网络地址。 如果要用https的方式上传代码,需要添加远程仓库https地址;用ssh上传代码,则url填远程仓库ssh地址。

先从码云仓库主页将仓库地址复制下来:

我将远程仓库的本地别名命名为origin: 远程仓库可以设置多个,只要本地别名不冲突即可。

3. 查看远程仓库地址

git remote -v命令可以查看远程仓库地址,也可以通过git config -l查看

4. 删除远程仓库地址

git remote remove 可以删除本地别名为name的远程地址:

5. 推送到远程仓库

首先确认远程仓库的别名,我当前设置的远程仓库https协议地址对应的别名为https,ssh协议地址对应的别名为ssh,这两个地址其实是一个仓库,只是协议不同。

https上传

git push name可以实现本地仓库的上传,name为远程仓库在配置文件中的别名,使用https上传,需要输入账号和密码才能完成上传,Window系统会自动保存账号和密码,如果想修改Window已经保存的用户名和密码,可以参考修改Gitee登录凭据。有时第一次上传会出现不成功的情况,可以尝试使用git push -u name master,该命令的作用是将 name 仓库的主分支作为上流分支,-u和–set-upstream作用相同。

ssh上传

如果要使用ssh上传,需要先生成SSH密匙,并将公匙保存到gitee个人设置的SSH公匙设置中,具体过程可以参考:生成SSH密匙,实现代码上传有时第一次上传会出现不成功的情况,可以尝试使用git push -u name master,该命令的作用是将 name 仓库的主分支作为上流分支,-u和–set-upstream作用相同。

七、从远程仓库clone、fetch或pull

1. 克隆远程仓库到本地

git的克隆可以将远程仓库拷贝到本地,同时自动进行本地仓库的初始化。 在任意目录下打开Git bash,输入 git clone [

],repo为远程仓库网址,dir为克隆仓库的存放路径(可以不用提前创建),如果不填,则默认为远程仓库名(不是本地别名)。[注意]:clone和push一样需要密码。 克隆成功,进入该仓库目录,和上传时的工作区一模一样,提交日志也相同。

2. 获取远程仓库(fetch)

git fetch的作用是将远程仓库的分支拷贝到本地仓库,并把最新版本保存在FETCH_HEAD分支,获取远程仓库分支后,还需手动将其合并到当前分支。 命令格式: git fetch [] ,repository为远程仓库的网络地址。 git merge <分支名>用来合并分支

3. 拉取远程仓库(pull)

git pull和git fetch类似,但git pull会自动将远程仓库的分支合并到本地的当前分支。

推荐学习:《Git视频教程》

以上就是深入分析Git基本工作原理的详细内容,更多请关注php中文网其它相关文章!

关键词: 添加文件 配置文件