个人对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.远程库

就是网上那个共享的代码库,它和你的本地库区别不大

  1. 远程库的意义就是把东西放在网上,你电脑丢了也没事
  2. 本地库在你电脑里只有你自己能动,远程库在网上,有权限的人都能动

5.分支

分支就是代码不同的走向,从某个commit 节点开始,代码朝向不同的方向发展。

在初始化本地Git仓库的时候,Git默认已经帮我们创建了一个名字叫做master的分支。通常我们把这个master分支叫做主分支。
在实际工作中,master主分支的作用是:用来保存和记录整个项目已完成的功能代码。因此,不允许程序员直接在master分支上修改代码,因为这样做的风险太高,容易导致整个项目崩溃,因此我们需要在自己负责开发的分支上进行开发
在这里插入图片描述
功能分支指的是专门用来开发新功能的分支,它是临时从master主分支上分叉出来的,当新功能开发且测试完毕后,最终需要合并到master主分支上
在这里插入图片描述
分支的一个很大的意义就是可以进行分布式开发
在进行多人协作开发的时候,为了防止互相干扰,提高协同开发的体验,建议每个开发者都基于分支进行项目功能的开发。

这里引用大佬的讲解 [超链接]

6. GIT 运行机制

  1. 版本追踪
    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
  1. 分布式开发
    首先是分支

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,然后我们要更新代码。

  1. git fetch
    使用git fetch更新代码,本地的库中production 的commitID不变,还是等于1。但是与git上面关联的那个orign/production 的commit ID变成了2。这时候我们本地相当于存储了两个代码的版本号,我们还要通过merge去合并这两个不同的代码版本,如果这两个版本都修改了同一处的代码,这时候merge就会出现冲突,然后我们解决冲突之后就生成了一个新的代码版本。
    这时候本地的代码版本可能就变成了commit ID=3,即生成了一个新的代码版本。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值