• Learning Git Branch 题解(基础、高级、Git远程仓库)


    官网:Learning Git Branch

    主要

    基础篇

    Git Commit

    在这里插入图片描述
    在当前节点是main的时候

    git commit
    git commit
    
    • 1
    • 2

    Git Branch

    git branch bugFix
    
    • 1

    在这里插入图片描述

    git checkout bugFix
    
    • 1

    过关!

    Git Merge

    在这里插入图片描述

    git branch bugFix;
    git commit
    git checkout main
    git commit
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    git merge bugFix
    
    • 1

    这条指令会让指定分支合并到当前分支(新开一个节点)
    在这里插入图片描述

    Git Rebase

    在这里插入图片描述
    根据之前的操作,可以很容易到达此阶段
    接下来

    git rebase main
    
    • 1

    在这里插入图片描述

    高级篇

    分离 HEAD

    HEAD 是一个对当前检出记录的符号引用 —— 也就是指向你正在其基础上进行工作的提交记录。大多数修改提交树的 Git 命令都是从改变 HEAD 的指向开始的。
    如果想看 HEAD 指向,可以通过 cat .git/HEAD 查看, 如果 HEAD 指向的是一个引用,还可以用 git symbolic-ref HEAD 查看它的指向。
    分离的 HEAD 就是让其指向了某个具体的提交记录而不是分支名。HEAD 总是指向当前分支上最近一次提交记录。
    在这里插入图片描述

    git checkout C4
    
    • 1

    在这里插入图片描述

    相对引用(^)

    利用hash值很不方便(虽然只需要输入前几位)
    使用相对位置,^可以向上移动一个提交记录,^^就是两个
    在这里插入图片描述

    git checkout C4^
    
    • 1

    在这里插入图片描述

    相对引用2(~)

    ~<num> 可以向上移动num个提交记录
    例如:

    git branch -f main HEAD~3
    
    • 1

    这种是强制main指向HEAD向上第三个节点
    在这里插入图片描述
    C6需要有(最底部的无法用^和~),所以先分离HEAD到C6

    git checkout C6
    
    • 1

    在这里插入图片描述
    接下来就是置换位置了

    git branch -f main HEAD
    git checkout C1
    git branch -f bugFix HEAD~1
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    撤销变更

    • git reset 通过把分支记录回退几个提交记录来实现撤销改动。你可以将这想象成“改写历史”。git reset 向上移动分支,原来指向的提交记录就跟从来没有提交过一样。本地代码库根本就不知道有原先的提交。这种对于远程分支是无效的。
    • git revert,撤销更改并分享给别人。新提交记录有个’号,代表引入了更改,这些更改刚好是用来撤销上个提交的。这种是为远程分支服务的。

    在这里插入图片描述

    git reset main
    
    • 1

    在这里插入图片描述

    git checkout pushed
    git revert C2
    
    • 1
    • 2

    在这里插入图片描述

    远程

    Push & Pull —— Git 远程仓库!

    Git Clone

    在这里插入图片描述

    git clone
    
    • 1

    在这里插入图片描述

    远程分支

    git clone之后,我们的本地仓库多了一个名为 o/main 的分支, 这种类型的分支就叫远程分支。远程分支反映了远程仓库(在你上次和它通信时)的状态。在你检出时自动进入分离 HEAD 状态
    <remote name(远程仓库名)>/<branch name(分支名)>
    远程仓库名默认是:origin(git clone某个仓库时,自动将远程仓库的名称设置为 origin)
    在这里插入图片描述

    git commit
    git checkout o/main
    git commit
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    最后一次commit的时候,HEAD分离出来了。o/main 只有在远程仓库中相应的分支更新了以后才会更新。

    Git Fetch

    fetch:获取
    git fetch 完成了仅有的但是很重要的两步:

    • 从远程仓库下载本地仓库中缺失的提交记录
    • 更新远程分支指针(如 o/main)

    远程分支反映了远程仓库在你最后一次与它通信时的状态,git fetch 就是你与远程仓库通信的方式了。git fetch 通常通过互联网(使用 http:// 或 git:// 协议) 与远程仓库通信。
    git fetch 并不会改变你本地仓库的状态。它不会更新你的 main 分支,也不会修改你磁盘上的文件。可以将 git fetch 的理解为单纯的下载操作(并没有修改你本地的文件)。
    在这里插入图片描述

    git fetch
    
    • 1

    在这里插入图片描述
    全部自动下载

    Git Pull

    先抓取更新再合并到本地分支这个流程很常用,直接用git pull就可以。git pull 就是 git fetch 和 git merge 的缩写!
    在这里插入图片描述

    git pull
    
    • 1

    在这里插入图片描述

    模拟团队合作

    团队的协作会让远程仓库发生变化
    这里给出假指令:

    git fakeTeamwork <branch_name> <num> 
    
    • 1

    在这里插入图片描述

    git clone
    
    • 1

    在这里插入图片描述

    git fakeTeamwork main 2
    
    • 1

    在这里插入图片描述
    这时候你要和团队跟进进度

    git fetch
    git commit
    git merge o/main
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    虽然也可以,但是指令数太多,可以将fetch和merge合并为pull

    git fetch
    git pull
    
    • 1
    • 2

    Git Push

    git push 与 git pull相反,是一种成果的发布
    变更上传到指定的远程仓库,并在远程仓库上合并新提交记录
    git push 不带任何参数时的行为与 Git 的一个名为 push.default 的配置有关。它的默认值取决于你正使用的 Git 的版本
    在这里插入图片描述

    git commit
    git commit
    git push
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    偏离的提交历史

    在你提交之前别人就已经提交了,这时候要使工作基于最新的远程分支。有许多方法做到这一点

    • 最直接的方法就是通过 rebase 调整工作,用 rebase 可以将我们的工作移动到最新的提交记录下。(git fetch + git rebase + git push)
    • 更新了本地仓库中的远程分支,然后合并了新变更到我们的本地分支(为了包含远程仓库的变更),最后我们用 git push 把工作推送到远程仓库。 (git fetch + git merge + git push)

    如果指令多,可以用 git pull(就是 fetch 和 merge 的简写),类似的 git pull --rebase 就是 fetch 和 rebase 的简写。
    所以两种方案就变成了:

    • git pull --rebase + git push
    • git pull + git push

    在这里插入图片描述

    git clone
    
    • 1

    在这里插入图片描述

    git fakeTeamwork
    git commit
    
    • 1
    • 2

    在这里插入图片描述

    这就到了一个两难的境地。(偏离的提交历史)

    git pull --rebase
    git push
    
    • 1
    • 2

    在这里插入图片描述

    锁定的Main(Locked Main)

    push之后报错

    ! [远程服务器拒绝] main -> main (TF402455: 不允许推送(push)这个分支; 你必须使用pull request来更新这个分支.)
    
    • 1

    原因是main是团队锁定了,应该按照流程,新建一个分支,推送(push)这个分支并申请pull request。
    新建一个分支feature,推送到远程服务器,然后reset你的main分支和远程服务器保持一致,否则下次你pull并且他人的提交和你冲突的时候就会有问题。
    在这里插入图片描述

    git reset --hard o/main
    
    • 1

    –hard是直接指定
    我们也可以用

    git reset HEAD^
    
    • 1

    在这里插入图片描述

    git checkout -b feature C2
    
    • 1

    -b 参数是创建并切换分支,刚好把C2这个引用(也就是我们之前修改但是不能提交的代码)重新使用起来。
    在这里插入图片描述

    git push origin feature
    
    • 1

    简单点就是

    git push
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    Spring Boot整合Redis缓存的最佳实践
    10个让您震撼的Linux终端命令集合
    JDK1.5后增加了泛型,那么为什么要有泛型呢?我们该如何自定义泛型结构呢?
    『LeetCode|每日一题』---->粉刷房子
    机器视觉光源案例锦集(一)
    springboot + solr
    Python代码的编写运行方式简介
    integrin + Receptor ; platelet ; Ig-CAM
    JUC并发编程--------基础篇
    最详细的CompletableFuture使用详解,附上代码示例
  • 原文地址:https://blog.csdn.net/GDUT_xin/article/details/125537967