一.git三大区域
1.工作目录
即我们创建的工程文件, 在编辑器可直观显示
2.暂存区
提交代码、解决冲突的中转站
3.本地仓库
连接本地代码跟远程代码的枢纽,不能联网时本地代码可先提交至该处;
4.远程仓库
即保存我们代码的服务器
二.Git分支
1.什么是HEAD
这要从git的分支说起, git 中的分支, 本质上仅仅 是个指向 commit 对象的可变指针 。git 是如何知道你当前在哪个分支上工作的呢? 其实答案也很简单,它保存着一个 名为 HEAD 的特别指针 。在 git 中, 指向你正在工作中的本地分支 ,可以将 HEAD 想象为当前分支的别名。
2.HEAD的使用
如图,此时的head指向main分支
如何分离HEAD?【git checkout c1】,如下
如何移动HEAD?
- 使用相对引用:敲四次命令【git checkout HEAD^】或者【git checkout HEAD~4】
2.使用绝对引用,则使用c0的提交的哈希值【git checkout c0】
3.什么是fast-forward 和no-fast-forward?
从一个分支获取变更到另一个分支的方式之一是执行git merge命令。Git 有两类合并操作:fast-forward 和no-fast-forward。
fast-forward (--ff)
如果当前分支与即将合并过来的分支相比,没有额外的提交,这种就是 fast-forward 合并。Git 很会偷懒,它会首先尝试最简单的方案,即 fast-forward 。这种合并方式不会创建新的提交,只是把另一个分支的提交记录直接合并到当前分支
no-fast-foward (--no-ff)(同上图)
跟即将合并过来的分支比较,当前分支如果没有额外的提交,这固然很好,但实际情况往往不是这样!如果我们在当前分支上也提交了一些改动,那么 Git 就会执行no-fast-forward合并。
对于 no-fast-forward 合并,Git 会在当前分支上创建一个新的 合并提交 。该提交的父提交同时指向当前分支和合并过来的分支。
4.rebase
以上的ff和no-ff是merge的操作,还有一种合并代码的方式为rebase
【git rebase main】
【git checkout main】 【git rebase bugFix】
5.如何使用merge和rebase
归并目标是他人代码,用来解决两个不同开发者开发的代码冲突的时候,用merge,归并目标是自己代码,用来解决自己在两台不同电脑上修改代码的冲突的时候,用rebase。
6.git reset和revert的区别
reset【git reset 版本一】
此时如果用“git push”会报错,因为我们本地库HEAD指向的版本比远程库的要旧
所以我们要用“git push -f”强制推上去,就可以了(我不推荐使用push -f,因为我前几次把别人的代码覆盖了,就是因为这个)
– soft
仅仅在本地库移动 HEAD 指针
不重置暂存区
不重置工作区
–mixed 参数
在本地库移动 HEAD 指针
重置暂存区
不重置工作区
–hard 参数
在本地库移动 HEAD 指针
重置暂存区
重置工作区
revert
原理: git revert是用于“反做”某一个版本,以达到撤销该版本的修改的目的。比如,我们commit了三个版本(版本一、版本二、 版本三),突然发现版本二不行(如:有bug),想要撤销版本二,但又不想影响撤销版本三的提交,就可以用 git revert 命令来反做版本二,生成新的版本四,这个版本四里会保留版本三的东西,但撤销了版本二的东西。