一:git的工作原理
1.1 git执行过程图解

1.2 git clone图解

1.3 git feach git merge git pull图解

1.3.1 拉取代码合并
git feach是将远端仓库的内容取到本地,git merge将Head移动到最新的commit节点上

1.3.2 在分支上进行merge
执行git merge feature1(当一个分支开发完成,需要合并分支的时候执行此过程)

注:在此处可能会发生冲突,eg,在feature1 分支上修改了a.java的第211行,在develop分支上同样修改了a.java的第211行,此处执行merge的过程会发生冲突,具体冲突解决查看下面实操。
特殊情况1 HEAD 领先于commit,执行git merge操作就是一个空操作,git什么都不会做。

特殊情况2 HEAD落后于目标commit,执行commit——fast-forward

1.3.3 git rebase图解
HEAD 移动的过程就是切换分支的过程,在对应的develop分支上执行
git checkout feature git rebase develop

执行完上述命令后,在进行切换分支,将HEAD移动到最新的节点上
git checkout develop git merge feature1

1.3.4 git commit -m "" --amend
修改错误信息,并不是在本次提交上修改,而是生成一个新的commit,如下图所示:

1.3.4 git rebase -i
git rebase -i HEAD~2 == git rebase -i HEAD^^

执行完git rebase -i后会进入一下界面

选择要修改的commit信息,修改成对应的edit,其中每个的作用如上图示,修改完成后保存退出到下面界面。

执行代码 ,进入下图
git commit --amend

修改的对应的message信息,退出保存,继续执行以下命令,完成修改。
git rebase --continue
执行git rebase --continue的过程如以下所示。

1.3.5 git rebase --onto
从git rebase -i的作用可以得知,该命令可以删除节点,同样使用git rebase --onto同样能实现删除和撤销提交。
用法:有两个branch分支(branchA 和 branchB),需要将branchB中的某几个commit 合并到branchA中。
git rebase --onto 第3个commit 第4个commit feature1

注意:--onto 参数后面有三个附加参数:目标 commit、起点 commit(注意:rebase 的时候会把起点排除在外)、终点 commit。所以上面这行指令就会从 4 往下数,拿到 branch1 所指向的 5,然后把 5 重新提交到 3 上去。
二:HEAD master branch基本概念
执行git log 如下图所示:

第一行的commit后面的跟的是sha-1校验和,通常在使用的过程中使用前几位即可,后面括号里的 HEAD -> master, origin/master, origin/HEAD ,是几个指向这个 commit 的引用。
2.1:HEAD是什么?
答:当前commit的引用。上图的括号里是指向这个commit的引用,HEAD是指向当前commit的引用。例如上图HEAD指向master分支的最新的commit,origin/master代表的是远端的master。当前commit在哪里,HEAD就在哪里,这是一个永远自动指向当前commit的引用,所以可以永远使用HEAD来操作commit。并且HEAD是Git中一个独特的引用,他是唯一的,
2.2:BRANCH是什么?
答:git除了head的引用,还有一种branch的应用,HEAD,不仅指向commit,还可以指向分支(branch),当他指向branch的时候,会通过branch来间接的指向某个commit,当HEAD在自动提交后,他会带着所指向的branch一起向前移动。eg:

2.3:master:默认的branch
答:master是git默认的主干分支,新建仓库是没有任何commit的,但在他创建第一个commit时,会将master指向他,并且把HEAD执行master。
三:branch的创建、切换和删除
3.1 创建分支:git branch develop,创建一个develop的分支

3.2 git branch查看本地仓库所有的branch分支,绿色代表当前所在的分支
3.3 切换分只 git checkout develop或者git switch develop

在develop分支上对文件进行修改提交。

在此切换到master分支,发现develop分支上修改的内容并不存在。

执行名命令git branch -avv 查看本地分支与远端分支的映射情况,若发现不存绑定,git branch --set-upstream-to = origin/develop develop
此时在,gitee上就可以看到已经有了两个分支。

分支冲突,在下面的章节进行讲解。
分支删除,不进行学习,防止在日常工作工作中操作失误。
本章节中重点掌握的:HEAD master branch的概念,并且学会branch的创建,删除,
命令:git branch 分支名字
git branch -b 分支名字 创建分支并切换分支/git switch 分支名字 切换分支
git branch -d 分支名字 删除分支(不要用)
四:Push的本质
push做的事情,把当前branch的位置(即他指向的哪个commit)上传到远端仓库,并把他路径上的所有的commit 一并上传。
push 的时候,如果当前分支是一个本地创建的分支,需要指定远程仓库名和分支名,用 git push origin branch_name的格式,而不能只用 git push或者可以通过 git config 修改push.default 来改变 push 时的行为逻辑。
push 的时候之后上传当前分支,并不会上传 HEAD;
远程仓库的 HEAD 是永远指向默认分支(即 master)的。
五:merge pull 实操
5.1 merge的使用
使用场景,当一个branch开发完成,需要把内容合并回去,用merge进行,来使用,eg:将develop分支合并到master,即在master上:执行命令git merge develop,如下所示,下图所示,是merge的过程产生了冲突,需要解决一下冲突。

解决完成冲突后,执行git add 文件名 ,git commit 继续执行merge的操作,修改好merge的信息,继续执行。执行git status可以看到本地分支比远端多1个commit,执行git log查看那1个:


5.2 pull的使用
pull 的实际操作其实是把远端仓库的内容用 fetch 取下来之后,用 merge 来合并。
5.2.1
merge 在做合并的时候,是有一定的自动合并能力的:如果一个分支改了 A 文件,另一个分支改了 B 文件,那么合并后就是既改 A 也改 B,这个动作会自动完成;如果两个分支都改了同一个文件,但一个改的是第 1 行,另一个改的是第 2 行,那么合并后就是第 1 行和第 2 行都改,也是自动完成。
5.2.2
如果两个分支修改了同一部分内容,merge 的自动算法就搞不定了。这种情况 Git 称之为:冲突(Conflict),其中冲突的解决过程如上述步骤所示。
六 如何使用 add
在使用add 之前首先知道git的几个概念,工作区,版本库之间的关系。
工作区:就是咱们电脑项目的路径。
版本库:与工作区并列的.git隐藏文件夹,该文件夹中提供里个很重要的功能隐藏区,和当前分支信息。
通过add 将git未追踪文件或者改变文件放入暂存区。表面现象文件由红变绿。
使用git rebase ,rebase的含义,
给你的commit序列重新设置基础点(也就是commit)
有develop 和 master 两个分支,需要对master 进行变基。
切换到develop分支 git switch develop
执行变基命令: git rebase master
切回master分支,git switch master
将master移动到最新的commit ,git switch master ,git merge branch
该部分的执行图解见git执行过程图
add添加的是文件的改动,而不是文件名

3 使文件从暂存区恢复到工作区,保留更改
git restore --staged
七 修改错误提交 commit -m/rebase -i
刚刚提交代码,commit信息写错了怎么办,比如说咱们的需求号写错了,有啥补救措施吗?
7.1 amend
只在本地仓库执行了,git commit,并没有执行git push,可以通过命令 git commit -m “我是修改后的msg” --amend,进行修改:

7.2 git rebase -i
上述这种方式只能修改,最近的commit,那么我本地已经进行了3次commit提交,其中第2次需求号写错了,咋整?当然由于本地commit数量不多,可以执行 git reset --soft HEAD^,将最近的commit撤销,撤销后在执行git commit -m “修改” --amned命令。也可以完成需求,但是,我本地提交了10次commit,也让我撤销commit吗?我不愿意,可以使用git rebase -i,进行修改,同时git rebase -i命令提供多种操作,比如修改commit信息,将多个commit合并成一个comoomit等。

通过上述日志可以看到,本地提前远端两个commit,但是第一次的commit信息的需求号整错了,需要修改,执行 git rebase -i,进入一下界面,通过下面的提示,在第一次提交的时候修改pick->r,并修改后面的信息:

继续上述操作执行,我想把这两个commit合并,形成一个commit提交上去,该如何执行。同样继续使用git rebase -i命令:

通过观察,上述的修改前后的sha-1校验和可以得知,使用git commit -amend修复当前提交的错误,git commit -amend 并不是修改原commit,而是修改生成一条新的commit。
5.3 我发现我已经push到远端仓库了,想撤回,咋办?
找到提交错误提交的sha-1,执行命令git revert id,添加新的commit信息后,再次执行git push 将新的提到远端。

八:丢弃代码
我代码写错了,错的不能再错了,我想将本地的工作区的修改全部修改掉,怎么整?执行命令 git reset --hard HEAD^,,其中后面跟commit的id,恢复到指定的commit。
通过git reset 命令,后面可跟三个参数,分别是--soft(回退到某个版本,只回退了commit的信息到暂存区,本地工作空间的代码不会变),--hard(回退到指定的commit版本,并且本地工作空间的代码会丢失),--mixed(默认就是执行mixed,只回退了commit的信息到工作区,本地工作空间的代码不会变)
8.1 Reset的本质
实质上,reset 这个指令虽然可以用来撤销 commit ,但它的实质行为并不是撤销,而是移动 HEAD ,并且「捎带」上 HEAD 所指向的 branch(如果有的话)。也就是说,reset 这个指令的行为其实和它的字面意思 "reset"(重置)十分相符:它是用来重置 HEAD 以及它所指向的 branch 的位置的。而 reset --hard HEAD^ 之所以起到了撤销 commit 的效果,是因为它把 HEAD 和它所指向的 branch 一起移动到了当前 commit 的父 commit 上,从而起到了「撤销」的效果。
九:.git目录详解

1 hooks:存放一些shell脚本
2 info:存放仓库的一些信息
3 logs:存放本仓库的执行记录日志

4 object:存放git对象,一个commit就是一个git对象
5 refs:保存当前最新的一次提交的哈希值,包括head,各分支的最新commit信息
6 COMMIT_EDITMSG:最新提交的一次Commit Message,git系统不会用到,给用户一个参考
7 description:仓库的描述信息,主要给gitweb等git托管系统使用
8 config:git仓库的配置文件
9 index:暂存区(stage),一个二进制文件
10 FETCH_HEAD:是一个版本链接,指向着目前已经从远程仓库取下来的分支的末端版本
11 HEAD:映射到ref引用,能够找到下一次commit的前一次哈希值(看上面logs的图)
12 ORIG_HEAD:HEAD指针的前一个状态




