概述
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- GIT
- 一、GIT是什么?
- 二、GIT 结构
- 1.工作区
- 2.暂存区
- 3.本地库
- 4.远程库
- 5.分支
- 6. GIT 运行机制
GIT
提示:这里可以添加本文要记录的大概内容:
自己对git的理解
提示:以下是本篇文章正文内容,下面案例可供参考
一、GIT是什么?
GIT就是代码管理工具,能够实现比如说,代码版本更新回退,多人代码合并,等等。
二、GIT 结构
GIT 有四大存放代码地方,工作区,暂存区,本地库,远程库
1.工作区
比如你在IDEA或者eclipse里或者linux命令行里打开了一个项目文件,mian.cc或者student.java 这些就是工作区,说白了就是你的自己笔记本或者电脑里的代码文件
2.暂存区
就是暂时存放修改过代码的文件的地方,以备commit。
如何实现: 在.git/index, 把所有你git add 的文件串起来
比如说,你今天工作,把main.java, student.java,teacher.java, school.java这四个文件改了,你就可以把今天都修改的这四个文件放在这个暂存区,等会把他们提交到本地代码库。这个暂存区就在你git clone 下来文件夹里的 .git 里, 然后你可以用git add xxx文件名字或者 git add . 表示所有文件,提交到暂存区
git status可以查看在commit 之前那些文件被改过
3.本地库
存放每个版本代码的地方,每次你在工作区写好了一个版本的代码,就可以通过git commit 提交到本地库
他和工作区的区别是,你可以理解为工作区就是草稿纸,本地库是稳定版,草稿纸上可以乱写乱改,等代码落定了,或告一段落稳定了了,才传到本地库上。
4.远程库
就是网上那个共享的代码库,它和你的本地库区别不大
- 远程库的意义就是把东西放在网上,你电脑丢了也没事
- 本地库在你电脑里只有你自己能动,远程库在网上,有权限的人都能动
5.分支
分支就是代码不同的走向,从某个commit 节点开始,代码朝向不同的方向发展。
在初始化本地Git仓库的时候,Git默认已经帮我们创建了一个名字叫做master的分支。通常我们把这个master分支叫做主分支。
在实际工作中,master主分支的作用是:用来保存和记录整个项目已完成的功能代码。因此,不允许程序员直接在master分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃,因此我们需要在自己负责开发的分支上进行开发
功能分支指的是专门用来开发新功能的分支,它是临时从master主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到master主分支上
分支的一个很大的意义就是可以进行分布式开发
在进行多人协作开发的时候,为了防止互相干扰,提高协同开发的体验,建议每个开发者都基于分支进行项目功能的开发。
这里引用大佬的讲解 [超链接]
6. GIT 运行机制
- 版本追踪
Git为进行版本控制设置HEAD指针,通过移动HEAD指针将版本前进或后退
在讲本地库的时候说过,每次写好一个版本的代码,commit到本地库,那么每次commit都会产生一个commit ID
通过 git log 可以查看commit 记录, 每一次commit id 就对应了一个版本代码,同时每次commit 之后 HEAD指针都会指向这个最新的commit id,就对应着最新版的代码,这个HEAD指针我们可以在.git/HEAD里看到。
如上,最新commit 是eat, 因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从"eat" 指向"add programmer".
在图中可以看到每一个版本都有自己的版本号,就是每个版本下面那个金黄色一串字符,也就是我们使用git log 指令找到的.这些版本号就是
告诉HEAD指针该版本的位置,然后让HEAD指针指向过去,这样就实现版本回退了. 如果你回退之后想回到未来,这时候只需要将"eat"的版本号告诉
我们的HEAD指针. 接下来我们就认识一下,可以回退版本的指令. (指令内部还是将版本号告诉HEAD指针,理解这里的原理就可以呢).
如果我们想要进行版本回退可以通过如下方式
1 基于索引值操作
通过git reset --hard xxx(索引号)回退到某个历史版本
1 $ git reset --hard 873dd3c
2 HEAD is now at 873dd3c second commit
2 使用^符号
使用^ 符号进行版本控制时只能往后退,一个^ 符号代表往后退一步
1 $ git reset --hard HEAD^
2 HEAD is now at 9de36fa fifth commit
3 使用~符号
如果想要后退的步数比较多,^的数量将会很多,此时可以通过~[步数]来代替
$ git reset --hard HEAD~3
HEAD is now at 1946026 third commit
xxx@*** MINGW64 ~/Desktop/Py.spider (master)
$ git log
commit 19460261a08e1927b49b3ff90bf2abd752e235b1 (HEAD -> master)
Author: *** <xxx@xxx.com>
Date: Fri Nov 19 17:04:22 2021 +0800
third commit
commit b3ac0ef4d06edfb8fb96d8ab5fa59ae7abfb127a
Author: *** <xxx@xxx.com>
Date: Fri Nov 19 16:57:33 2021 +0800
second commit
commit 951bd869e851097e02429b48f41cc5fef3543d33
Author: *** <xxx@xxx.com>
Date: Fri Nov 19 16:44:23 2021 +0800
first commit
- 分布式开发
首先是分支
GIT 的使用一般分两种,将本地的代码传到远程库,将远程库拉到本地库
首先我们要说简单说git的运行机制。git分为本地仓库和远程仓库,我们一般情况都是写完代码,commit到本地仓库(生成本地仓的commit ID,代表当前提交代码的版本号),然后push到远程仓库(记录这个版本号),这个流程大家都熟悉。
我们本地的.git文件夹里面对应也存储了git本地仓库master分支的commit ID 和 跟踪的远程分支orign/master的commit ID(可以有多个远程仓库)。那什么是跟踪的远程分支呢,打开.git文件夹可以看到如下文件:
.git/refs/head/[本地分支]
-bash-4.2$ cd heads/
master production testing
可以看到本地代码库有三个分支,master,production,testing
.git/refs/remotes/[正在跟踪的分支]
-bash-4.2$ cd remotes/
origin
-bash-4.2$ cd origin/
HEAD production testing
remotes里放的是远程代码库,现在我们的远程代码库只有一个,名字叫origin
在远程代码库origin里,我们追踪两个分支,production,testing
master目前没追踪,因为我没用它
首先假设我们[本地仓库] production 分支上 commit ID =1 ,[在追踪的远程仓库]orign/production 中的commit ID =1 ;这时候远程仓库有人更新了github origin库中production 分支上的代码,新的代码版本号commit ID =2 ,那么在github上 orign/production 的commitID=2,然后我们要更新代码。
- git fetch
使用git fetch更新代码,本地的库中production 的commitID不变,还是等于1。但是与git上面关联的那个orign/production 的commit ID变成了2。这时候我们本地相当于存储了两个代码的版本号,我们还要通过merge去合并这两个不同的代码版本,如果这两个版本都修改了同一处的代码,这时候merge就会出现冲突,然后我们解决冲突之后就生成了一个新的代码版本。
这时候本地的代码版本可能就变成了commit ID=3,即生成了一个新的代码版本。
最后
以上就是乐观短靴为你收集整理的个人对GIT的理解GIT一、GIT是什么?二、GIT 结构的全部内容,希望文章能够帮你解决个人对GIT的理解GIT一、GIT是什么?二、GIT 结构所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复