Git入门到高级篇,一文读懂git进阶操作处理复杂分支场景

本文为原创转载请经过作者同意

前言:这里将简短的介绍的是git的基本原理以及一些高级特性,不对git原理进行深入解析,希望阅读完本文后的你对Git有重新的认识。

本地仓库与远程仓库 、本地分支与远程分支

Git入门到高级篇,一文读懂git进阶操作处理复杂分支场景_第1张图片


HEAD 、 Revison Number 、 HEAD分离 的概念

 HEAD 是一个对当前记录节点的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录,它总是指向当前分支上最近一次提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。通俗一点讲代表着基于哪一个节点上进行提交,HEAD默认是指向当前所处的“分支名”的而”分支名“默认指向了当前分支记录链中最近的一次修改的记录节点,例如上图中的C3,所以你提交后生成新的记录节点是基于C3的。然后HEAD会跟着指向C4,当前前提是HEAD未分离的情况下是这样。

Revision Number 每一次提交都会生成一个记录节点的id,通过Revision Number可以定位某一个记录节点

HEAD分离 分离 HEAD 就是让其指向了某个具体的提交记录(通过Revision Number)而不再是分支名(因为分支名用于代表着这条分支记录链在未分离HEAD情况下最近的一次记录节点)。分离HEAD的目的是为了让你在分支中灵活”行走“。

Git入门到高级篇,一文读懂git进阶操作处理复杂分支场景_第2张图片


远程跟踪

        直接了当地讲,main 和 o/main 的关联关系就是由分支的“remote tracking”属性决定的。main 被设定为跟踪 o/main —— 这意味着为 main 分支指定了推送的目的地以及拉取后合并的目标。你可能想知道 main 分支上这个属性是怎么被设定的,你并没有用任何命令指定过这个属性!好吧, 当你克隆仓库的时候, Git 就自动帮你把这个属性设置好了。

当你克隆时, Git 会为远程仓库中的每个分支在本地仓库中创建一个远程分支信息(比如 o/main)。然后再通过远程Git仓库中指定的默认分支创建一个本地分支并立即追踪远程分支,默认情况下这个本地分支会被命名为 main。克隆完成后,你会得到一个本地分支(如果没有这个本地分支的话,你的目录就是“空白”的),但是可以查看远程仓库中所有的分支(如果你好奇心很强的话)。这样做对于本地仓库和远程仓库来说,都是最佳选择。

这也解释了为什么会在克隆的时候会看到下面的输出:local branch "main" set to track remote branch "o/main"


Git命令

git merge <要合并过来的分支>

将某个目标分支合并到当前分支,并产生一条记录,这条记录就是当前记录和合并过来的记录的合并结果

git rebase <目标分支>

第二种合并分支的方法是 git rebase。Rebase 实际上就是取出一系列的提交记录,“复制”它们,然后在另外一个地方追加下去。Rebase 的优势就是可以创造更线性的提交历史

git reset

这里命令语法有多种不作介绍,回退本地提交记录,git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。向上移动分支后,原来指向的提交记录就跟从来没有提交过一样。

git cherry-pick

任意选中其他分支的提交记录,追加到当前记录之后。RevisionNumbe可写多个空格隔开,代表把这些记录节点抓过来放到当前记录节点下

git rebase -i

交互式rebase,用于选中某些分支,调整提交顺序,或者删除选中项,最终将选中的成为新的提交记录,同时丢弃选中的所有提交记录

git fetch

将远程仓库最新的分支记录(注意这里是远程分支),同步至本地仓库,注:git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你的项目文件。可以理解为尽下载最新的远程分支

git stash

如果某天你正在修补bug,此时需要切换到其他分支上进行工作,会由于当前记录未提交提示你保持干净的工作区后才能切换分支,这时候可以使用git stash命令将当前缓冲区的修改暂存起来,然后就可以切换分支了

git stash pop

将刚刚暂存栈的修改,弹出应用到当前工作空间,然后删除这个暂存记录

git stash apply

将刚刚暂存栈的修改,弹出应用到当前工作空间,但不删除,这意味着你可以跑到别的分支上到处应用这个修改

git checkout

分离HEAD,将HEAD指向记录节点,此后的提交会脱离分支正轨,产生分叉的记录节点

git pull

git pull 就是 git fetch 和 git merge 的缩写

git push

不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关。它的默认值取决于你正使用的 Git 的版本,这没什么太大的影响,但是在你的项目中进行推送之前,最好检查一下这个配置。

git tag <标签名>

它们可以(在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签)永久地将某个特定的提交命名为里程碑,然后就可以像分支一样引用了。

更难得的是,它们并不会随着新的提交而移动。你也不能切换到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。

cat .git/HEAD

查看HEAD的指向,如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向

git checkout -b <新分支名> <要追踪的远程分支>

新建分支并追踪远程分支

git branch -u <要追踪的远程分支> <本地分支(当前分支可忽略)>

指定某个分支追踪远程分支

你可能感兴趣的:(Git,git)