git

保存的是基于上面一个节点变更的内容

每一个节点都是一个版本。

git commit:在原本的节点下添加一个新的节点,也就是更新版本,于HEAD所在的位置

git branch name: 新建一个分支,于HEAD所在的位置

git checkout name: 切换当前所在分支,但最好使用git switch name来切换

git checkout -b name: 新建分支并切换到这个分支上

git checkout -b name name1(name1是一个本地的远程分支,形式…/…): 建立一个分支并将其与name1相关联,即远程追踪

在一般情况下,建立一个本地分支后push会自动创建一个远程追踪。

每一个远程分支都只能被一个本地分支远程追踪,当我们设置了一个远程追踪,其原本对应的本地分支的远程追踪就消失了。

所有的push pull等等都是根据其远程追踪来的。可以将其看做原本对应的本地分支的替身。

另一种设置的方法是

git branch -u name1 name: 与前面相反,这里的name1是远程分支,name是本地分支。若当前在name分支下,可以省略name。但只能用于已存在的分支。而checkout版本可以新建分支。

在更改远程追踪后,原本的本地分支与远程同名分支就完全没有关系了。

如果一个节点没有远程追踪,那么它就不能pull和push。

git checkout nodehash: 将HEAD指针指向这个节点

HEAD可以当做是一个隐形的分支,在一般情况是指向当前所在分支所指向的节点。

当checkout一个nodehash的时候会把HEAD显式化,但是若是切回普通分支,其会隐式,并且回到当前分支所指向的节点。

当使用另一个分支commit的时候就会创建出第二条通路出来。

在分支名字后加修饰符可以表示将其移动几格的一个临时变量。

^:往父节点一个,几个^就是往会几个

如果在^后加数字,是在当前节点有多个父节点的情况下指定哪一个父节点(如果进行了合并操作),其顺序与合并的顺序相同

~num:往父节点num个节点

这两种操作运算符可以链式使用,如~2^^2~

git reset 位置:将当前分支指向目标位置,但是这个位置必须是已经存在的节点(不能在分离HEAD使用)

这里的位置既可以是hashnode,也可以是相对位置,也可以是分支

git revert 位置:在当前节点(HEAD)后创建一个节点,这个节点所做的改变操作将会使得原本的节点变为“位置”节点。并将当前分支指向这个新的节点。

git merge name:在本分支(HEAD)后新建一个节点,其内容将会融合本分支和name分支,同时这原本的两个分支所指向的节点都会成为该节点的父节点,不再是两个分支了,虽然“分支”还是分支。被merge的分支仍然会指向原本的节点。

merge只能merge两个不同的分支(这里的分支是指两条路上的,而非我们所创建的“分支”指针)的,若是相同分支,这当前节点会指向自己和被merge分支中版本更新的那个。

git rebase name (name1): 找到当前分支(好像不能使HEAD)/(name1)与name的共同父节点,将自身所进行的更改在name上重新操作一遍,也是一种merge,不过把原本并行的操作变成了线性的,name分支仍然将指向原本的节点。但是其后面会加上对应的另一个并行分支所进行改变的所有节点,当前分支将指向最后一个节点。

若处于同一分支下,则将进行与merge一样的操作。

git branch -f name 位置: 将name分支指向位置

git cherry-pick 位置:这里的位置可以有多个位置,用空格隔开,将这些位置节点所做的操作一一做到当前分支(实际上是HEAD)下。这里的位置不能是本分支(非指针)下的。如git cherry-pick C1 C2 …

git rebase -i 位置:将当前分支(HEAD)所在分支(非指针)中位置没有操作的版本变化会显示一个文本文档,依次排序,可以重新调整顺序,删减节点,将里面最终的内容,也就是节点内容按顺序rebase到位置节点后,提供一个将所有节点改变merge成一个新的节点的选项,指向最后的节点。

在这种情况下,可以位置可以是自己分支上的(因为可能重排顺序,即便并没有变化)

git commit —amend: 在当前节点(HEAD)的父节点创建一个新节点表示新的修改,并将当前分支指向这个新节点,相当于是修改上一次的更新

git tag name 位置:给某个节点加上一个永久性的tag,虽然可以删除,但不能被移动,一般用来记录重大的里程碑。

当不写位置时,会将位置默认为HEAD。

git describe:对于当前节点(HEAD)会在它所在的路径上往上寻找最近的有tag的节点。

输出tag_距离_g<当前节点的hash>

如果当前节点有tag,这只输出当前节点的tag。

git clone(同时会把HEAD也clone): 将远程仓库拷贝到本地

但不能push HEAD,因为它不是一个分支。

在clone完后,会产生两张图,一张表示远程的,一张表示本地的,而在远程的每一个对应分支所对应的本地分支所指向的节点上,会产生一个新的远程分支,名字是repo name/branch name,如origin/main。由于这个分支是“远程”的,因此不能直接对它进行操作。当switch到某个远程分支的时候,会直接在那个远程分支处分离出HEAD,后续操作都是对HEAD进行的操作。另外,当在本地图上作操作时并不会在远程图上做操作。

git fetch:从远程仓库更新本地仓库。总共有两步操作,一个是补上所有缺失的节点,二是更新所有本地图上的远程分支,使其余远程仓库一致。

但git fetch并没有对本地图的分支作任何更改。

当本地图的节点多于远程库的节点,其本地图有的节点也仍然会在,而本地图中没有的,远程图中的也会复制过来(因为节点的名称是不同的)

git pull=git fetch;git merge

git push:当没有参数时会与push.default中的配置相关

将本地图同步到远程图,并且更新远程图中分支节点与本地图中的远程分支节点。

当远程图中的版本与本地图中的不同(其他的所有分支,只允许当前push的分支与远程不同),会不允许git push,必须先git fetch完之后才能git push。

在fetch后可以通过rebase或者merge来将我们所做的操作做到最新的分支上。

git pull —rebase=git pull;git rebase 当前分支对应的远程分支

对于某一个分支进行pull实际上是fetch其对应远程分支上的路径并merge。

但fetch是fetch所有分支。

push的时候好像并不会将废弃的分支进行上传,好像是实际上只push当前分支所在路径上所做的一切更改。

有的时候远程仓库可能会锁定某个分支,不允许对于这个分支进行push。这个时候我们可以将main reset与远程仓库相同,然后新建一个分支,指向我们所做的更改,让后基于这个分支进行push

当远程库中存在没有使用的版本,这个会不会fetch过来。好像远程仓库中不会存在没有使用的版本

关于rebase于merge。merge能够保存所有版本的历史,条理更加清晰。而rebase会使提交树更加干净。

git push :remote是仓库名,而place是指本地分支的名字,若是省略,则默认为当前分支。其会根据place在remote中的远程追踪?来更新。

git push ::place1是本地分支,place2是远程图上的分支(不是本地图上的远程分支),意思是将本地分支中远程分支中没有的部分push到远程分支中。

git fetch ::place1是指远程分支,place2是本地图上的分支,意思是将远程分支中本地分支中没有的部分fetch到本地分支上。

以上两种操作都可以看作是嫁接。

当以上两种操作的place1为空时,push会删除远程图上的place2分支,本地对应的远程分支也会被删除,fetch会创建一个place2分支

git pull也有参数,与fetch相同,作用就是fetch然后merge。


git
https://lhish.github.io/project/git/
作者
lhy
发布于
2024年6月30日
许可协议