首页 > 其他分享 >Git学习

Git学习

时间:2023-10-23 13:22:19浏览次数:37  
标签:HEAD git 暂存区 学习 Git 提交 checkout 分支

Git学习

ref1(简洁)

ref2(详细)

ref3(撤销)

ref4(stash)

ref5(rebase)

Git - Book (官方)

git原理

理解原理之后亲手实践对遇到的各种问题才能更快解决。并且了解原理之后再去玩那个学习git的游戏,效果才会更好。Learn Git Branching

git四个区域

远程仓库,本地仓库,暂存区(Index/stage),工作区。

注意:工作区就是我们能看到的文件夹内容,剩下的三个区都是在本地文件夹无法直接看到的

举个例子:在工作区新建一个文件,使用add放到暂存区,然后把该文件删除,然后commit、push

此时,工作区没有该文件,(后者是因为已经提交了)。但是本地和远程仓库中有该文件。我曾经误以为工作区(本地能看到的文件夹)就是本地仓库,很疑惑为什么远程仓库和本地仓库不一样但是pull的时候却说两边是一样的。

image-20231017140830252

文件的四种状态

中间两种很好理解。

Untracked就是添加到工作区但是没有add到暂存区的,这种文件没有被git跟踪记录tracked

Staged是即将用于提交的文件状态,可以是新创建文件,也可以是修改删除了文件。换句话说,如果我进行了修改,但是该文件没有用add或者rm添加(或者从暂存区移除)到暂存区,下一次提交的时候仓库中不会更新他们的修改。

注意:为什么说是从暂存区移除,因为每次commit之后暂存区不会清空。如果想要把从仓库中删除文件还是得从暂存区提交,那么此时rm暂存区的文件然后commit就可以提交了。当然,在commit之前,也可把加入暂存区的修改取消,使用git reset filename 不加名字就是取消全部加入的修改

另外,Git使用SHA-1哈希值来标识和比较文件内容。每个文件和每个提交对象都有一个唯一的SHA-1哈希值。

image-20231017141703577

一张好图,来自于ref1

image-20231017142815308

git分支

git用指针HEAD表示当前所在的分支的某个提交,每次git branch <branchname>创建分支后,使用git checkout <branchname>可以切换到该分支,本质上就是HEAD指向了该分支头部。

image-20231017151430123

分支主要的操作是切换(checkout, switch(safer))合并merge,他们存在一些问题

切换

可以用checkout或者switch,后者看起来更规范更好理解。作用相同

注意:如果当前工作或暂存区有修改尚未提交,并且修改的文件和要切换的目标分支不同,git会阻止切换(警告如下),因为切换之后,当前的未提交的修改会被覆盖。(当然,如果两边文件一样是可以直接切换过去的,但是如果在另一个分支进行提交,回到本分支的时候修改就没了,不建议这么干)

error: Your local changes to the following files would be overwritten by checkout:
        new.txt
Please commit your changes or stash them before you switch branches.
Aborting

如果不想提交修改,也可以使用git stash save <暂存名字> 也可以git stash,但还是建议给个名字。

此操作将当前工作区和暂存区未提交的修改储藏起来,等到下一次回到此处git stash pop恢复现场。

当然,也可以在别的分支pop,如果工作区和暂存区一模一样的话(比如新分出来的分支),就会成功pop出去,不一样不会成功pop,不知道一般会不会出现这种用法。

合并

使用git merge <branchname>合并,出现冲突的时候,Git会标注出来,需要自己解决,然后手动add, commit。

标注一般长这样

<<<<<<< HEAD
这是当前分支的更改
=======
这是被合并的分支的更改
>>>>>>> branch-name

还可以用rebase,这个名字的主要原因是,如图,分支feature从B分出来,后来要和master合并,但是master已经有了新的提交,此时,feature将修改合入master就不是基于B而是M了,所以有了rebase这个名字。注意,合并的时候依然可能出现冲突需要手动解决。解决之后,和merge不一样,这个指令需要输入git rebase --continue

看ref中的那个文章好像不太推荐用rebase

image-20231017191612753

cherry-pick

其实这个不太算合并。举个例子,上面的图中,我们在master上可以用git cherry-pick C D 可以达到同样的效果。他的效果是选出n提交中, 。

删除

git branch -d [branch-name],-D(大写)强制删除

撤销

注: git log 可以查看提交历史

git reflog可以查看HEAD引用历史

主要有三种方式撤销,checkout, reset, revert,常用后两种

checkout

例如git checkout 63c87bb1 或者git checkout 63c87bb1 new.txt

前者对当前工作区是安全的。他工作的步骤是:

  1. 首先向HEAD指向63c87bb1,
  2. 更新工作区和暂存区,做简单合并,如果失败,中止checkout

后者会直接覆盖两个区域,而且HEAD不改变。

也不一定要哈希值,可以使用相对引用

例如HEAD^n,指的是HEAD第n个父提交,父提交可以又0-n个,0个说明是初始提交,多个说明是由其他多个分支合并而来

HEAD~n指得是前n个提交

reset

git resest <参数> id,参数可以省略,id就是提交的hash

参数可以是--soft, --mixed, --hard 三种覆盖的程度不同,如下图

image-20231017164845020

HEAD和分支头部会同时移动,如果用git log查看会发现找不到被reset的commit了,不过可以用git reflog看到。

注意不要对有多人协作的分支使用这个,reset之后,被reset的提交相当于消失了,其他成员的HEAD如果没有指向过被reset的提交,就永远找不到那次提交了。远程的可以用revert

revert

此指令会新建一个提交用于反转之前的提交,从而达到回滚的目的。不会对之前的有影响提交,步骤如下

  • 将反转指定提交的更改合并到工作区
  • 将更改添加到暂存区
  • 创建新的提交

可以用--no-commit参数,在撤销之后不自动提交,我们自己做进一步更改,然后手动提交。

restore

这个并不用于分支,可以用于文件删除的恢复。

例如git restore new.txt 或者git restore --staged new.txt

前者是从暂存区恢复到工作区,后者从HEAD恢复到暂存区

git远程

fectch 和 pull

pull = fetch + mergepull的时候可以指定分支git pull origin 远程分支:本地分支

如果不指定本地分支则默认将拉的远程分支合并到当前分支,如果什么都不指定,默认拉当前同名分支。

配置相关

此处配置是用于在提交记录中显示的

$ git config --global user.name "John Doe"
$ git config --global user.email [email protected]

git 显示中文和解决中文乱码

Git 的使用——提交避免输入用户名和密码

实际问题

标签:HEAD,git,暂存区,学习,Git,提交,checkout,分支
From: https://www.cnblogs.com/BayMax0-0/p/17782188.html

相关文章

  • Java学习之路(二)
    Java学习之路(二)1、流程控制语句1.1、顺序结构顺序结构是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行的。执行流程:1.2、分支结构1.2.1、if语句格式一:单分支if(关系表达式){语句体; }执行流程:①......
  • 图机器学习:从图谱角度来理解图增广
    1导引图对比学习(GraphContrastiveLearning,GCL)[1][2][3]旨在以自监督的方式学习图的节点表征,其流程如下图所示:具体而言,先以特定方式对原图\(\mathbf{A}\)进行增广,得到两个增广后的视图(view)\(\mathbf{V}_1\)和\(\mathbf{V_2}\)做为对比对(也可以是原图和增广后的视图做为......
  • 《动手学深度学习 Pytorch版》 10.1 注意力提示
    10.1.1生物学中的注意力提示“美国心理学之父”威廉·詹姆斯提出的双组件(two-component)框架:非自主性提示:基于环境中物体的突出性和易见性自主性提示:受到了认知和意识的控制10.1.2查询、键和值注意力机制与全连接层或汇聚层区别开来的元素:是否包含自主性提示在......
  • ServerLess学习笔记-Fnproject搭建
    ServerLess学习笔记-搭建FnProject介绍官方文档:https://fnproject.io/tutorials/Fn是一个事件驱动的开源功能即服务FaaS计算平台,您可以在任何地方运行,它的一些主要特点开源原生Docker:使用任何Docker容器作为你的函数支持所有语言随处运行公有云、私有云和混合云......
  • ServerLess学习笔记-搭建FN示例
    ServerLess学习笔记-搭建FnProject示例初始化函数目录#初始化fn_demo1[root@VM-24-9-centosserverless]#fninit--runtimepythonfn_demo1Creatingfunctionat:./fn_demo1UnabletogetlatestFDKversion,usingdefaultFunctionboilerplategenerated.func.yam......
  • ServerLess学习笔记-Fnproject常用命令
    ServerLess学习笔记-FnProject常用命令启动/停止#启动fnstart#停止fnstop创建[root@VM-24-9-centosserverless]#fncreateMANAGEMENTCOMMANDfncreate-CreateanewobjectUSAGEfn[globaloptions]create[command......
  • 鱼类识别系统:基于深度学习的生态保护与渔业管理利器【鱼类识别系统实战】
    当今,人工智能和深度学习已经成为许多领域的关键技术。在生态学和环境保护领域,鱼类识别是一项重要的任务,因为准确识别和监测鱼类种群对于保护水生生物多样性和可持续渔业管理至关重要。基于深度学习的鱼类识别系统能够自动识别和分类不同种类的鱼类,为生态学研究和渔业管理提供有力的......
  • 大模型:机器学习的崭新时代
    原创|文BFT机器人在机器学习领域,随着计算能力和数据规模的不断增长,大模型成为一种引人注目的技术。这些具有大规模参数和参数量的机器学习模型正在改变着我们对于人工智能的认识,大模型的出现使得机器学习模型能够处理更复杂的任务,取得更准确和复杂的预测结果。PART01大模型的概......
  • 10月23日粘包学习以及struct模块和json模块
    目录粘包如何解决粘包问题呢?struct模块json模块粘包粘包:tcp会把数据量较小,时间间隔较短的数据,当做同一个包发送粘包问题图粘包问题说白了就是客户端传给服务器的数据到服务器的时候有部分数据粘在了一块,而不是一条条的显示粘包产生情况大致图如何解决粘包问题呢?简单的方......
  • 使用Github Copilot完成代码编写
    上篇文章,我们使用VSCode创建了T.Global解决方案和两个类库工程,接下来我们使用GithubCopilot完成代码编写先说以下业务需求:提供一个公共的本地化组件,支持对数字、货币、时间、日期、度量衡单位、排序的在不同区域下的处理。一、新建一个II18NService接口这里我们使用了以下P......