git之道----git就是一棵树和一堆指针

git之道

玩一玩那个git的通关游戏,然后总结出一套关于git的想法,属于道的范畴
https://learngitbranching.js.org/?locale=zh_CN

我眼里的git的结构

commit:组成一个树结构

Head:指针,指向commit的结点

Branch:指针,指向commit的结点

Tag :指针

origin/<branchName> :每一个远程分支,在本地都会有一个origin/<branchName> 也是一个分支

训练场拾遗

情况分析:

状态:

  • HEAD指针和branch指针在一起
  • HEAD指针和branch指针分离

悟道:其实branchName指针 和HEAD指针并无不同

只是有个special名字,好平时叫着方便,而已,总之就是在爬树就是了

我们的当前位置,就是HEAD,只有一个HEAD,这棵树上还有其他位置做了标记,用branchName做了标记,branch可以很多

下图其实是已经知道了HEAD在 main重合

简单

# easy

$ git checkout < commitID >     # 控制的实际是 HEAD指针,而且不会带着branch指针一起行动,会造成分离

$ git branch -f <branchName> <commitID>      #控制的是 branch的指针

$ git rebase <branchName>   #控制的是HEAD,但是如果HEAD和branch指针未分离,会协同,当前的分支,嫁接到另一个上,互相搞的话,会有两种情况,这个得具体看树的情况

$ git merge <branchName> # 会有两种情况,得看树的情况

$ git reset HEAD^2 

$ git revert HEAD # 可以撤销本次的提交 ,生成一次新的提交

升级

# hard

# 如果你想将一些提交复制到当前所在的位置(HEAD)下面的话, Cherry-pick 是最直接的方式了。我个人非常喜欢 cherry-pick,因为它特别简单
# Git示范 要在心里牢记 cherry-pick 可以将提交树上任何地方的提交记录取过来追加到 HEAD 上(只要不是 HEAD 上游的提交就没问题)。
$ git cherry-pick <提交号>...

# 交互式 rebase 指的是使用带参数 --interactive 的 rebase 命令, 简写为 -i
$ git rebase -i HEAD~<数字>   # 有点阴间


$ git commit --amend ""      # 可以进行当前commit的注释的修改,新的提交,同级

# 相信通过前面课程的学习你已经发现了:分支很容易被人为移动,并且当有新的提交时,它也会移动。分支很容易被改变,大部分分支还只是临时的,并且还一直在变。
#你可能会问了:有没有什么可以永远指向某个提交记录的标识呢,比如软件发布新的大版本,或者是修正一些重要的 Bug 或是增加了某些新特性,有没有比分支更好的可以永远指向这些提交的方法呢?
# 当然有了!Git 的 tag 就是干这个用的啊,它们可以(在某种程度上 —— 因为标签可以被删除后重新在另外一个位置创建同名的标签)永久地将某个特定的提交命名为里程碑,然后就可以像分支一样引用了。
# 更难得的是,它们并不会随着新的提交而移动。你也不能检出到某个标签上面进行修改提交,它就像是提交树上的一个锚点,标识了某个特定的位置。
$ git tag  V1 C1    



# 它输出的结果是这样的:<tag>_<numCommits>_g<hash>
# <ref> 可以是任何能被 Git 识别成提交记录的引用,如果你没有指定的话,Git 会以你目前所检出的位置(HEAD)。
# tag 表示的是离 ref 最近的标签, numCommits 是表示这个 ref 与 tag 相差有多少个提交记录, hash 表示的是你所给定的 ref 所表示的提交记录哈希值的前几位。
# 当 ref 提交记录上有某个标签时,则只输出标签名称
$ git Describe <ref>

# Git Describe 能帮你在提交历史中移动了多次以后找到方向;当你用 git bisect(一个查找产生 Bug 的提交记录的指令)找到某个提交记录时,或者是当你坐在你那刚刚度假回来的同事的电脑前时, 可能会用到这个命令。
$ git bisect


$ git branch -f <branchName> HEAD^2  # 如果正好处在分支点,那么,会在两个分支里面选一个

远程仓库

# github


$ git fetch 
$ git rebase o/main
$ git push


$ git pull --rebase
$ git push

$ git pull == git fetch + git merge
$ git fetch/pull/push origin <a>:<b>


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋夜白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值