git技术分享--徐锦涛

178 阅读3分钟

一.git三大区域

image.png

1.工作目录

即我们创建的工程文件, 在编辑器可直观显示

2.暂存区

提交代码、解决冲突的中转站

3.本地仓库

连接本地代码跟远程代码的枢纽,不能联网时本地代码可先提交至该处;

4.远程仓库

即保存我们代码的服务器

二.Git分支

1.什么是HEAD

这要从git的分支说起, git 中的分支, 本质上仅仅 是个指向 commit 对象的可变指针 。git 是如何知道你当前在哪个分支上工作的呢? 其实答案也很简单,它保存着一个 名为 HEAD 的特别指针 。在 git 中, 指向你正在工作中的本地分支 ,可以将 HEAD 想象为当前分支的别名。

image.png

2.HEAD的使用

如图,此时的head指向main分支 image.png 如何分离HEAD?【git checkout c1】,如下

image.png 如何移动HEAD?

  1. 使用相对引用:敲四次命令【git checkout HEAD^】或者【git checkout HEAD~4】 2.使用绝对引用,则使用c0的提交的哈希值【git checkout c0】 image.png

3.什么是fast-forward 和no-fast-forward?

从一个分支获取变更到另一个分支的方式之一是执行git merge命令。Git 有两类合并操作:fast-forward 和no-fast-forward

fast-forward (--ff)

如果当前分支与即将合并过来的分支相比,没有额外的提交,这种就是 fast-forward 合并。Git 很会偷懒,它会首先尝试最简单的方案,即 fast-forward 。这种合并方式不会创建新的提交,只是把另一个分支的提交记录直接合并到当前分支

image.png

image.png

no-fast-foward (--no-ff)(同上图)

跟即将合并过来的分支比较,当前分支如果没有额外的提交,这固然很好,但实际情况往往不是这样!如果我们在当前分支上也提交了一些改动,那么 Git 就会执行no-fast-forward合并。

对于 no-fast-forward 合并,Git 会在当前分支上创建一个新的 合并提交 。该提交的父提交同时指向当前分支和合并过来的分支。

4.rebase

以上的ff和no-ff是merge的操作,还有一种合并代码的方式为rebase image.png 【git rebase main】 image.png 【git checkout main】 【git rebase bugFix】

image.png

5.如何使用merge和rebase

归并目标是他人代码,用来解决两个不同开发者开发的代码冲突的时候,用merge,归并目标是自己代码,用来解决自己在两台不同电脑上修改代码的冲突的时候,用rebase。

6.git reset和revert的区别

reset【git reset 版本一】

此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧 所以我们要用“git push -f”强制推上去,就可以了(我不推荐使用push -f,因为我前几次把别人的代码覆盖了,就是因为这个) image.png – soft
仅仅在本地库移动 HEAD 指针
不重置暂存区
不重置工作区
–mixed 参数
在本地库移动 HEAD 指针
重置暂存区
不重置工作区 –hard 参数
在本地库移动 HEAD 指针
重置暂存区
重置工作区

revert

原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。 image.png